diff --git a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupFileProvider.java b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupFileProvider.java index 092c68c8..28dc5c17 100644 --- a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupFileProvider.java +++ b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupFileProvider.java @@ -23,11 +23,11 @@ import static org.eclipse.serializer.util.X.mayNull; import static org.eclipse.serializer.util.X.notNull; -import org.eclipse.store.afs.nio.types.NioFileSystem; import org.eclipse.serializer.afs.types.ADirectory; import org.eclipse.serializer.afs.types.AFile; import org.eclipse.serializer.afs.types.AFileSystem; import org.eclipse.serializer.persistence.internal.PersistenceTypeDictionaryFileHandler; +import org.eclipse.store.afs.nio.types.NioFileSystem; public interface StorageBackupFileProvider extends StorageFileProvider @@ -48,6 +48,8 @@ public StorageBackupTransactionsFile provideBackupTransactionsFile( int channelIndex ); + public AFile provideTypeDictionaryFile(); + public static StorageBackupFileProvider New() @@ -137,6 +139,12 @@ public StorageBackupTransactionsFile provideBackupTransactionsFile( return StorageBackupTransactionsFile.New(file, channelIndex); } + + @Override + public AFile provideTypeDictionaryFile() + { + return this.defineTypeDictionaryFile(); + } } diff --git a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupHandler.java b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupHandler.java index 6fadad84..e89442f8 100644 --- a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupHandler.java +++ b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupHandler.java @@ -26,6 +26,8 @@ import org.eclipse.serializer.afs.types.AFile; import org.eclipse.serializer.collections.BulkList; import org.eclipse.serializer.collections.EqHashTable; +import org.eclipse.serializer.persistence.types.PersistenceTypeDictionaryExporter; +import org.eclipse.serializer.persistence.types.PersistenceTypeDictionaryStorer; import org.eclipse.serializer.util.X; import org.eclipse.serializer.util.logging.Logging; import org.eclipse.store.storage.exceptions.StorageExceptionBackup; @@ -59,11 +61,7 @@ public void deleteFile( StorageLiveChannelFile file ); - public default StorageBackupHandler start() - { - this.setRunning(true); - return this; - } + public StorageBackupHandler start(); public default StorageBackupHandler stop() { @@ -86,7 +84,8 @@ public static StorageBackupHandler New( final StorageBackupItemQueue itemQueue , final StorageOperationController operationController, final StorageWriteController writeController , - final StorageDataFileValidator.Creator validatorCreator + final StorageDataFileValidator.Creator validatorCreator , + final StorageTypeDictionary typeDictionary ) { final StorageBackupFileProvider backupFileProvider = backupSetup.backupFileProvider(); @@ -102,11 +101,12 @@ public static StorageBackupHandler New( notNull(itemQueue) , notNull(operationController), notNull(writeController) , - notNull(validatorCreator) + notNull(validatorCreator) , + notNull(typeDictionary) ); } - public final class Default implements StorageBackupHandler, StorageBackupInventory + public final class Default implements StorageBackupHandler, StorageBackupInventory, PersistenceTypeDictionaryStorer { private final static Logger logger = Logging.getLogger(Default.class); @@ -114,12 +114,14 @@ public final class Default implements StorageBackupHandler, StorageBackupInvento // instance fields // //////////////////// - private final StorageBackupSetup backupSetup ; - private final ChannelInventory[] channelInventories ; - private final StorageBackupItemQueue itemQueue ; - private final StorageOperationController operationController; - private final StorageWriteController writeController ; - private final StorageDataFileValidator.Creator validatorCreator ; + private final StorageBackupSetup backupSetup ; + private final ChannelInventory[] channelInventories ; + private final StorageBackupItemQueue itemQueue ; + private final StorageOperationController operationController ; + private final StorageWriteController writeController ; + private final StorageDataFileValidator.Creator validatorCreator ; + private final StorageTypeDictionary typeDictionary ; + private final PersistenceTypeDictionaryExporter typeDictionaryExporter; private boolean running; // being "ordered" to run. private boolean active ; // being actually active, e.g. executing the last loop before running check. @@ -137,16 +139,20 @@ public final class Default implements StorageBackupHandler, StorageBackupInvento final StorageBackupItemQueue itemQueue , final StorageOperationController operationController, final StorageWriteController writeController , - final StorageDataFileValidator.Creator validatorCreator + final StorageDataFileValidator.Creator validatorCreator , + final StorageTypeDictionary typeDictionary ) { super(); - this.channelInventories = channelInventories ; - this.backupSetup = backupSetup ; - this.itemQueue = itemQueue ; - this.operationController = operationController; - this.writeController = writeController ; - this.validatorCreator = validatorCreator ; + this.channelInventories = channelInventories ; + this.backupSetup = backupSetup ; + this.itemQueue = itemQueue ; + this.operationController = operationController; + this.writeController = writeController ; + this.validatorCreator = validatorCreator ; + this.typeDictionary = typeDictionary ; + + this.typeDictionaryExporter = PersistenceTypeDictionaryExporter.New(this); } @@ -173,6 +179,14 @@ public final synchronized boolean isActive() return this.active; } + @Override + public final StorageBackupHandler start() + { + this.ensureTypeDictionaryBackup(); + this.setRunning(true); + return this; + } + /** * Initiate a controlled shutdown of the StorageBackupHandler * after processing all currently enqueued items. @@ -238,6 +252,12 @@ public void synchronize(final StorageInventory storageInventory) } } + @Override + public void storeTypeDictionary(final String typeDictionaryString) + { + this.setup().backupFileProvider().provideTypeDictionaryIoHandler().storeTypeDictionary(typeDictionaryString); + } + @Override public void run() { @@ -279,6 +299,19 @@ public void run() } + private void ensureTypeDictionaryBackup() + { + if(!this.setup().backupFileProvider().provideTypeDictionaryFile().exists()) + { + logger.debug("Creating new type dictionary backup"); + this.typeDictionaryExporter.exportTypeDictionary(this.typeDictionary); + } + else + { + logger.debug("Existing type dictionary backup found"); + } + } + private void tryInitialize(final int channelIndex) { final ChannelInventory backupInventory = this.channelInventories[channelIndex]; diff --git a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupSetup.java b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupSetup.java index 9e880903..ea46c49f 100644 --- a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupSetup.java +++ b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageBackupSetup.java @@ -1,5 +1,7 @@ package org.eclipse.store.storage.types; +import static org.eclipse.serializer.util.X.notNull; + /*- * #%L * Eclipse Store Storage @@ -22,8 +24,6 @@ import org.eclipse.serializer.afs.types.ADirectory; -import static org.eclipse.serializer.util.X.notNull; - public interface StorageBackupSetup { public StorageBackupFileProvider backupFileProvider(); @@ -35,7 +35,8 @@ public StorageFileWriter.Provider setupWriterProvider( public StorageBackupHandler setupHandler( StorageOperationController operationController , StorageWriteController writeController , - StorageDataFileValidator.Creator backupDataFileValidatorCreator + StorageDataFileValidator.Creator backupDataFileValidatorCreator, + StorageTypeDictionary storageTypeDictionary ); @@ -135,7 +136,8 @@ public StorageFileWriter.Provider setupWriterProvider( public StorageBackupHandler setupHandler( final StorageOperationController operationController, final StorageWriteController writeController , - final StorageDataFileValidator.Creator validatorCreator + final StorageDataFileValidator.Creator validatorCreator , + final StorageTypeDictionary typeDictionary ) { final int channelCount = operationController.channelCountProvider().getChannelCount(); @@ -145,7 +147,8 @@ public StorageBackupHandler setupHandler( this.itemQueue , operationController, writeController , - validatorCreator + validatorCreator , + typeDictionary ); } diff --git a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageSystem.java b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageSystem.java index c9916627..0e567d9d 100644 --- a/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageSystem.java +++ b/storage/storage/src/main/java/org/eclipse/store/storage/types/StorageSystem.java @@ -26,9 +26,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; -import org.eclipse.store.storage.exceptions.StorageExceptionInitialization; -import org.eclipse.store.storage.exceptions.StorageExceptionNotAcceptingTasks; -import org.eclipse.store.storage.exceptions.StorageExceptionNotRunning; import org.eclipse.serializer.afs.types.AFileSystem; import org.eclipse.serializer.meta.XDebug; import org.eclipse.serializer.persistence.binary.types.ObjectIdsSelector; @@ -37,6 +34,9 @@ import org.eclipse.serializer.persistence.types.Unpersistable; import org.eclipse.serializer.reference.Referencing; import org.eclipse.serializer.util.logging.Logging; +import org.eclipse.store.storage.exceptions.StorageExceptionInitialization; +import org.eclipse.store.storage.exceptions.StorageExceptionNotAcceptingTasks; +import org.eclipse.store.storage.exceptions.StorageExceptionNotRunning; import org.slf4j.Logger; // (21.03.2016 TM)TODO: what is the difference between ~Manager and ~Controller here? Merge into Controller or comment. @@ -346,7 +346,8 @@ private StorageBackupHandler provideBackupHandler() this.backupHandler = this.backupSetup.setupHandler( this.operationController, this.writeController, - this.backupDataFileValidatorCreator + this.backupDataFileValidatorCreator, + this.typeDictionary() ); }