[Joafip-svn] SF.net SVN: joafip:[3018] trunk
Brought to you by:
luc_peuvrier
|
From: <luc...@us...> - 2012-04-18 08:49:15
|
Revision: 3018
http://joafip.svn.sourceforge.net/joafip/?rev=3018&view=rev
Author: luc_peuvrier
Date: 2012-04-18 08:49:04 +0000 (Wed, 18 Apr 2012)
Log Message:
-----------
indempendant HeapElementManager move in joafip-kvstore project
Modified Paths:
--------------
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/AbstractHeapRBTNode.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapFreeNode.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapHeader.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapIdNode.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapRecord.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/AbstractHeapNodeManager.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapFreeNodeManager.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapIdNodeManager.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/service/HeapFileDataManager.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/TestIdNode.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapElementManagerWithHeapRecord.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapRecordManage.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestStoreRestore.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/service/FileDataManagerIntegrityChecker.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/service/HeapRecordIterator.java
Added Paths:
-----------
trunk/joafip-kvstore/src/main/java/net/sf/joafip/kvstore/record/service/HeapElementManager.java
trunk/joafip-kvstore/src/main/java/net/sf/joafip/kvstore/record/service/IHeapElementManager.java
trunk/joafip-kvstore/src/main/java/net/sf/joafip/kvstore/record/service/IHeapRecordFactory.java
trunk/joafip-kvstore/src/test/java/net/sf/joafip/heapfile/record/entity/RecordForTest.java
Removed Paths:
-------------
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapElementManager.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapElementManager.java
trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapRecordFactory.java
trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/entity/RecordForTest.java
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/AbstractHeapRBTNode.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/AbstractHeapRBTNode.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/AbstractHeapRBTNode.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -18,7 +18,7 @@
import net.sf.joafip.NotStorableClass;
import net.sf.joafip.heapfile.record.service.AbstractHeapNodeManager;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTNode;
import net.sf.joafip.redblacktree.entity.RBTSentinel;
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapFreeNode.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapFreeNode.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapFreeNode.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -17,7 +17,7 @@
package net.sf.joafip.heapfile.record.entity;
import net.sf.joafip.NotStorableClass;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTComparableNode;
import net.sf.joafip.redblacktree.service.RBTException;
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapHeader.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapHeader.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapHeader.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -17,9 +17,9 @@
package net.sf.joafip.heapfile.record.entity;
import net.sf.joafip.NotStorableClass;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.entity.AbstractFileStorable;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
/**
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapIdNode.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapIdNode.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapIdNode.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -17,8 +17,8 @@
package net.sf.joafip.heapfile.record.entity;
import net.sf.joafip.NotStorableClass;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTComparableNode;
import net.sf.joafip.redblacktree.service.RBTException;
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapRecord.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapRecord.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/entity/HeapRecord.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -20,11 +20,11 @@
import net.sf.joafip.Fortest;
import net.sf.joafip.NotStorableClass;
-import net.sf.joafip.heapfile.record.service.HeapElementManager;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.entity.AbstractFileStorable;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
import net.sf.joafip.kvstore.record.entity.IDataRecordKey;
+import net.sf.joafip.kvstore.record.service.HeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTNode;
import net.sf.joafip.redblacktree.service.RBTException;
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/AbstractHeapNodeManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/AbstractHeapNodeManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/AbstractHeapNodeManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -18,6 +18,7 @@
import net.sf.joafip.NotStorableClass;
import net.sf.joafip.heapfile.record.entity.HeapHeader;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.logger.JoafipLogger;
import net.sf.joafip.redblacktree.entity.IRBTNode;
Deleted: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapElementManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapElementManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapElementManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -1,1140 +0,0 @@
-/*
- * 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.heapfile.record.service;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import net.sf.joafip.Fortest;
-import net.sf.joafip.NotStorableClass;
-import net.sf.joafip.file.service.FileIOException;
-import net.sf.joafip.file.service.HelperFileUtil;
-import net.sf.joafip.heapfile.record.entity.HeapHeader;
-import net.sf.joafip.kvstore.entity.EnumFileState;
-import net.sf.joafip.kvstore.entity.IFileStorable;
-import net.sf.joafip.kvstore.entity.ToBackupRecord;
-import net.sf.joafip.kvstore.record.service.IDataRecordKeyManager;
-import net.sf.joafip.kvstore.service.FileForStorable;
-import net.sf.joafip.kvstore.service.HeapException;
-import net.sf.joafip.kvstore.service.IFileForStorable;
-import net.sf.joafip.logger.JoafipLogger;
-
-/**
- * Heap elements manager in heap file.<br>
- * elements are one heap header and the heap records<br>
- * see {@link IHeapElementManager} for role description<br>
- * implement a cache for elements read and to write<br>
- * data in the cache that was modified will be saved when closing transaction<br>
- * <br>
- * cache mechanism:<br>
- * record cache is in {@link #heapRecordToWriteMap} and in
- * {@link #readHeapRecordMap}<br>
- * <br>
- * {@link #readHeapFileDataRecord(long, boolean)} check if record already in
- * cache, if not read it from file and put it in cache ( the record is marked
- * not modified )<br>
- * <br>
- * {@link #newHeapFileRecord(long, long, long, boolean, boolean, int, int)},
- * create a new record and put it in the cache<br>
- * <br>
- * {@link #delete(long)} delete record from the cache<br>
- * <br>
- * {@link #closeTransaction()} write record marked changed from the cache to the
- * files ( see crash safe mechanisms )<br>
- * <br>
- * crash safe mechanism can be turned off<br>
- * <br>
- * crash safe mechanism:<br>
- * <br>
- * to be crash safe file is maintained open for reading, write are not done as
- * soon they are ask but put in the read/write cache. records on the read/write
- * cache marked changed are write to file when {@link #closeTransaction()} is
- * call, that close the file to be sure all is on disk before reopen file for
- * reading<br>
- * <br>
- * {@link #wasBadFileStableState()} must be call before use files to restore
- * stable file state if needed<br>
- * <br>
- * FlagData : flag file indicating data file state stable<br>
- * FlagBackup: flag file indicating backup data file state stable<br>
- * FlagGlobal: flag file indicating backup and data file stable state<br>
- * <br>
- * <span style="font-family: monospace;"><br>
- * FlagGlobal present .===#...................#===<br>
- * .......... absent .....#===================#...<br>
- * .......................|...................|...<br>
- * FlagData present ...=======#...#===============<br>
- * .......... absent .....|...#===#...........|...<br>
- * .......................|...|...|...........|...<br>
- * FlagBackup present .===============#...#=======<br>
- * .......... absent .....|...|...|...#===#...|...<br>
- * .......................|...|...|...|...|...|...<br>
- * ..................... (1) (2) (3) (4) (5) (6) .<br>
- * </span> <br>
- * (1) starting of files access for write<br>
- * (2) starting of data file modification (write)<br>
- * (3) ending of data file modification<br>
- * (4) starting of backup data file modification (write)<br>
- * (5) ending of backup data file modification<br>
- * (6)end of files access for write<br>
- * <br>
- * if all flag file are present then all files are in stable state<br>
- * if 'FlagGlobal' is absent there was a modification crash<br>
- * <ul>
- * <li>if both 'FlagData' and 'FlagBackup' are present then the files are not
- * deteriorated, but backup data may not be up to date</li>
- * <li>if 'FlagData' is absent then data file may be deteriorated, backup file
- * is in stable state ( previous data before last interrupted modification)</li>
- * <li>if 'FlagBackup' is absent then backup data file is deteriorated, data
- * file is in stable state ( contains last modification )</li>
- * </ul>
- *
- * @author luc peuvrier
- *
- */
-@NotStorableClass
-public class HeapElementManager implements IHeapElementManager {// NOPMD
-
- private static final JoafipLogger LOGGER = JoafipLogger
- .getLogger(HeapElementManager.class);
-
- private static final String NO_FILES =
- /**/"no files";
-
- private static final String OPEN_FAILED =
- /**/"open failed";
-
- private static final String DATA_FILE_NOT_IN_STABLE_STATE_RESTORED =
- /**/"data file not in stable state, restored";
-
- private static final String BACKUP_FILE_NOT_IN_STABLE_STATE_RESTORED =
- /**/"backup file not in stable state, restored";
-
- private static final String FILES_IN_STABLE_STATE =
- /**/"files in stable state";
-
- private static final String NO_FILES_IN_STABLE_STATE =
- /**/"no files in stable state";
-
- private static final String READ_HEAP_FILE_NODE_FAILED =
- /**/"read heap file node failed";
-
- private static final String WRITE_FILE_HEADER_FAILED =
- /**/"close failed, write file header failed";
-
- private static final String READ_FILE_HEADER_FAILED =
- /**/"open failed, read file header failed";
-
- private static final String RECORD_MANAGER_IS_STARTED =
- /**/"record manager is started";
-
- private static final String RECORD_MANAGER_TRANSACTION_ALREADY_OPENED =
- /**/"record manager transaction already opened";
-
- private static final String RECORD_MANAGER_IS_STOPPED =
- /**/"record manager is stopped";
-
- private static final String RECORD_MANAGER_TRANSACTION_IS_CLOSED =
- /**/"record manager transaction is closed";
-
- private static final HelperFileUtil HELPER_FILE_UTIL = HelperFileUtil
- .getInstance();
-
- /** true if crash safe mode enabled */
- private final boolean crashSafeMode;
-
- /** file for {@link IFileStorable} object: header and nodes */
- private final IFileForStorable fileForStorable;
-
- /** backup file for {@link IFileStorable} object: header and nodes */
- private final IFileForStorable fileForStorableBackup;
-
- /** flag file indicating data file state stable */
- private final File stateOkFlagFile;
-
- /** flag file indicating backup data file state stable */
- private final File stateBackupOkFlagFile;
-
- /** flag file indicating backup and data file stable state */
- private final File globalStateFlagFile;
-
- private final File openFileTraceFile;
-
- /** true when record manager service is started */
- private boolean serviceStarted = false;
-
- private Exception starterTrace;
-
- private Exception stopperTrace = new Exception("stopper trace");
-
- /** true when record manager transaction is opened */
- private boolean openedTransaction = false;
-
- /** the header node */
- private IFileStorable header;
-
- /** true if data loose, updated by {@link #wasBadFileStableState()} */
- private boolean dataLost = false;
-
- /**
- * maintain map of to write record identified by start position in file, it
- * is a record cache<br>
- * read are put in cache to guaranty that same object for same record is
- * returned in same transaction<br>
- */
- private final Map<Long, IFileStorable> heapRecordToWriteMap =
- /**/new TreeMap<Long, IFileStorable>();
-
- private final Map<Long, IFileStorable> readHeapRecordMap =
- /**/new TreeMap<Long, IFileStorable>();
-
- private final boolean fileOpenedInTransaction;
-
- private final boolean deleteRenamig;
-
- private final boolean clearResizeFile;
-
- private final int maxFileOperationRetry;
-
- private final int fileOperationRetryMsDelay;
-
- private final IHeapRecordFactory heapRecordFactory;
-
- private IDataRecordKeyManager dataRecordKeyManager;
-
- /**
- * construction for crash safe mode disabled<br>
- *
- * @param heapRecordFactory
- * @param fileForStorable
- * data file
- * @param deleteRenaming
- * @param clearResizeFile
- * @param maxFileOperationRetry
- * @param fileOperationRetryMsDelay
- * @param openFileTraceFile
- */
- public HeapElementManager(final IHeapRecordFactory heapRecordFactory,
- final IFileForStorable fileForStorable,
- final boolean deleteRenaming, final boolean clearResizeFile,
- final int maxFileOperationRetry,
- final int fileOperationRetryMsDelay, final File openFileTraceFile) {
- super();
- this.heapRecordFactory = heapRecordFactory;
- crashSafeMode = false;
- fileOpenedInTransaction = false;
- this.fileForStorable = fileForStorable;
- this.openFileTraceFile = openFileTraceFile;
- this.stateOkFlagFile = null;// NOPMD no state ok flag file
- this.fileForStorableBackup = null;// NOPMD no backup file
- this.stateBackupOkFlagFile = null;// NOPMD no backup state flag file
- this.globalStateFlagFile = null;// NOPMD no global state ok flag file
- this.deleteRenamig = deleteRenaming;
- this.clearResizeFile = clearResizeFile;
- this.maxFileOperationRetry = maxFileOperationRetry;
- this.fileOperationRetryMsDelay = fileOperationRetryMsDelay;
- }
-
- /**
- * construction for crash safe mode enabled<br>
- *
- * @param heapRecordFactory
- * @param fileForStorable
- * data file
- * @param stateOkFlagFile
- * flag file indicating data file state stable
- * @param fileForStorableBackup
- * data backup file
- * @param stateBackupOkFlagFile
- * flag file indicating backup data file state stable
- * @param globalStateFlagFile
- * flag file indicating backup and data file stable state
- * @param deleteRenaming
- * @param clearResizeFile
- * @param maxFileOperationRetry
- * @param fileOperationRetryMsDelay
- * @param openFileTraceFile
- * @throws HeapException
- * no files in stable state
- */
- public HeapElementManager(final IHeapRecordFactory heapRecordFactory,
- final FileForStorable fileForStorable, final File stateOkFlagFile,
- final FileForStorable fileForStorableBackup,
- final File stateBackupOkFlagFile, final File globalStateFlagFile,
- final boolean deleteRenaming, final boolean clearResizeFile,
- final int maxFileOperationRetry,
- final int fileOperationRetryMsDelay, final File openFileTraceFile) {
- super();
- this.heapRecordFactory = heapRecordFactory;
- crashSafeMode = true;
- fileOpenedInTransaction = true;
- this.fileForStorable = fileForStorable;
- this.stateOkFlagFile = stateOkFlagFile;
- this.fileForStorableBackup = fileForStorableBackup;
- this.stateBackupOkFlagFile = stateBackupOkFlagFile;
- assert globalStateFlagFile != null;
- this.globalStateFlagFile = globalStateFlagFile;
- this.openFileTraceFile = openFileTraceFile;
- this.deleteRenamig = deleteRenaming;
- this.clearResizeFile = clearResizeFile;
- this.maxFileOperationRetry = maxFileOperationRetry;
- this.fileOperationRetryMsDelay = fileOperationRetryMsDelay;
- }
-
- @Override
- public IFileForStorable getFileForStorable() {
- return fileForStorable;
- }
-
- @Override
- public long getFileSize() throws HeapException {
- return fileForStorable.getFileSize();
- }
-
- @Override
- public boolean wasBadFileStableState() throws HeapException {// NOPMD
- assertServiceIsStopped();
- final boolean restored;
-
- dataLost = false;
-
- if (crashSafeMode) {
- final boolean globalFlagExists = globalStateFlagFile.exists();
- final boolean dataFlagExists = stateOkFlagFile.exists();
- final boolean backupFlagExists = stateBackupOkFlagFile.exists();
- final boolean dataExists = fileForStorable.getFile().exists();
- final boolean backupExists = fileForStorableBackup.getFile()
- .exists();
-
- if (dataFlagExists && !dataExists) {
- final String message = "backup data flag "
- + stateBackupOkFlagFile.getName()
- + " exists but missing data backup file "
- + fileForStorableBackup.getFile().getName();
- /*
- * need some files maintenance
- */
- LOGGER.fatal(message);
- throw new HeapException(message, EnumFileState.STATE_UNSTABLE);
- } else if (backupFlagExists && !backupExists) {
- final String message = "data flag " + stateOkFlagFile.getName()
- + " exists but missing data file "
- + fileForStorable.getFile().getName();
- /*
- * need some files maintenance
- */
- LOGGER.fatal(message);
- throw new HeapException(message, EnumFileState.STATE_UNSTABLE);
-
- } else if (globalFlagExists) {
- /*
- * global flag exists
- */
- if (dataFlagExists && backupFlagExists) {
- /*
- * data and backup file in stable state
- */
- LOGGER.info(FILES_IN_STABLE_STATE);
- } else {
- /*
- * flag file inconsistency, data and backup flag file must
- * exists if global flag file exist
- */
- /*
- * may be first time case when there is no file present
- */
- inconsistencyCheck(backupExists, dataExists);
- }
- restored = false;
- } else {
- try {
- /*
- * global flag do not exists
- */
- if (dataFlagExists && backupFlagExists) {
- /*
- * backup file may not be up to date, create it from
- * data file
- */
- HELPER_FILE_UTIL.copyFile(fileForStorable.getFile(),
- fileForStorableBackup.getFile());
- LOGGER.warn(BACKUP_FILE_NOT_IN_STABLE_STATE_RESTORED);
- restored = true;
- } else if (!dataFlagExists && backupFlagExists) {
- /*
- * data file not in stable state
- */
- /*
- * since backup file in stable state, create data file
- * from backup file
- */
- HELPER_FILE_UTIL.copyFile(
- fileForStorableBackup.getFile(),
- fileForStorable.getFile());
- LOGGER.warn(DATA_FILE_NOT_IN_STABLE_STATE_RESTORED);
- restored = true;
- dataLost = true;
- } else if (dataFlagExists && !backupFlagExists) {
- /*
- * backup file not in stable state, create it from data
- * file
- */
- HELPER_FILE_UTIL.copyFile(fileForStorable.getFile(),
- fileForStorableBackup.getFile());
- LOGGER.warn(BACKUP_FILE_NOT_IN_STABLE_STATE_RESTORED);
- restored = true;
- } else {
- /*
- * flag file inconsistency, one of data and backup flag
- * file must exists if global flag file not exist
- */
- /*
- * may be first time case when there is no file present
- */
- inconsistencyCheck(backupExists, dataExists);
- restored = false;
- }
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
- }
- } else {
- restored = false;
- }
- if (restored) {
- markStableState();
- }
- return restored;
- }
-
- /**
- * file inconsistency checking: detect if first usage when data and backup
- * files absent
- *
- * @param dataExists
- * @param backupExists
- *
- * @throws HeapException
- * file should exist, need some files maintenance
- * @throws HeapException
- */
- private void inconsistencyCheck(final boolean backupExists,
- final boolean dataExists) throws HeapException, HeapException {
- if (dataExists || backupExists) {
- final String message = NO_FILES_IN_STABLE_STATE + ", file "
- + fileForStorable.getFile().getName() + " exist="
- + dataExists + ", file "
- + fileForStorableBackup.getFile().getName() + " exist="
- + backupExists;
- /*
- * need some files maintenance
- */
- LOGGER.fatal(message);
- throw new HeapException(message, EnumFileState.STATE_UNSTABLE);
- } else {
- /*
- * no data, empty
- */
- LOGGER.warn(NO_FILES);
- markStableState();
- }
- }
-
- @Override
- public boolean isDataLost() {
- return dataLost;
- }
-
- /**
- * mark files in stable state, must be call if
- * {@link #wasBadFileStableState()} returned true<br>
- * also use to mark stable after file deletion<br>
- * make able to fix some unstable state from restored state before mark
- * restored files stable<br>
- *
- * @throws HeapException
- * file access error
- */
- private void markStableState() throws HeapException {
- if (crashSafeMode) {
- try {
- HELPER_FILE_UTIL.touchFile(stateBackupOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- HELPER_FILE_UTIL.touchFile(stateOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- HELPER_FILE_UTIL.touchFile(globalStateFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
- }
- }
-
- @Override
- public void removeFiles() throws HeapException {
- // ASSERTX
- assert assertServiceStoppedOrTransactionClosed();
- // FIXMELUC _should clear flag files
- if (deleteRenamig) {
- fileForStorable.deleteFileIfExistsRenaming();
- } else {
- fileForStorable.deleteFileIfExists();
- }
- if (crashSafeMode) {
- if (deleteRenamig) {
- fileForStorableBackup.deleteFileIfExistsRenaming();
- } else {
- fileForStorableBackup.deleteFileIfExists();
- }
- }
- // ASSERTX
- assert readHeapRecordMap.isEmpty() : "heap record read cache must be empty";
- // ASSERTX
- assert heapRecordToWriteMap.isEmpty() : "heap record write cache must be empty";
- markStableState();
- }
-
- @Override
- public void clear() throws HeapException {
- // ASSERTX
- assert assertTransactionOpened();
- heapRecordToWriteMap.clear();
- readHeapRecordMap.clear();
- if (clearResizeFile) {
- try {
- setStartSaveFlagFile();
- fileForStorable.resetFileSize();
- } catch (HeapException exception) {
- LOGGER.fatal(OPEN_FAILED, exception);
- throw new HeapException(OPEN_FAILED, exception);
- } catch (FileIOException exception) {
- LOGGER.fatal(OPEN_FAILED, exception);
- throw new HeapException(OPEN_FAILED, exception);
- }
- if (crashSafeMode) {
- try {
- setStartBackupFlagFile();
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
- try {
- fileForStorableBackup.resetFileSize();
- } catch (HeapException exception) {
- LOGGER.fatal(OPEN_FAILED, exception);
- throw exception;
- }
- }
- try {
- setEndSaveFlagFile();
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
- }
- header.clear();
- /* to save new header */
- header.setValueIsChangedValueToSave();
- header.writeToFile();
- flushOnFile();
- }
-
- @Override
- public void startService() throws HeapException {
- // ASSERTX
- assert assertServiceIsStopped();
- starterTrace = new Exception("starter trace");
- serviceStarted = true;
- if (!fileOpenedInTransaction) {
- openFile();
- }
- }
-
- @Override
- public void stopService() throws HeapException {
- // ASSERTX
- assert assertServiceStarted();
- if (openedTransaction) {
- closeTransaction();
- }
- stopperTrace = new Exception("stopper trace");
- serviceStarted = false;
- if (!fileOpenedInTransaction) {
- closeFiles();
- }
- }
-
- @Override
- public boolean isServiceStarted() {
- return serviceStarted;
- }
-
- /**
- * assert service is started
- *
- * @throws HeapException
- * service is stopped
- */
- private boolean assertServiceStarted() throws HeapException {
- if (!serviceStarted) {
- LOGGER.fatal(RECORD_MANAGER_IS_STOPPED);
- throw new HeapException(RECORD_MANAGER_IS_STOPPED, stopperTrace);
- }
- return true;
- }
-
- /**
- * assert service is stopped
- *
- * @throws HeapException
- * service is started
- */
- private boolean assertServiceIsStopped() throws HeapException {
- if (serviceStarted) {
- LOGGER.fatal(RECORD_MANAGER_IS_STARTED);
- throw new HeapException(RECORD_MANAGER_IS_STARTED, starterTrace);
- }
- return true;
- }
-
- @Override
- public void openTransaction() throws HeapException {
- // ASSERTX
- assert assertServiceStartedAndTransactionClosed();
- if (fileOpenedInTransaction) {
- openFile();
- }
- clearHeaprecordToWriteMap();
- readHeapRecordMap.clear();
- try {
- final long fileSize = getFileSize();
- header.clear();
- if (fileSize == 0) {
- /* to save new header */
- header.setValueIsChangedValueToSave();
- header.writeToFile();
- flushOnFile();
- if (fileOpenedInTransaction) {
- closeFiles();
- openFile();
- }
- } else {
- header.readFromFile();
- }
- openedTransaction = true;
- } catch (HeapException exception) {
- LOGGER.fatal(READ_FILE_HEADER_FAILED, exception);
- throw new HeapException(READ_FILE_HEADER_FAILED, exception);
- }
- }
-
- private boolean assertServiceStartedAndTransactionClosed()
- throws HeapException {
- assertServiceStarted();
- assertTransactionClosed();
- return true;
- }
-
- private void assertTransactionClosed() throws HeapException {
- if (openedTransaction) {
- LOGGER.fatal(RECORD_MANAGER_TRANSACTION_ALREADY_OPENED);
- throw new HeapException(RECORD_MANAGER_TRANSACTION_ALREADY_OPENED);
- }
- }
-
- private boolean assertServiceStoppedOrTransactionClosed()
- throws HeapException {
- if (serviceStarted) {
- assertTransactionClosed();
- }
- return true;
- }
-
- private void openFile() throws HeapException {
- if (openFileTraceFile != null) {
- try {
- final PrintStream printStream = new PrintStream(
- openFileTraceFile);
- new Exception("open file trace").printStackTrace(printStream);
- printStream.close();
- } catch (Exception exception) {
- LOGGER.error("while writing open file trace", exception);
- }
- }
- try {
- fileForStorable.open();
- } catch (HeapException exception) {
- LOGGER.fatal(OPEN_FAILED, exception);
- throw exception;
- }
- if (crashSafeMode) {
- try {
- fileForStorableBackup.open();
- } catch (HeapException exception) {
- LOGGER.fatal(OPEN_FAILED, exception);
- throw exception;
- }
- }
- }
-
- @Override
- public void closeTransaction() throws HeapException {
- // ASSERTX
- assert assertTransactionOpened();
-
- final Set<ToBackupRecord> toBackupList;
- try {
- toBackupList = startSave();
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
-
- saveHeader(toBackupList);
- save(toBackupList);
- if (crashSafeMode) {
- fileForStorable.flush();
- }
-
- updateBackup(toBackupList);
-
- clearHeaprecordToWriteMap();
- readHeapRecordMap.clear();
- if (crashSafeMode) {
- flushOnFile();
- }
- if (fileOpenedInTransaction) {
- closeFiles();
- }
- openedTransaction = false;
- }
-
- @Override
- public void closeTransactionDiscardChange() throws HeapException {
- // ASSERTX
- assert assertTransactionOpened();
- clearHeaprecordToWriteMap();
- readHeapRecordMap.clear();
- if (fileOpenedInTransaction) {
- closeFiles();
- }
- openedTransaction = false;
- }
-
- private void clearHeaprecordToWriteMap() {
- heapRecordToWriteMap.clear();
- }
-
- private void closeFiles() throws HeapException {
- try {
- if (openFileTraceFile != null && !openFileTraceFile.delete()) {
- LOGGER.error("while deleting open file trace");
- }
- } catch (Exception exception) {
- LOGGER.error("while deleting open file trace", exception);
- }
- fileForStorable.close();
- if (crashSafeMode) {
- fileForStorableBackup.close();
- }
- }
-
- private void flushOnFile() throws HeapException {
- flushOnFile(fileForStorable);
- if (crashSafeMode) {
- flushOnFile(fileForStorableBackup);
- }
- }
-
- /**
- * flush on file by closing and reopening ( crash safe mode only )
- *
- * @param fileForStorableToUpdate
- * @throws HeapException
- */
- private void flushOnFile(final IFileForStorable fileForStorableToUpdate)
- throws HeapException {
- fileForStorableToUpdate.flush();
- }
-
- @Override
- public boolean isTransactionOpened() {
- return openedTransaction;
- }
-
- private boolean assertTransactionOpened() throws HeapException {
- assertServiceStarted();
- if (!openedTransaction) {
- LOGGER.fatal(RECORD_MANAGER_TRANSACTION_IS_CLOSED);
- throw new HeapException(RECORD_MANAGER_TRANSACTION_IS_CLOSED);
- }
- return true;
- }
-
- private void save(final Set<ToBackupRecord> toBackupList)
- throws HeapException {
- long lastWrotePositionInFile = HeapHeader.HEAP_HEADER_SIZE - 1;
- long lastRecordPositionInFile = 0;
- for (Map.Entry<Long, IFileStorable> entry : heapRecordToWriteMap
- .entrySet()) {
- final IFileStorable heapRecord = entry.getValue();
- try {
- assert false;
- } catch (AssertionError error) {
- // ASSERTX
- final long recordPositionInFile = heapRecord
- .getPositionInFile();
- if (recordPositionInFile != entry.getKey()) {
- throw new HeapException(// NOPMD
- "integrity error record position is "
- + recordPositionInFile + " and map key is "
- + entry.getKey());
- }
- if (recordPositionInFile <= lastWrotePositionInFile) {
- throw new HeapException("last wrote position is "// NOPMD
- + lastWrotePositionInFile
- + " and record position in file is "
- + recordPositionInFile);
- }
- final long previousRecordPositionInFile = heapRecord
- .getPreviousRecordPositionInFile();
- if (previousRecordPositionInFile == -1) {
- if (recordPositionInFile != HeapHeader.HEAP_HEADER_SIZE) {
- throw new HeapException("bad position of first record "// NOPMD
- + recordPositionInFile
- + " for "
- + HeapHeader.HEAP_HEADER_SIZE + " expected");
- }
- } else if (previousRecordPositionInFile < lastRecordPositionInFile) {
- badPreviousRecordPositionInFileError(
- lastRecordPositionInFile, recordPositionInFile,
- previousRecordPositionInFile);
- }
- lastWrotePositionInFile = recordPositionInFile
- + heapRecord.getRecordSize() - 1;
- lastRecordPositionInFile = recordPositionInFile;
- }
- saveHeapRecord(heapRecord, toBackupList);
- }
- }
-
- private void updateBackup(final Set<ToBackupRecord> toBackupList)
- throws HeapException {
- if (crashSafeMode) {
- try {
- setStartBackupFlagFile();
-
- for (ToBackupRecord toBackupRecord : toBackupList) {
- fileForStorableBackup.write(toBackupRecord);
- }
- fileForStorableBackup.flush();
- setEndSaveFlagFile();
- } catch (FileIOException exception) {
- throw new HeapException(exception);
- }
- }
- }
-
- private void setStartBackupFlagFile() throws FileIOException {
- HELPER_FILE_UTIL.touchFile(stateOkFlagFile, maxFileOperationRetry,
- fileOperationRetryMsDelay);
- if (deleteRenamig) {
- HELPER_FILE_UTIL.deleteRenaming(stateBackupOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- } else {
- HELPER_FILE_UTIL.delete(stateBackupOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- }
- }
-
- private void setEndSaveFlagFile() throws FileIOException {
- if (crashSafeMode) {
- HELPER_FILE_UTIL.touchFile(stateBackupOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- HELPER_FILE_UTIL.touchFile(globalStateFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- }
- }
-
- private Set<ToBackupRecord> startSave() throws FileIOException {
- final Set<ToBackupRecord> toBackupList;
- if (crashSafeMode) {
- toBackupList = new TreeSet<ToBackupRecord>();
- setStartSaveFlagFile();
- } else {
- toBackupList = null;
- }
- return toBackupList;
- }
-
- private void setStartSaveFlagFile() throws FileIOException {
- if (crashSafeMode) {
- if (deleteRenamig) {
- HELPER_FILE_UTIL.deleteRenaming(globalStateFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- HELPER_FILE_UTIL.deleteRenaming(stateOkFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- } else {
- HELPER_FILE_UTIL.delete(globalStateFlagFile,
- maxFileOperationRetry, fileOperationRetryMsDelay);
- HELPER_FILE_UTIL.delete(stateOkFlagFile, maxFileOperationRetry,
- fileOperationRetryMsDelay);
- }
- }
- }
-
- private void saveHeader(final Set<ToBackupRecord> toBackupList)
- throws HeapException {
- if (header.isValueChangedToSave()) {
- if (LOGGER.debugEnabled) {
- LOGGER.debug("update file with header record");
- }
- try {
- if (toBackupList == null) {
- header.writeToFile();
- } else {
- final byte[] data = header.writeToFile();
- toBackupList.add(new ToBackupRecord(header
- .getPositionInFile(), data));
- }
- } catch (HeapException exception) {
- LOGGER.fatal(WRITE_FILE_HEADER_FAILED, exception);
- throw new HeapException(WRITE_FILE_HEADER_FAILED, exception);
-
- }
- }
- }
-
- private void saveHeapRecord(final IFileStorable heapRecord,
- final Set<ToBackupRecord> toBackupList) throws HeapException {
- // ASSERTX
- assert heapRecord.isValueChangedToSave() : "value not change for:\n"
- + heapRecord.toString();
- if (toBackupList == null) {
- heapRecord.writeToFile();
- } else {
- final byte[] data = heapRecord.writeToFile();
- toBackupList.add(new ToBackupRecord(heapRecord.getPositionInFile(),
- data));
- }
- }
-
- /**
- * bad previous record position in file error
- *
- * @param lastRecordPositionInFile
- * @param recordPositionInFile
- * @param previousRecordPositionInFile
- * @throws HeapException
- */
- private void badPreviousRecordPositionInFileError(
- final long lastRecordPositionInFile,
- final long recordPositionInFile,
- final long previousRecordPositionInFile) throws HeapException {
- String nextOfPrevious;
- try {
- final IFileStorable heapRecord = readHeapRecordInFile(previousRecordPositionInFile);
- final long nNextOfPrevious = previousRecordPositionInFile
- + heapRecord.getRecordSize();
- nextOfPrevious = String.valueOf(nNextOfPrevious);
-
- } catch (Exception exception) {
- nextOfPrevious = exception.getMessage();
- }
-
- final IFileStorable heapRecord = heapRecordToWriteMap
- .get(lastRecordPositionInFile);
-
- final long nEndOfFilePosition = lastRecordPositionInFile
- + heapRecord.getRecordSize();
- throw new HeapException("for record at " + recordPositionInFile
- + ", bad previous position in file "
- + previousRecordPositionInFile + ", last record position is "
- + lastRecordPositionInFile + ",next of previous position "
- + nextOfPrevious + ",next of last " + nEndOfFilePosition
- + Thread.currentThread().getName() + "\nrecord:\n"
- + heapRecord.toString());
- }
-
- /**
- * read any kind of heap record ( free record or data record ) without
- * putting it in the cache
- *
- * @param positionInFile
- * @return
- * @throws HeapException
- */
- private IFileStorable readHeapRecordInFile(final long positionInFile)
- throws HeapException {
- final IFileStorable heapRecord = heapRecordFactory.createHeapRecord(
- this, positionInFile);
- try {
- heapRecord.readFromFile();
- } catch (HeapException exception) {
- final String message = READ_HEAP_FILE_NODE_FAILED
- + " read record failed, position in file #"
- + positionInFile;
- LOGGER.fatal(message, exception);
- throw new HeapException(message, exception);
- }
- return heapRecord;
- }
-
- @Override
- public void setHeapHeader(final IFileStorable heapHeader)
- throws HeapException {
- this.header = heapHeader;
- }
-
- @Override
- public IFileStorable getHeapHeader() throws HeapException {
- assertTransactionOpened();
- return header;
- }
-
- @Override
- public IFileStorable readHeapFileDataRecord(final long positionInFile)
- throws HeapException {
- assertTransactionOpened();
- // ASSERTX
- assert assertPositionInFile(positionInFile);
- /*
- * in write mode, read are put in cache to guaranty that same object for
- * same record is returned in same transaction<br>
- */
-
- IFileStorable heapRecord;
- heapRecord = heapRecordToWriteMap.get(positionInFile);
- if (heapRecord == null) {
- heapRecord = readHeapRecordMap.get(positionInFile);
- }
- if (heapRecord == null) {
- heapRecord = heapRecordFactory.createHeapRecord(this,
- positionInFile);
- try {
- heapRecord.readFromFile();
- } catch (HeapException exception) {
- LOGGER.fatal(
- READ_HEAP_FILE_NODE_FAILED + " read record failed",
- exception);
- throw new HeapException(READ_HEAP_FILE_NODE_FAILED, exception);
- }
-
- readHeapRecordMap.put(positionInFile, heapRecord);
- }
- return heapRecord;
- }
-
- private boolean assertPositionInFile(final long positionInFile)
- throws HeapException {
- if (positionInFile < header.getRecordSize()) {
- LOGGER.fatal(READ_HEAP_FILE_NODE_FAILED + " position in heap file "
- + positionInFile + " in header of size="
- + header.getRecordSize());
- throw new HeapException(READ_HEAP_FILE_NODE_FAILED);
- }
- return true;
- }
-
- @Override
- public void appendHeapFileRecord(final IFileStorable heapRecord)
- throws HeapException {
- final long positionInFile = heapRecord.getPositionInFile();
- // ASSERTX
- assert assertTransactionOpened();
- // ASSERTX
- assert assertPositionInFile(positionInFile);
- IFileStorable previous = heapRecordToWriteMap.put(positionInFile,
- heapRecord);
- // ASSERTX
- assert assertNoPreviousOrPreviousSameAsCurrent(previous, heapRecord);
- if (previous == null) {
- previous = readHeapRecordMap.remove(positionInFile);
- // ASSERTX
- assert assertNoPreviousOrPreviousSameAsCurrent(previous, heapRecord);
- } else {
- // ASSERTX
- assert !readHeapRecordMap.containsKey(positionInFile) : "heap record must not be in read cache";
- }
- }
-
- private boolean assertNoPreviousOrPreviousSameAsCurrent(
- final IFileStorable previous, final IFileStorable current)
- throws HeapException {
- if (previous != null && previous != current) {// NOPMD I want to compare
- // reference
- mustNotHavePreviousException(previous, current);
- }
- return true;
- }
-
- private void mustNotHavePreviousException(final IFileStorable previous,
- final IFileStorable current) throws HeapException {
- throw new HeapException(
- "must not have a previous heap record: current=\n"
- + current.toString() + "\nprevious=\n"
- + previous.toString());
- }
-
- @Override
- public void delete(final long positionInFile) throws HeapException {
- // delete case : can be deleted even if not read nor write
- readHeapRecordMap.remove(positionInFile);
- heapRecordToWriteMap.remove(positionInFile);
- }
-
- @Override
- public int getNumberOfHeaprecordInMemory() {
- return readHeapRecordMap.size() + heapRecordToWriteMap.size();
- }
-
- @Override
- public void setDataRecordKeyManager(
- final IDataRecordKeyManager dataRecordKeyManager) {
- this.dataRecordKeyManager = dataRecordKeyManager;
- }
-
- @Override
- public IDataRecordKeyManager getDataRecordKeyManager() {
- return dataRecordKeyManager;
- }
-
- /**
- * FOR TEST ONLY<br>
- *
- * @param positionInFile
- * heap record position in file
- * @return heap record in read cache for position in file, null if none
- */
- @Fortest
- public IFileStorable getHeapFileRecordInReadCache(final long positionInFile) {
- return readHeapRecordMap.get(positionInFile);
- }
-
- /**
- * FOR TEST ONLY<br>
- *
- * @param positionInFile
- * heap record position in file
- * @return heap record in write cache for position in file, null if none
- */
- @Fortest
- public IFileStorable getHeapFileRecordInWriteCache(final long positionInFile) {
- return heapRecordToWriteMap.get(positionInFile);
- }
-}
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapFreeNodeManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapFreeNodeManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapFreeNodeManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -20,6 +20,7 @@
import net.sf.joafip.heapfile.record.entity.HeapFreeNode;
import net.sf.joafip.heapfile.record.entity.HeapHeader;
import net.sf.joafip.heapfile.record.entity.HeapRecord;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTNode;
import net.sf.joafip.redblacktree.entity.RBTSentinel;
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapIdNodeManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapIdNodeManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/HeapIdNodeManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -21,6 +21,7 @@
import net.sf.joafip.heapfile.record.entity.HeapIdNode;
import net.sf.joafip.heapfile.record.entity.HeapRecord;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTNode;
import net.sf.joafip.redblacktree.entity.RBTSentinel;
Deleted: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapElementManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapElementManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapElementManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -1,175 +0,0 @@
-/*
- * 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.heapfile.record.service;
-
-import net.sf.joafip.heapfile.record.entity.HeapHeader;
-import net.sf.joafip.kvstore.entity.IFileStorable;
-import net.sf.joafip.kvstore.record.service.IDataRecordKeyManager;
-import net.sf.joafip.kvstore.service.HeapException;
-import net.sf.joafip.kvstore.service.IFileForStorable;
-
-/**
- * Heap elements manager in heap file interface.<br>
- * elements are one header and the heap records<br>
- * heap element are heap header, heap record, and data block<br>
- * make able to get the heap element for read and possible modification<br>
- * the closing save the header and records modification<br>
- *
- * @author luc peuvrier
- *
- */
-public interface IHeapElementManager {
-
- /**
- *
- * @return file used by heap element manager
- */
- IFileForStorable getFileForStorable();
-
- /**
- * check file stable state, restore if possible<br>
- * service must not be started<br>
- * must be called before heap file access<br>
- *
- * @return true if file restored ( from backup to data or data to backup )
- * @throws HeapException
- * no file in stable state, no files in stable state
- */
- boolean wasBadFileStableState() throws HeapException;
-
- /**
- * the returned value is set by {@link #wasBadFileStableState()}
- *
- * @return true if data loose detected by {@link #wasBadFileStableState()}
- */
- boolean isDataLost();
-
- void removeFiles() throws HeapException;
-
- void clear() throws HeapException;
-
- /**
- * start heap record management service<br>
- *
- * @throws HeapException
- * file access error
- *
- * file data corrupted
- */
- void startService() throws HeapException;
-
- /**
- * stop heap record management service<br>
- *
- * @throws HeapException
- *
- */
- void stopService() throws HeapException;
-
- /**
- *
- * @return true if heap file management service is started
- */
- boolean isServiceStarted();
-
- /**
- * open the heap file transaction management
- *
- * @throws HeapException
- *
- */
- void openTransaction() throws HeapException;
-
- /**
- * close the heap file transaction management committing the modifications
- * to the file before
- *
- * @throws HeapException
- *
- */
- void closeTransaction() throws HeapException;
-
- /**
- * close the heap file transaction management without commit modification in
- * file
- *
- * @throws HeapException
- *
- */
- void closeTransactionDiscardChange() throws HeapException;
-
- /**
- *
- * @return true if heap file transaction opened
- */
- boolean isTransactionOpened();
-
- /**
- * set heap header
- *
- * @param heapHeader
- * @throws HeapException
- */
- void setHeapHeader(IFileStorable heapHeader) throws HeapException;
-
- /**
- *
- * @return the heap header in file
- * @throws HeapException
- */
- IFileStorable getHeapHeader() throws HeapException;
-
- /**
- * read heap record in file
- *
- * @param positionInFile
- * heap record position in file
- * @return heap file record
- * @throws HeapException
- *
- */
- IFileStorable readHeapFileDataRecord(final long positionInFile)
- throws HeapException;
-
- /**
- * append an heap file record that will be to write in file
- *
- * @param heapRecord
- * the heap file record to append
- * @throws HeapException
- */
- void appendHeapFileRecord(IFileStorable heapRecord) throws HeapException;
-
- /**
- *
- * @param positionInFile
- * @throws HeapException
- */
- void delete(long positionInFile) throws HeapException;
-
- /**
- * @return file for storage size
- * @throws HeapException
- */
- long getFileSize() throws HeapException;
-
- int getNumberOfHeaprecordInMemory();
-
- void setDataRecordKeyManager(IDataRecordKeyManager dataRecordKeyComparator);
-
- IDataRecordKeyManager getDataRecordKeyManager();
-}
Deleted: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapRecordFactory.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapRecordFactory.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/record/service/IHeapRecordFactory.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -1,38 +0,0 @@
-/*
- * 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.heapfile.record.service;
-
-import net.sf.joafip.kvstore.entity.IFileStorable;
-import net.sf.joafip.kvstore.service.HeapException;
-
-/**
- *
- * @author luc peuvrier
- *
- */
-public interface IHeapRecordFactory {
-
- IFileStorable createHeapRecord(HeapElementManager heapElementManager,
- long positionInFile) throws HeapException;
-}
Modified: trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/service/HeapFileDataManager.java
===================================================================
--- trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/service/HeapFileDataManager.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/main/java/net/sf/joafip/heapfile/service/HeapFileDataManager.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -32,15 +32,15 @@
import net.sf.joafip.heapfile.record.entity.HeapHeader;
import net.sf.joafip.heapfile.record.entity.HeapIdNode;
import net.sf.joafip.heapfile.record.entity.HeapRecord;
-import net.sf.joafip.heapfile.record.service.HeapElementManager;
import net.sf.joafip.heapfile.record.service.HeapFreeNodeManager;
import net.sf.joafip.heapfile.record.service.HeapIdNodeManager;
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
-import net.sf.joafip.heapfile.record.service.IHeapRecordFactory;
import net.sf.joafip.kvstore.entity.EnumFileState;
import net.sf.joafip.kvstore.entity.IFileStorable;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.HeapElementManager;
import net.sf.joafip.kvstore.record.service.IDataRecordKeyManager;
+import net.sf.joafip.kvstore.record.service.IHeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapRecordFactory;
import net.sf.joafip.kvstore.service.AbstractHeapDataManager;
import net.sf.joafip.kvstore.service.FileForStorable;
import net.sf.joafip.kvstore.service.HeapException;
Modified: trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/TestIdNode.java
===================================================================
--- trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/TestIdNode.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/TestIdNode.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -26,10 +26,10 @@
import net.sf.joafip.heapfile.record.entity.HeapHeader;
import net.sf.joafip.heapfile.record.entity.HeapIdNode;
import net.sf.joafip.heapfile.record.entity.HeapRecord;
-import net.sf.joafip.heapfile.record.service.HeapElementManager;
-import net.sf.joafip.heapfile.record.service.IHeapRecordFactory;
import net.sf.joafip.kvstore.entity.IFileStorable;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.HeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapRecordFactory;
import net.sf.joafip.kvstore.service.FileForStorable;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.service.RBTException;
Deleted: trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/entity/RecordForTest.java
===================================================================
--- trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/entity/RecordForTest.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/entity/RecordForTest.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -1,114 +0,0 @@
-package net.sf.joafip.heapfile.record.entity;
-
-/*
- * 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.
- */
-
-import net.sf.joafip.heapfile.record.service.IHeapElementManager;
-import net.sf.joafip.kvstore.entity.AbstractFileStorable;
-import net.sf.joafip.kvstore.service.HeapException;
-
-/**
- *
- * @author luc peuvrier
- *
- */
-public class RecordForTest extends AbstractFileStorable {
-
- private final int recordSize;
-
- private int value;
-
- public RecordForTest(final IHeapElementManager heapElementManager,
- final long positionInFile, final int recordSize) {
- super(heapElementManager.getFileForStorable(), positionInFile);
- this.recordSize = recordSize;
- }
-
- @Override
- public long getPreviousRecordPositionInFile() throws HeapException {
- throw new HeapException("unsupported");
- }
-
- @Override
- public int getRecordSize() throws HeapException {
- return recordSize;
- }
-
- @Override
- protected int toMarshallSize() throws HeapException {
- return 8;// integer vale and integer crc32
- }
-
- @Override
- protected void valueChangedAction() throws HeapException {
- // no implementation
- }
-
- public int getValue() {
- return value;
- }
-
- public void setValue(final int value) throws HeapException {
- this.value = value;
- setValueIsChangedValueToSave();
- }
-
- @Override
- protected void unmarshallImpl() throws HeapException {
- readFileToIoBuffer(8);
- value = readInteger();
- readAndCheckCrc32();
- }
-
- @Override
- protected void marshallImpl() throws HeapException {
- writeInteger(value);
- writeCrc32();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + recordSize;
- result = prime * result + value;
- return result;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj)
- return true;
- if (!super.equals(obj))
- return false;
- if (getClass() != obj.getClass())
- return false;
- RecordForTest other = (RecordForTest) obj;
- if (recordSize != other.recordSize)
- return false;
- if (value != other.value)
- return false;
- return true;
- }
-}
Modified: trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapElementManagerWithHeapRecord.java
===================================================================
--- trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapElementManagerWithHeapRecord.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapElementManagerWithHeapRecord.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -27,6 +27,8 @@
import net.sf.joafip.heapfile.record.entity.HeapRecord;
import net.sf.joafip.kvstore.entity.IFileStorable;
import net.sf.joafip.kvstore.record.entity.DataRecordIdentifier;
+import net.sf.joafip.kvstore.record.service.HeapElementManager;
+import net.sf.joafip.kvstore.record.service.IHeapRecordFactory;
import net.sf.joafip.kvstore.service.FileForStorable;
import net.sf.joafip.kvstore.service.HeapException;
import net.sf.joafip.redblacktree.entity.IRBTNode;
Modified: trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapRecordManage.java
===================================================================
--- trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapRecordManage.java 2012-04-18 08:20:01 UTC (rev 3017)
+++ trunk/joafip-heapfile/src/test/java/net/sf/joafip/heapfile/record/service/TestHeapRecordManage.java 2012-04-18 08:49:04 UTC (rev 3018)
@@ -28,6 +28,9 @@
import net.sf.joafip.heapfile.record.entity...
[truncated message content] |