[Joafip-svn] SF.net SVN: joafip:[3053] trunk
Brought to you by:
luc_peuvrier
|
From: <luc...@us...> - 2012-05-01 07:39:12
|
Revision: 3053
http://joafip.svn.sourceforge.net/joafip/?rev=3053&view=rev
Author: luc_peuvrier
Date: 2012-05-01 07:39:04 +0000 (Tue, 01 May 2012)
Log Message:
-----------
WIP btree plus: tests OK : WIP check and optimization
Modified Paths:
--------------
trunk/joafip-4test/pom.xml
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractPerfService.java
trunk/joafip-4test/src/main/resources/log4j.properties
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/AbstractElement.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/DataBlockPage.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/FreePage.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/HeaderPage.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/LeafPage.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/NonTerminalPage.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/PageRecord.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusDataManager.java
trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusElementMgr.java
trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/LeafPageTest.java
trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/NonTerminalPageTest.java
Added Paths:
-----------
trunk/joafip-4test/jrat.xml
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractDeleter.java
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/CreateDeleteList.java
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/DeleterBtreePlus.java
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/InserterBtreePlus.java
trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/SearcherBtreePlus.java
Property Changed:
----------------
trunk/joafip-4test/
Property changes on: trunk/joafip-4test
___________________________________________________________________
Modified: svn:ignore
- target
.settings
.classpath
.project
runtime
logs
.pmd
lib
runtime_perf
+ target
.settings
.classpath
.project
runtime
logs
.pmd
lib
runtime_perf
jrat.output
Added: trunk/joafip-4test/jrat.xml
===================================================================
--- trunk/joafip-4test/jrat.xml (rev 0)
+++ trunk/joafip-4test/jrat.xml 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jrat>
+ <settings>
+ <property name="httpServerEnabled" value="false"/>
+ </settings>
+
+ <profile name="my code">
+
+ <criteria>
+ <include/>
+ </criteria>
+
+ <handlers>
+
+ <handler factory="org.shiftone.jrat.provider.tree.TreeMethodHandlerFactory">
+ <property name="outputFile" value="joafip.jrat"/>
+ </handler>
+
+ </handlers>
+
+ </profile>
+</jrat>
\ No newline at end of file
Modified: trunk/joafip-4test/pom.xml
===================================================================
--- trunk/joafip-4test/pom.xml 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-4test/pom.xml 2012-05-01 07:39:04 UTC (rev 3053)
@@ -51,6 +51,12 @@
<dependency>
<groupId>net.sf.joafip</groupId>
+ <artifactId>joafip-btreeplus</artifactId>
+ <version>4.0.0b8</version>
+ </dependency>
+
+ <dependency>
+ <groupId>net.sf.joafip</groupId>
<artifactId>joafip-rbtree</artifactId>
<version>4.0.0b8</version>
</dependency>
Added: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractDeleter.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractDeleter.java (rev 0)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractDeleter.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2012 Luc Peuvrier
+ * All rights reserved.
+ *
+ * This file is a part of JOAFIP.
+ *
+ * JOAFIP is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * JOAFIP is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.joafip.performance.items.service;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import net.sf.joafip.entity.EnumFilePersistenceCloseAction;
+import net.sf.joafip.kvstore.service.IHeapDataManager;
+import net.sf.joafip.performance.items.entity.Item;
+import net.sf.joafip.performance.items.entity.ItemList;
+import net.sf.joafip.service.FilePersistenceClassNotFoundException;
+import net.sf.joafip.service.FilePersistenceDataCorruptedException;
+import net.sf.joafip.service.FilePersistenceException;
+import net.sf.joafip.service.FilePersistenceInvalidClassException;
+import net.sf.joafip.service.FilePersistenceNotSerializableException;
+import net.sf.joafip.service.FilePersistenceTooBigForSerializationException;
+import net.sf.joafip.service.IDataAccessSession;
+import net.sf.joafip.store.service.StoreClassNotFoundException;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class AbstractDeleter extends AbstractPerfService {
+
+ public AbstractDeleter(final IHeapDataManager dataManager)
+ throws FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, FilePersistenceException,
+ FilePersistenceTooBigForSerializationException {
+ super(dataManager);
+ }
+
+ public AbstractDeleter(final String pathName)
+ throws FilePersistenceException,
+ FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, StoreClassNotFoundException,
+ FilePersistenceTooBigForSerializationException {
+ super(pathName);
+ }
+
+ protected void run() throws FilePersistenceException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceInvalidClassException,
+ FilePersistenceDataCorruptedException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceTooBigForSerializationException, IOException {
+ final IDataAccessSession session = filePersistence
+ .createDataAccessSession();
+ session.open();
+ int batchCount = 0;
+ int count = 0;
+ BufferedReader reader = new BufferedReader(new FileReader(
+ "runtime_perf/toDelete.txt"));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ final int identifier = Integer.parseInt(line);
+ final ItemList itemList = getItemList(session);
+ final Item item = itemList.removeItem(identifier);
+ if (item == null) {
+ throw new FilePersistenceException("must found #" + identifier
+ + " to be deleted");
+ }
+ if (++count == BATCH_SIZE) {
+ count = 0;
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+ session.open();
+ ++batchCount;
+ logger.info("delete batch #" + batchCount);
+ }
+ }
+ reader.close();
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+
+ session.open();
+ batchCount = 0;
+ count = 0;
+ reader = new BufferedReader(new FileReader("runtime_perf/toSearch.txt"));
+ while ((line = reader.readLine()) != null) {
+ final int identifier = Integer.parseInt(line);
+ final ItemList itemList = getItemList(session);
+ Item item = itemList.get(identifier);
+ if (item == null) {
+ throw new FilePersistenceException("must found #" + identifier
+ + " because not deleted");
+ }
+ if (++count == BATCH_SIZE) {
+ count = 0;
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+ session.open();
+ ++batchCount;
+ logger.info("search batch #" + batchCount);
+ }
+ }
+ reader.close();
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+
+ session.open();
+ batchCount = 0;
+ count = 0;
+ reader = new BufferedReader(new FileReader("runtime_perf/toDelete.txt"));
+ while ((line = reader.readLine()) != null) {
+ final int identifier = Integer.parseInt(line);
+ final ItemList itemList = getItemList(session);
+ final Item item = itemList.getItem(identifier);
+ if (item != null) {
+ throw new FilePersistenceException("must not found #"
+ + identifier + " because deleted");
+ }
+ if (++count == BATCH_SIZE) {
+ count = 0;
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+ session.open();
+ ++batchCount;
+ logger.info("search deleted batch #" + batchCount);
+ }
+ }
+ reader.close();
+ session.close(EnumFilePersistenceCloseAction.SAVE);
+ }
+}
Modified: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractPerfService.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractPerfService.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/AbstractPerfService.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -53,15 +53,15 @@
protected static final int BATCH_SIZE = 1000;
- protected static final int NUMBER_OF_ITEM = 1000000;
+ public static final int NUMBER_OF_ITEM = 1000000;
- private static final boolean CRASH_SAFE_MODE = false;
+ protected static final boolean CRASH_SAFE_MODE = false;
private static final boolean GARBAGE = false;
protected static final boolean FILE_CACHE = true;
- private static final int PAGE_SIZE = 4 * 1024;
+ protected static final int PAGE_SIZE = 4 * 1024;
protected static final int NUMBER_OF_PAGE = 4 * 1024;
Added: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/CreateDeleteList.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/CreateDeleteList.java (rev 0)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/CreateDeleteList.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012 Luc Peuvrier
+ * All rights reserved.
+ *
+ * This file is a part of JOAFIP.
+ *
+ * JOAFIP is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * JOAFIP is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.joafip.performance.items.service;
+
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Random;
+
+import net.sf.joafip.java.util.PTreeList;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class CreateDeleteList {
+
+ public static void main(String[] args) {
+ try {
+ final List<Integer> list = new PTreeList<Integer>();
+ for (int identifier = 0; identifier < AbstractPerfService.NUMBER_OF_ITEM; identifier++) {
+ list.add(identifier);
+ }
+ PrintWriter writer = new PrintWriter("runtime_perf/toDelete.txt");
+ final Random random = new Random(System.currentTimeMillis());
+ for (int count = 0; count < AbstractPerfService.NUMBER_OF_ITEM / 2; count++) {
+ final int upperBound = list.size();
+ final int index = random.nextInt(upperBound);
+ int identifier = list.remove(index);
+ writer.println(identifier);
+ }
+ writer.close();
+ writer = new PrintWriter("runtime_perf/toSearch.txt");
+ for (int identifier : list) {
+ writer.println(identifier);
+ }
+ writer.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
Added: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/DeleterBtreePlus.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/DeleterBtreePlus.java (rev 0)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/DeleterBtreePlus.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2012 Luc Peuvrier
+ * All rights reserved.
+ *
+ * This file is a part of JOAFIP.
+ *
+ * JOAFIP is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License.
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * JOAFIP is distributed in the hope that it will be useful, but
+ * unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.joafip.performance.items.service;
+
+import java.io.File;
+
+import net.sf.joafip.btreeplus.service.BtreePlusDataManager;
+import net.sf.joafip.kvstore.entity.HeapFileSetup;
+import net.sf.joafip.kvstore.service.IHeapDataManager;
+import net.sf.joafip.logger.JoafipLogger;
+import net.sf.joafip.service.FilePersistenceClassNotFoundException;
+import net.sf.joafip.service.FilePersistenceDataCorruptedException;
+import net.sf.joafip.service.FilePersistenceException;
+import net.sf.joafip.service.FilePersistenceInvalidClassException;
+import net.sf.joafip.service.FilePersistenceNotSerializableException;
+import net.sf.joafip.service.FilePersistenceTooBigForSerializationException;
+import net.sf.joafip.store.service.StoreClassNotFoundException;
+
+/**
+ *
+ * @author luc peuvrier
+ *
+ */
+public class DeleterBtreePlus extends AbstractDeleter {
+
+ private final static JoafipLogger LOGGER = JoafipLogger
+ .getLogger(DeleterBtreePlus.class);
+
+ public DeleterBtreePlus(final IHeapDataManager dataManager)
+ throws FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, FilePersistenceException,
+ FilePersistenceTooBigForSerializationException {
+ super(dataManager);
+ }
+
+ public DeleterBtreePlus(final String pathName)
+ throws FilePersistenceException,
+ FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, StoreClassNotFoundException,
+ FilePersistenceTooBigForSerializationException {
+ super(pathName);
+ }
+
+ public static void main(final String[] args) {
+ final String dataFilePath = RUNTIME_DIR + "/block.data";
+ final File dataFile = new File(dataFilePath);
+ DeleterBtreePlus deleter;
+ try {
+ final HeapFileSetup setup = new HeapFileSetup(dataFile,
+ CRASH_SAFE_MODE/* crashSafeMode */,
+ false/* FILE_CACHE *//* useCacheMode */,
+ false/* deleteRenaming */, false/* clearResizeFile */,
+ 0/* maxFileOperationRetry */,
+ 0/* fileOperationRetryMsDelay */, null/* openFileTraceFile */);
+ // if (FILE_CACHE) {
+ // setup.cacheSetup(PAGE_SIZE, NUMBER_OF_PAGE);
+ // }
+ final IHeapDataManager dataManager =
+ /**/new BtreePlusDataManager(setup);
+ deleter = new DeleterBtreePlus(dataManager);
+ deleter.run();
+ } catch (final Throwable throwable) {// NOPMD catch all
+ LOGGER.fatal("error", throwable);
+ }
+ }
+}
Added: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/InserterBtreePlus.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/InserterBtreePlus.java (rev 0)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/InserterBtreePlus.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2011 Luc Peuvrier
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.joafip.performance.items.service;//NOPMD
+
+import java.io.File;
+
+import net.sf.joafip.NotStorableClass;
+import net.sf.joafip.StorableAccess;
+import net.sf.joafip.btreeplus.service.BtreePlusDataManager;
+import net.sf.joafip.kvstore.entity.HeapFileSetup;
+import net.sf.joafip.kvstore.service.IHeapDataManager;
+import net.sf.joafip.logger.JoafipLogger;
+import net.sf.joafip.service.FilePersistenceClassNotFoundException;
+import net.sf.joafip.service.FilePersistenceDataCorruptedException;
+import net.sf.joafip.service.FilePersistenceException;
+import net.sf.joafip.service.FilePersistenceInvalidClassException;
+import net.sf.joafip.service.FilePersistenceNotSerializableException;
+import net.sf.joafip.service.FilePersistenceTooBigForSerializationException;
+import net.sf.joafip.store.service.StoreClassNotFoundException;
+
+@SuppressWarnings("PMD")
+@NotStorableClass
+@StorableAccess
+public final class InserterBtreePlus extends AbstractInserter {
+
+ private static final JoafipLogger LOGGER = JoafipLogger
+ .getLogger(InserterBtreePlus.class);
+
+ private InserterBtreePlus(final String pathName)
+ throws FilePersistenceException,
+ FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, StoreClassNotFoundException,
+ FilePersistenceTooBigForSerializationException {
+ super(pathName);
+ }
+
+ private InserterBtreePlus(final IHeapDataManager dataManager)
+ throws FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, FilePersistenceException,
+ FilePersistenceTooBigForSerializationException {
+ super(dataManager);
+ }
+
+ public static void main(final String[] args) {
+ /* remove existing data */
+ final File dataDirectory = new File(RUNTIME_DIR);
+ for (final File file : dataDirectory.listFiles()) {
+ file.delete();
+ }
+ dataDirectory.mkdirs();
+ final String dataFilePath = RUNTIME_DIR + "/block.data";
+ /* remove existing data */
+ final File dataFile = new File(dataFilePath);
+ dataFile.delete();
+ InserterBtreePlus inserter;
+ try {
+ final HeapFileSetup setup = new HeapFileSetup(dataFile,
+ CRASH_SAFE_MODE/* crashSafeMode */,
+ false/* FILE_CACHE *//* useCacheMode */,
+ false/* deleteRenaming */, false/* clearResizeFile */,
+ 0/* maxFileOperationRetry */,
+ 0/* fileOperationRetryMsDelay */, null/* openFileTraceFile */);
+ // if (FILE_CACHE) {
+ // setup.cacheSetup(PAGE_SIZE, NUMBER_OF_PAGE);
+ // }
+ final IHeapDataManager dataManager =
+ /**/new BtreePlusDataManager(setup);
+ inserter = new InserterBtreePlus(dataManager);
+ inserter.run(NUMBER_OF_ITEM);
+ inserter.close();
+ } catch (final Throwable throwable) {// NOPMD catch all
+ LOGGER.fatal("error", throwable);
+ }
+ }
+}
Added: trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/SearcherBtreePlus.java
===================================================================
--- trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/SearcherBtreePlus.java (rev 0)
+++ trunk/joafip-4test/src/main/java/net/sf/joafip/performance/items/service/SearcherBtreePlus.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2007 Luc Peuvrier
+ *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE
+ * Licensed under the LGPL License, Version 3, 29 June 2007 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.sf.joafip.performance.items.service;
+
+import java.io.File;
+
+import net.sf.joafip.NotStorableClass;
+import net.sf.joafip.StorableAccess;
+import net.sf.joafip.btreeplus.service.BtreePlusDataManager;
+import net.sf.joafip.kvstore.entity.HeapFileSetup;
+import net.sf.joafip.kvstore.service.IHeapDataManager;
+import net.sf.joafip.logger.JoafipLogger;
+import net.sf.joafip.service.FilePersistenceClassNotFoundException;
+import net.sf.joafip.service.FilePersistenceDataCorruptedException;
+import net.sf.joafip.service.FilePersistenceException;
+import net.sf.joafip.service.FilePersistenceInvalidClassException;
+import net.sf.joafip.service.FilePersistenceNotSerializableException;
+import net.sf.joafip.service.FilePersistenceTooBigForSerializationException;
+import net.sf.joafip.store.service.StoreClassNotFoundException;
+
+@NotStorableClass
+@StorableAccess
+public class SearcherBtreePlus extends AbstractSearcher {
+
+ private static final JoafipLogger LOGGER = JoafipLogger
+ .getLogger(SearcherBtreePlus.class);
+
+ public SearcherBtreePlus(final String pathName)
+ throws FilePersistenceException,
+ FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, StoreClassNotFoundException,
+ FilePersistenceTooBigForSerializationException {
+ super(pathName);
+ }
+
+ public SearcherBtreePlus(final IHeapDataManager dataManager)
+ throws FilePersistenceInvalidClassException,
+ FilePersistenceNotSerializableException,
+ FilePersistenceClassNotFoundException,
+ FilePersistenceDataCorruptedException, FilePersistenceException,
+ FilePersistenceTooBigForSerializationException {
+ super(dataManager);
+ }
+
+ public static void main(final String[] args) {
+ final String dataFilePath = RUNTIME_DIR + "/block.data";
+ final File dataFile = new File(dataFilePath);
+ SearcherBtreePlus searcher;
+ try {
+ final HeapFileSetup setup = new HeapFileSetup(dataFile,
+ CRASH_SAFE_MODE/* crashSafeMode */,
+ false/* FILE_CACHE *//* useCacheMode */,
+ false/* deleteRenaming */, false/* clearResizeFile */,
+ 0/* maxFileOperationRetry */,
+ 0/* fileOperationRetryMsDelay */, null/* openFileTraceFile */);
+ // if (FILE_CACHE) {
+ // setup.cacheSetup(PAGE_SIZE, NUMBER_OF_PAGE);
+ // }
+ final IHeapDataManager dataManager =
+ /**/new BtreePlusDataManager(setup);
+ searcher = new SearcherBtreePlus(dataManager);
+ searcher.run();
+ } catch (final Throwable throwable) {// NOPMD catch all
+ LOGGER.fatal("error", throwable);
+ }
+ }
+}
Modified: trunk/joafip-4test/src/main/resources/log4j.properties
===================================================================
--- trunk/joafip-4test/src/main/resources/log4j.properties 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-4test/src/main/resources/log4j.properties 2012-05-01 07:39:04 UTC (rev 3053)
@@ -130,11 +130,16 @@
log4j.logger.net.sf.joafip.performance.items.service.InserterBKM=info
log4j.logger.net.sf.joafip.performance.items.service.InserterJdbm=info
log4j.logger.net.sf.joafip.performance.items.service.InserterBabuDB=info
+log4j.logger.net.sf.joafip.performance.items.service.InserterBtreePlus=info
log4j.logger.net.sf.joafip.performance.items.service.Searcher=info
log4j.logger.net.sf.joafip.performance.items.service.SearcherBKM=info
log4j.logger.net.sf.joafip.performance.items.service.SearcherJdbm=info
log4j.logger.net.sf.joafip.performance.items.service.ImportSearcher=info
+log4j.logger.net.sf.joafip.performance.items.service.SearcherBtreePlus=info
+
+log4j.logger.net.sf.joafip.performance.items.service.DeleterBtreePlus=info
+
log4j.logger.net.sf.joafip.service.MainCrash=info
log4j.logger.net.sf.joafip.service.MainAfterCrash=info
log4j.logger.net.sf.joafip.service.MainWarnDataRecord1=debug
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/AbstractElement.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/AbstractElement.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/AbstractElement.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -66,6 +66,10 @@
return pageRecord.getPositionInFile();
}
+ public long getPreviousRecordPositionInFile() throws HeapException {
+ return pageRecord.getPreviousRecordPositionInFile();
+ }
+
protected int entrySize(final DataRecordIdentifier key) {
int entryByteSize = 8/* long size for pointer */+ 8/* long size for value */;
final int dataSize = key.getKeyDataSize();
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/DataBlockPage.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/DataBlockPage.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/DataBlockPage.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -35,6 +35,7 @@
public class DataBlockPage extends AbstractElement {
public static final int HEAD_SIZE =
+ /**/8/* byte size for previous record position */+
/**/1/* byte size for record type */+
/**/1/* byte size for bits */;
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/FreePage.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/FreePage.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/FreePage.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -59,7 +59,9 @@
@Override
public int getByteSize() {
// return PageConstant.PAGE_SIZE;
- return 1/* byte size for record type */+
+ return
+ /**/8/* byte size for previous record position */+
+ /**/1/* byte size for record type */+
/**/8/* long size for next free page */+
/**/4/* int size for crc32 */;
}
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/HeaderPage.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/HeaderPage.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/HeaderPage.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -48,6 +48,8 @@
private long nextDataRecordIdentifier;
+ private long lastRecordPositionInFile;
+
public HeaderPage(final IHeapElementManager heapElementManager) {
super(heapElementManager, 0L);
}
@@ -106,6 +108,7 @@
rootPagePosition = -1L;
freeDataBlocks = null;
nextDataRecordIdentifier = 0;
+ lastRecordPositionInFile = -1L;
}
@Override
@@ -140,6 +143,7 @@
writeLong(pageNumberOfFirstFreePage);
writeLong(rootPagePosition);
writeLong(nextDataRecordIdentifier);
+ writeLong(lastRecordPositionInFile);
initializeFreeDataBlock();
for (int index = 0; index < PageConstant.NUMBER_OF_BLOCK_TYPE; index++) {
writeLong(freeDataBlocks[index]);
@@ -163,6 +167,7 @@
pageNumberOfFirstFreePage = readLong();
rootPagePosition = readLong();
nextDataRecordIdentifier = readLong();
+ lastRecordPositionInFile = readLong();
initializeFreeDataBlock();
for (int index = 0; index < PageConstant.NUMBER_OF_BLOCK_TYPE; index++) {
freeDataBlocks[index] = readLong();
@@ -241,4 +246,12 @@
public int getInParentIndex() throws HeapException {
throw new HeapException("unsupported");
}
+
+ public void setLastRecordPositionInFile(final long lastRecordPositionInFile) {
+ this.lastRecordPositionInFile = lastRecordPositionInFile;
+ }
+
+ public long getLastRecordPositionInFile() {
+ return lastRecordPositionInFile;
+ }
}
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/LeafPage.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/LeafPage.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/LeafPage.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -37,7 +37,9 @@
@NotStorableClass
public class LeafPage extends AbstractElement implements ILeafPage {
- public static int HEAD_TAIL_SIZE = 1/* byte size for record type */+
+ public static int HEAD_TAIL_SIZE =
+ /**/8/* byte size for previous record position */+
+ /**/1/* byte size for record type */+
/**/4/* int size for number of entries */+
/**/4/* int size for crc32 */+
/**/8/* for next */;
@@ -167,7 +169,7 @@
*/
public long getDataBlockPosition(
final DataRecordIdentifier dataRecordIdentifier) {
- // FIXMELUC _________dichotomic search
+ // FIXMELUC _________________LONG dichotomic search
long position = -1;
for (index = 0; position == -1L && index < numberOfKeyEntries; index++) {
if (keys[index].compareTo(dataRecordIdentifier) == 0) {
@@ -306,6 +308,7 @@
private int computeInsertBeforeIndex(
final DataRecordIdentifier dataRecordIdentifier) {
+ // FIXMELUC _________________LONG
int index;
for (index = 0; index < numberOfKeyEntries
&& dataRecordIdentifier.compareTo(keys[index]) > 0; index++)
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/NonTerminalPage.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/NonTerminalPage.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/NonTerminalPage.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -38,7 +38,9 @@
public class NonTerminalPage extends AbstractElement implements
INonTerminalPage {
- public static int HEAD_TAIL_SIZE = 1/* byte size for record type */+
+ public static int HEAD_TAIL_SIZE =
+ /**/8/* byte size for previous record position */+
+ /**/1/* byte size for record type */+
/**/4/* int size for number of entries */+
/**/4/* int size for crc32 */+
/**/8/* last pointer long size */;
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/PageRecord.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/PageRecord.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/entity/PageRecord.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -42,6 +42,8 @@
private final long pageNumber;
+ private long previousRecordPositionInFile;
+
/**
* creation for reading
*
@@ -52,11 +54,14 @@
final long pageNumber) {
super(heapElementManager, pageNumber << PageConstant.PAGE_BITS);
this.pageNumber = pageNumber;
+ this.previousRecordPositionInFile = -1L;
}
public PageRecord(final IHeapElementManager heapElementManager,
+ final Long previousRecordPositionInFile,
final IPageRecordable pageRecordable, final long pageNumber) {
super(heapElementManager, pageNumber << PageConstant.PAGE_BITS);
+ this.previousRecordPositionInFile = previousRecordPositionInFile;
this.pageNumber = pageNumber;
this.pageRecordable = pageRecordable;
this.recordType = pageRecordable.getRecordType();
@@ -90,9 +95,26 @@
@Override
public long getPreviousRecordPositionInFile() throws HeapException {
- return -1L;
+ return previousRecordPositionInFile;
}
+ public void setPreviousRecordPositionInFile(
+ final long previousRecordPositionInFile) throws HeapException {
+ setValueIsChangedValueToSave();
+ this.previousRecordPositionInFile = previousRecordPositionInFile;
+ assertPreviousPositionInFile();
+ }
+
+ private boolean assertPreviousPositionInFile() throws HeapException {
+ if (previousRecordPositionInFile == -1
+ && positionInFile != PageConstant.PAGE_SIZE) {
+ throw new HeapException("bad position of first record "
+ + positionInFile + " for " + PageConstant.PAGE_SIZE
+ + " expected");
+ }
+ return true;
+ }
+
@Override
public int getRecordSize() throws HeapException {
// ASSERTX
@@ -115,6 +137,7 @@
assert pageRecordable.getPageRecord() == this;
// ASSERTX
assert recordType.equals(pageRecordable.getRecordType());
+ writeLong(previousRecordPositionInFile);
writeByteRecordType(recordType);
switch (recordType) {
case NON_TERMINAL_PAGE:
@@ -143,6 +166,8 @@
throw new HeapException("read " + read + " for "
+ PageConstant.PAGE_SIZE + " expected");
}
+ previousRecordPositionInFile = readLong();
+ assertPreviousPositionInFile();
recordType = readRecordType();
switch (recordType) {
case NON_TERMINAL_PAGE:
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusDataManager.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusDataManager.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusDataManager.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -270,21 +270,27 @@
throws HeapException {
// FIXMELUC ________rotation, dispatch on sibling
INonTerminalPage newNonTerminalPage = nonTerminalPage.split();
+ DataRecordIdentifier middleKey = nonTerminalPage.getAndClearMiddleKey();
+ // ASSERTX
+ assert middleKey != null;
do {
btreePlusElementMgr.appendPageRecordable(newNonTerminalPage);
newNonTerminalPage.setValueIsChangedValueToSave();
- DataRecordIdentifier middleKey = nonTerminalPage
- .getAndClearMiddleKey();
NonTerminalPage parent = (NonTerminalPage) nonTerminalPage
.getParentPage();
if (parent == null) {
btreePlusElementMgr.newRootNonTerminalPage(nonTerminalPage,
middleKey, newNonTerminalPage);
+ newNonTerminalPage = null;
} else {
if (parent.add(nonTerminalPage, middleKey, newNonTerminalPage)) {
newNonTerminalPage = null;
} else {
- newNonTerminalPage = nonTerminalPage.split();
+ newNonTerminalPage = parent.split();
+ middleKey = parent.getAndClearMiddleKey();
+ // ASSERTX
+ assert middleKey != null;
+ nonTerminalPage = parent;
}
}
} while (newNonTerminalPage != null);
Modified: trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusElementMgr.java
===================================================================
--- trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusElementMgr.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/main/java/net/sf/joafip/btreeplus/service/BtreePlusElementMgr.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -306,21 +306,26 @@
final IPageRecordable pageRecordable) throws HeapException {
long pageNumber = header.getPageNumberOfFirstFreePage();
boolean newPage;
+ final long previousRecordPositionInFile;
if (pageNumber == -1) {
newPage = true;
pageNumber = header.getFileSizeAsNumberOfPage();
+ previousRecordPositionInFile = header.getLastRecordPositionInFile();
} else {
newPage = false;
final FreePage freePage = (FreePage) ((PageRecord) heapElementManager
.readHeapFileDataRecord(pageNumber << PageConstant.PAGE_BITS))
.getPageRecordable();
header.setPageNumberOfFirstFreePage(freePage.getNextFreePage());
+ previousRecordPositionInFile = freePage
+ .getPreviousRecordPositionInFile();
}
final IPageRecord pageRecord = new PageRecord(heapElementManager,
- pageRecordable, pageNumber);
+ previousRecordPositionInFile, pageRecordable, pageNumber);
if (newPage) {
header.setFileSizeAsNumberOfPage(pageNumber
+ pageRecord.getNumberOfPage());
+ header.setLastRecordPositionInFile(pageNumber << PageConstant.PAGE_BITS);
} else {
// ASSERTX
assert pageRecord.getNumberOfPage() == 1;
@@ -338,8 +343,10 @@
final long freePageNumber = header.getPageNumberOfFirstFreePage();
FreePage freePage = new FreePage(freePageNumber);
final long newFreePageNumber = pageRecord.getPageNumber();
- PageRecord pageRecord2 = new PageRecord(heapElementManager, freePage,
- newFreePageNumber);
+ final long previousRecordPositionInFile = pageRecord
+ .getPreviousRecordPositionInFile();
+ PageRecord pageRecord2 = new PageRecord(heapElementManager,
+ previousRecordPositionInFile, freePage, newFreePageNumber);
freePage.setPageRecord(pageRecord2);
freePage.setValueIsChangedValueToSave();
heapElementManager.appendHeapFileRecord(pageRecord2);
Modified: trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/LeafPageTest.java
===================================================================
--- trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/LeafPageTest.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/LeafPageTest.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -334,7 +334,9 @@
}
private int byteSize(final int numberOfKeyEntries) {
- int byteSize = 1/* byte size for record type */+
+ int byteSize =
+ /**/8/* byte size for previous record position */+
+ /**/1/* byte size for record type */+
/**/4/* int size for number of entries */+
/**/4/* int size for crc32 */+
/**/(numberOfKeyEntries + 1/* for next */) * 8/*
@@ -345,6 +347,6 @@
}
private int maxNumberOfEntries() {
- return (int) ((PageConstant.PAGE_SIZE - (1 + 4 + 4 + 8)) / (8 * 2));
+ return (int) ((PageConstant.PAGE_SIZE - (8 + 1 + 4 + 4 + 8)) / (8 * 2));
}
}
Modified: trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/NonTerminalPageTest.java
===================================================================
--- trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/NonTerminalPageTest.java 2012-04-30 05:17:03 UTC (rev 3052)
+++ trunk/joafip-btreeplus/src/test/java/net/sf/joafip/btreeplus/entity/NonTerminalPageTest.java 2012-05-01 07:39:04 UTC (rev 3053)
@@ -539,7 +539,9 @@
}
private int byteSize(final int numberOfKeyEntries) {
- int xbyteSize = 1/* byte size for record type */+
+ int xbyteSize =
+ /**/8/* byte size for previous record position */+
+ /**/1/* byte size for record type */+
/**/4/* int size for number of entries */+
/**/4/* int size for crc32 */+
/**/numberOfKeyEntries * 8/* key entries */+
@@ -549,6 +551,6 @@
}
private int maxNumberOfEntries() {
- return (int) ((PageConstant.PAGE_SIZE - (1 + 4 + 4 + 8)) / (8 * 2));
+ return (int) ((PageConstant.PAGE_SIZE - (8 + 1 + 4 + 4 + 8)) / (8 * 2));
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|