From 0e4cac0fe0e3516b3cab04fc3975c0ba12abdc1a Mon Sep 17 00:00:00 2001 From: lutovich Date: Tue, 17 May 2016 10:44:44 +0300 Subject: [PATCH] Automatic detection of record format This commit removes the need to always explicitly configure record format, if it is something else than default. This means that previously, tools like consistency checked and backup always needed an explicit config parameter `GraphDatabaseSettings.record_format` when applied to a high_limit store. Detection of format happens inside `NeoStoreDataSource` and `StoreFactory`. Later is often directly used by tools like consistency checker. --- .../consistency/ConsistencyCheckService.java | 6 +- .../checking/GraphStoreFixture.java | 26 +- ...etectAllRelationshipInconsistenciesIT.java | 19 +- .../repair/RelationshipChainExplorerTest.java | 6 +- .../consistency/store/StoreAssertions.java | 9 +- .../ParallelBatchImporterTest.java | 9 +- .../org/neo4j/kernel/NeoStoreDataSource.java | 24 +- .../impl/factory/CommunityEditionModule.java | 3 - .../kernel/impl/factory/DataSourceModule.java | 3 +- .../kernel/impl/factory/EditionModule.java | 3 - .../recordstorage/RecordStorageEngine.java | 12 +- .../neo4j/kernel/impl/store/StoreAccess.java | 5 +- .../neo4j/kernel/impl/store/StoreFactory.java | 67 ++-- .../impl/store/format/BaseRecordFormats.java | 10 +- .../store/format/RecordFormatSelector.java | 269 +++++++++----- .../impl/store/format/RecordFormats.java | 2 + .../store/format/standard/StandardV2_0.java | 3 +- .../store/format/standard/StandardV2_1.java | 3 +- .../store/format/standard/StandardV2_2.java | 3 +- .../store/format/standard/StandardV2_3.java | 3 +- .../store/format/standard/StandardV3_0.java | 2 +- .../PropertyDeduplicator.java | 11 +- .../participant/StoreMigrator.java | 14 +- .../internal/BatchInserterImpl.java | 12 +- .../batchimport/store/BatchingNeoStores.java | 6 +- ...ropertyPhysicalToLogicalConverterTest.java | 4 +- .../api/store/StorePropertyCursorTest.java | 3 +- .../kernel/impl/core/ManyPropertyKeysIT.java | 4 +- .../impl/store/FreeIdsAfterRecoveryTest.java | 5 +- ...dGeneratorRebuildFailureEmulationTest.java | 3 +- .../impl/store/LabelTokenStoreTest.java | 5 +- .../kernel/impl/store/MetaDataStoreTest.java | 5 +- .../kernel/impl/store/NeoStoresTest.java | 56 ++- .../kernel/impl/store/NodeStoreTest.java | 3 +- .../kernel/impl/store/PropertyStoreTest.java | 6 +- .../store/RecordStoreConsistentReadTest.java | 4 +- .../store/RelationshipGroupStoreTest.java | 3 +- .../kernel/impl/store/SchemaStoreTest.java | 3 +- .../kernel/impl/store/StoreFactoryTest.java | 8 +- .../kernel/impl/store/TestArrayStore.java | 3 +- .../kernel/impl/store/TestDynamicStore.java | 4 +- .../impl/store/TestGraphProperties.java | 4 +- .../store/TestGrowingFileMemoryMapping.java | 3 +- .../impl/store/TestIdGeneratorRebuilding.java | 10 +- .../kernel/impl/store/UpgradeStoreIT.java | 5 +- .../impl/store/counts/CountsComputerTest.java | 3 +- .../RecordFormatPropertyConfiguratorTest.java | 6 + .../storemigration/MigrationTestUtils.java | 4 +- .../participant/StoreMigratorTest.java | 10 +- .../state/ApplyRecoveredTransactionsTest.java | 3 +- .../transaction/state/NodeCommandTest.java | 4 +- .../state/NodeLabelsFieldTest.java | 4 +- .../state/PrepareTrackingRecordFormats.java | 6 + .../state/RelationshipGroupGetterTest.java | 6 +- .../test/rule/NeoStoreDataSourceRule.java | 4 +- .../org/neo4j/test/rule/NeoStoresRule.java | 27 +- .../test/rule/RecordStorageEngineRule.java | 16 +- .../unsafe/batchinsert/BatchInsertTest.java | 4 +- .../batchimport/PropertyEncoderStepTest.java | 6 +- .../upgrade/StoreUpgradeOnStartupTest.java | 4 +- .../StoreUpgraderInterruptionTestIT.java | 8 +- .../test/java/upgrade/StoreUpgraderTest.java | 36 +- .../java/org/neo4j/backup/BackupService.java | 6 +- .../org/neo4j/backup/BackupEmbeddedIT.java | 45 ++- .../org/neo4j/backup/BackupServiceIT.java | 21 +- .../java/org/neo4j/backup/EmbeddedServer.java | 2 - .../neo4j/backup/IncrementalBackupTests.java | 12 +- .../java/org/neo4j/backup/TestBackup.java | 36 +- .../org/neo4j/backup/TestConfiguration.java | 11 +- .../neo4j/com/storecopy/StoreCopyClient.java | 2 - .../org/neo4j/com/StoreIdTestFactory.java | 6 +- .../neo4j/com/storecopy/ResponsePackerIT.java | 11 +- .../com/storecopy/StoreCopyClientTest.java | 41 +-- .../factory/HighlyAvailableEditionModule.java | 3 - .../test/java/org/neo4j/ha/BackupHaIT.java | 14 +- .../java/org/neo4j/ha/TestBranchedData.java | 7 +- .../impl/labelscan/LabelScanStoreHaIT.java | 3 - .../kernel/ha/OnDiskLastTxIdGetterTest.java | 6 +- .../neo4j/kernel/impl/ha/ClusterManager.java | 4 +- .../enterprise/EnterpriseEditionModule.java | 2 - .../store/format/highlimit/HighLimit.java | 2 +- .../StartupConstraintSemanticsTest.java | 8 +- .../format/RecordFormatSelectorTest.java | 339 ++++++++++++++++-- .../ParallelBatchImporterTest.java | 4 +- ...ConsistencyCheckServiceRecordFormatIT.java | 138 +++++++ .../highlimit/HighLimitWithSmallRecords.java | 13 + .../BatchInsertEnterpriseTest.java | 108 +++++- .../upgrade/EnterpriseStoreUpgraderTest.java | 10 +- .../upgrade/RecordFormatsMigrationIT.java | 166 +++++++++ .../java/upgrade/StoreMigratorFrom20IT.java | 60 ++-- .../java/upgrade/StoreMigratorFrom21IT.java | 12 +- .../StoreUpgradeIntegrationTest.java | 20 +- ...CheckPointingLogRotationStressTesting.java | 2 - .../org/neo4j/tools/dump/DumpCountsStore.java | 4 +- .../java/org/neo4j/tools/dump/DumpStore.java | 6 +- .../org/neo4j/tools/dump/DumpStoreChain.java | 3 +- .../neo4j/tools/migration/StoreMigration.java | 13 +- .../neo4j/tools/rawstorereader/RsdrMain.java | 4 +- .../tools/migration/StoreMigrationTest.java | 7 +- .../tools/rebuild/RebuildFromLogsTest.java | 17 +- 100 files changed, 1284 insertions(+), 706 deletions(-) create mode 100644 enterprise/neo4j-enterprise/src/test/java/org/neo4j/consistency/ConsistencyCheckServiceRecordFormatIT.java create mode 100644 enterprise/neo4j-enterprise/src/test/java/upgrade/RecordFormatsMigrationIT.java diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckService.java b/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckService.java index d5c85cf448fa..5e1965039b71 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckService.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckService.java @@ -51,12 +51,10 @@ import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.impl.api.index.IndexStoreView; import org.neo4j.kernel.impl.locking.LockService; -import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreAccess; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.transaction.state.NeoStoreIndexStoreView; import org.neo4j.logging.DuplicatingLog; @@ -125,9 +123,7 @@ public Result runFullConsistencyCheck( final File storeDir, Config tuningConfigu Config consistencyCheckerConfig = tuningConfiguration.with( MapUtil.stringMap( GraphDatabaseSettings.read_only.name(), Settings.TRUE ) ); StoreFactory factory = new StoreFactory( storeDir, consistencyCheckerConfig, - new DefaultIdGeneratorFactory( fileSystem ), pageCache, fileSystem, - RecordFormatSelector.autoSelectFormat( consistencyCheckerConfig, NullLogService.getInstance() ), - logProvider ); + new DefaultIdGeneratorFactory( fileSystem ), pageCache, fileSystem, logProvider ); ConsistencySummaryStatistics summary; // With the added neo4j_home config the logs directory will end up in db location diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/GraphStoreFixture.java b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/GraphStoreFixture.java index ddb42970c957..1f96add92cc4 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/GraphStoreFixture.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/GraphStoreFixture.java @@ -46,20 +46,16 @@ import org.neo4j.kernel.api.impl.index.storage.DirectoryFactory; import org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexProvider; import org.neo4j.kernel.api.index.SchemaIndexProvider; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.api.TransactionRepresentationCommitProcess; import org.neo4j.kernel.impl.api.TransactionToApply; import org.neo4j.kernel.impl.api.index.IndexStoreView; import org.neo4j.kernel.impl.locking.LockService; -import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.NodeLabelsField; import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.StoreAccess; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NeoStoreRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -73,6 +69,7 @@ import org.neo4j.kernel.impl.transaction.tracing.CommitEvent; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.logging.FormattedLogProvider; +import org.neo4j.logging.LogProvider; import org.neo4j.logging.NullLog; import org.neo4j.logging.NullLogProvider; import org.neo4j.storageengine.api.StorageEngine; @@ -84,7 +81,6 @@ import static java.lang.System.currentTimeMillis; import static org.neo4j.consistency.ConsistencyCheckService.defaultConsistencyCheckThreadsNumber; -import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.kernel.impl.api.scan.LabelScanStoreProvider.fullStoreLabelUpdateStream; public abstract class GraphStoreFixture extends PageCacheRule implements TestRule @@ -105,6 +101,10 @@ public abstract class GraphStoreFixture extends PageCacheRule implements TestRul private long arrayPropId; private int relTypeId; private int propKeyId; + + /** + * Record format used to generate initial database. + */ private String formatName = StringUtils.EMPTY; public GraphStoreFixture( boolean keepStatistics, String formatName ) @@ -118,11 +118,6 @@ public GraphStoreFixture( String formatName ) this( false, formatName ); } - public GraphStoreFixture() - { - this( false, StandardV3_0.NAME ); - } - public void apply( Transaction transaction ) throws TransactionFailureException { applyTransaction( transaction ); @@ -134,10 +129,9 @@ public DirectStoreAccess directStoreAccess() { DefaultFileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); PageCache pageCache = getPageCache( fileSystem ); - Config config = new Config( stringMap( GraphDatabaseSettings.record_format.name(), formatName ) ); - neoStore = new StoreFactory( fileSystem, directory, pageCache, - RecordFormatSelector.autoSelectFormat(config, NullLogService.getInstance() ), - NullLogProvider.getInstance() ).openAllNeoStores(); + LogProvider logProvider = NullLogProvider.getInstance(); + StoreFactory storeFactory = new StoreFactory( directory, pageCache, fileSystem, logProvider ); + neoStore = storeFactory.openAllNeoStores(); StoreAccess nativeStores; if ( keepStatistics ) { @@ -428,9 +422,7 @@ protected void applyTransaction( Transaction transaction ) throws TransactionFai // and the next startup of the store would do recovery where the transaction would have been // applied and all would have been well. - GraphDatabaseBuilder builder = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( directory ) - .setConfig( GraphDatabaseSettings.record_format, formatName ); - GraphDatabaseAPI database = (GraphDatabaseAPI) builder.newGraphDatabase(); + GraphDatabaseAPI database = (GraphDatabaseAPI) new TestGraphDatabaseFactory().newEmbeddedDatabase( directory ); try { DependencyResolver dependencyResolver = database.getDependencyResolver(); diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/DetectAllRelationshipInconsistenciesIT.java b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/DetectAllRelationshipInconsistenciesIT.java index 71d05dafbe74..764386e045a9 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/DetectAllRelationshipInconsistenciesIT.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/checking/full/DetectAllRelationshipInconsistenciesIT.java @@ -41,14 +41,12 @@ import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.MyRelTypes; -import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.RelationshipStore; import org.neo4j.kernel.impl.store.StoreAccess; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; -import org.neo4j.kernel.impl.store.format.RecordFormats; +import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.RecordLoad; import org.neo4j.kernel.impl.store.record.RelationshipRecord; import org.neo4j.kernel.internal.GraphDatabaseAPI; @@ -76,8 +74,6 @@ public void shouldDetectSabotagedRelationshipWhereEverItIs() throws Exception // GIVEN a database which lots of relationships GraphDatabaseAPI db = getGraphDatabaseAPI(); Sabotage sabotage; - RecordFormats selectedRecordFormat = RecordFormatSelector.autoSelectFormat( getTuningConfiguration(), - NullLogService.getInstance() ); try { Node[] nodes = new Node[1_000]; @@ -99,8 +95,8 @@ public void shouldDetectSabotagedRelationshipWhereEverItIs() throws Exception // WHEN sabotaging a random relationship DependencyResolver resolver = db.getDependencyResolver(); PageCache pageCache = resolver.resolveDependency( PageCache.class ); - StoreFactory storeFactory = new StoreFactory( fileSystem, directory.directory(), pageCache, - selectedRecordFormat, NullLogProvider.getInstance() ); + + StoreFactory storeFactory = newStoreFactory( pageCache ); try ( NeoStores neoStores = storeFactory.openNeoStores( false, StoreType.RELATIONSHIP ) ) { @@ -120,8 +116,7 @@ public void shouldDetectSabotagedRelationshipWhereEverItIs() throws Exception { DependencyResolver resolver = db.getDependencyResolver(); PageCache pageCache = resolver.resolveDependency( PageCache.class ); - StoreFactory storeFactory = new StoreFactory( fileSystem, directory.directory(), pageCache, - selectedRecordFormat, NullLogProvider.getInstance() ); + StoreFactory storeFactory = newStoreFactory( pageCache ); try ( NeoStores neoStores = storeFactory.openAllNeoStores() ) { @@ -149,6 +144,12 @@ public void shouldDetectSabotagedRelationshipWhereEverItIs() throws Exception } } + private StoreFactory newStoreFactory( PageCache pageCache ) + { + return new StoreFactory( directory.directory(), getTuningConfiguration(), + new DefaultIdGeneratorFactory( fileSystem ), pageCache, fileSystem, NullLogProvider.getInstance() ); + } + private Config getTuningConfiguration() { return new Config( stringMap( GraphDatabaseSettings.pagecache_memory.name(), "8m", diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/repair/RelationshipChainExplorerTest.java b/community/consistency-check/src/test/java/org/neo4j/consistency/repair/RelationshipChainExplorerTest.java index c5daa6726c59..6cb71fe43c2d 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/repair/RelationshipChainExplorerTest.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/repair/RelationshipChainExplorerTest.java @@ -44,7 +44,6 @@ import org.neo4j.test.rule.TargetDirectory; import static org.junit.Assert.assertEquals; -import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.kernel.impl.store.record.RecordLoad.NORMAL; public class RelationshipChainExplorerTest @@ -143,8 +142,9 @@ private StoreAccess createStoreWithOneHighDegreeNodeAndSeveralDegreeTwoNodes( in } database.shutdown(); PageCache pageCache = pageCacheRule.getPageCache( new DefaultFileSystemAbstraction() ); - Config config = new Config( stringMap( GraphDatabaseSettings.record_format.name(), getRecordFormatName() ) ); - return new StoreAccess( new DefaultFileSystemAbstraction(), pageCache, storeDirectory, config ).initialize(); + StoreAccess storeAccess = new StoreAccess( new DefaultFileSystemAbstraction(), pageCache, storeDirectory, + Config.empty() ); + return storeAccess.initialize(); } protected String getRecordFormatName() diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/store/StoreAssertions.java b/community/consistency-check/src/test/java/org/neo4j/consistency/store/StoreAssertions.java index 41f3803cfcaf..5c06649bb4b2 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/store/StoreAssertions.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/store/StoreAssertions.java @@ -42,14 +42,7 @@ private StoreAssertions() public static void assertConsistentStore( File dir ) throws ConsistencyCheckIncompleteException, IOException { - assertConsistentStore( dir, Config.empty() ); - } - - public static void assertConsistentStore( File dir, Config config ) throws ConsistencyCheckIncompleteException, - IOException - { - Map params = config.getParams(); - params.put( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); + Map params = stringMap( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); final Config configuration = new Config( params, GraphDatabaseSettings.class, ConsistencyCheckSettings.class ); final ConsistencyCheckService.Result result = new ConsistencyCheckService().runFullConsistencyCheck( diff --git a/community/consistency-check/src/test/java/org/neo4j/unsafe/impl/batchimport/ParallelBatchImporterTest.java b/community/consistency-check/src/test/java/org/neo4j/unsafe/impl/batchimport/ParallelBatchImporterTest.java index e29ae15eae23..58b9692d1f40 100644 --- a/community/consistency-check/src/test/java/org/neo4j/unsafe/impl/batchimport/ParallelBatchImporterTest.java +++ b/community/consistency-check/src/test/java/org/neo4j/unsafe/impl/batchimport/ParallelBatchImporterTest.java @@ -19,7 +19,6 @@ */ package org.neo4j.unsafe.impl.batchimport; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableLong; import org.junit.Rule; import org.junit.Test; @@ -58,6 +57,7 @@ import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.logging.NullLogService; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.Randoms; import org.neo4j.test.TestGraphDatabaseFactory; @@ -72,6 +72,7 @@ import org.neo4j.unsafe.impl.batchimport.input.Inputs; import org.neo4j.unsafe.impl.batchimport.input.SimpleInputIterator; import org.neo4j.unsafe.impl.batchimport.staging.ExecutionMonitor; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -180,7 +181,6 @@ public void shouldImportCsvData() throws Exception // THEN GraphDatabaseService db = new TestGraphDatabaseFactory() .newEmbeddedDatabaseBuilder( directory.graphDbDir() ) - .setConfig( GraphDatabaseSettings.record_format, getFormatName() ) .newGraphDatabase(); try ( Transaction tx = db.beginTx() ) { @@ -228,8 +228,7 @@ private void assertConsistent( File storeDir ) throws ConsistencyCheckIncomplete { ConsistencyCheckService consistencyChecker = new ConsistencyCheckService(); Result result = consistencyChecker.runFullConsistencyCheck( storeDir, - new Config( stringMap( GraphDatabaseSettings.pagecache_memory.name(), "8m", - GraphDatabaseSettings.record_format.name(), getFormatName()) ), + new Config( stringMap( GraphDatabaseSettings.pagecache_memory.name(), "8m" ) ), ProgressMonitorFactory.NONE, NullLogProvider.getInstance(), false ); assertTrue( "Database contains inconsistencies, there should be a report in " + storeDir, @@ -238,7 +237,7 @@ private void assertConsistent( File storeDir ) throws ConsistencyCheckIncomplete protected String getFormatName() { - return StringUtils.EMPTY; + return StandardV3_0.NAME; } public abstract static class InputIdGenerator diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index 29c0dc632b98..ed2a499d4280 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -259,7 +259,6 @@ boolean applicable( DiagnosticsPhase phase ) private final Log msgLog; private final LogService logService; private final AutoIndexing autoIndexing; - private final RecordFormats formats; private final LogProvider logProvider; private final DependencyResolver dependencyResolver; private final TokenNameLookup tokenNameLookup; @@ -335,8 +334,7 @@ public NeoStoreDataSource( Monitors monitors, Tracers tracers, Procedures procedures, - IOLimiter ioLimiter, - RecordFormats formats ) + IOLimiter ioLimiter ) { this.storeDir = storeDir; this.config = config; @@ -367,9 +365,6 @@ public NeoStoreDataSource( this.procedures = procedures; this.ioLimiter = ioLimiter; - this.formats = RecordFormatSelector.select( config, formats, logService ); - new RecordFormatPropertyConfigurator( this.formats, this.config ).configure(); - readOnly = config.get( Configuration.read_only ); msgLog = logProvider.getLog( getClass() ); this.lockService = new ReentrantLockService(); @@ -430,6 +425,7 @@ public void start() throws IOException life.add( new Delegate( Lifecycles.multiple( indexProviders.values() ) ) ); // Upgrade the store before we begin + RecordFormats formats = selectStoreFormats( config, storeDir, fs, pageCache, logService ); upgradeStore( formats ); // Build all modules and their services @@ -443,7 +439,7 @@ public void start() throws IOException storageEngine = buildStorageEngine( propertyKeyTokenHolder, labelTokens, relationshipTypeTokens, legacyIndexProviderLookup, - indexConfigStore, updateableSchemaState::clear, legacyIndexTransactionOrdering, formats ); + indexConfigStore, updateableSchemaState::clear, legacyIndexTransactionOrdering ); LogEntryReader logEntryReader = new VersionAwareLogEntryReader<>( storageEngine.commandReaderFactory() ); @@ -531,6 +527,15 @@ public void start() throws IOException databaseHealth.healed(); } + private static RecordFormats selectStoreFormats( Config config, File storeDir, FileSystemAbstraction fs, + PageCache pageCache, LogService logService ) + { + LogProvider logging = logService.getInternalLogProvider(); + RecordFormats formats = RecordFormatSelector.selectNewestFormat( config, storeDir, fs, pageCache, logging ); + new RecordFormatPropertyConfigurator( formats, config ).configure(); + return formats; + } + private void upgradeStore( RecordFormats format ) { LabelScanStoreProvider labelScanStoreProvider = @@ -555,8 +560,7 @@ private StorageEngine buildStorageEngine( PropertyKeyTokenHolder propertyKeyTokenHolder, LabelTokenHolder labelTokens, RelationshipTypeTokenHolder relationshipTypeTokens, LegacyIndexProviderLookup legacyIndexProviderLookup, IndexConfigStore indexConfigStore, - Runnable schemaStateChangeCallback, SynchronizedArrayIdOrderingQueue legacyIndexTransactionOrdering, - RecordFormats format ) + Runnable schemaStateChangeCallback, SynchronizedArrayIdOrderingQueue legacyIndexTransactionOrdering ) { LabelScanStoreProvider labelScanStore = dependencyResolver.resolveDependency( LabelScanStoreProvider.class, HighestSelectionStrategy.getInstance() ); @@ -569,7 +573,7 @@ private StorageEngine buildStorageEngine( fs, logProvider, propertyKeyTokenHolder, labelTokens, relationshipTypeTokens, schemaStateChangeCallback, constraintSemantics, scheduler, tokenNameLookup, lockService, schemaIndexProvider, indexingServiceMonitor, databaseHealth, labelScanStore, legacyIndexProviderLookup, indexConfigStore, - legacyIndexTransactionOrdering, transactionSnapshotSupplier, format ); + legacyIndexTransactionOrdering, transactionSnapshotSupplier ); // We pretend that the storage engine abstract hides all details within it. Whereas that's mostly // true it's not entirely true for the time being. As long as we need this call below, which diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/CommunityEditionModule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/CommunityEditionModule.java index 3309acdd1dec..6134a8860cc1 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/CommunityEditionModule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/CommunityEditionModule.java @@ -47,7 +47,6 @@ import org.neo4j.kernel.impl.locking.ResourceTypes; import org.neo4j.kernel.impl.locking.community.CommunityLockManger; import org.neo4j.kernel.impl.logging.LogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; @@ -110,8 +109,6 @@ public CommunityEditionModule( PlatformModule platformModule ) ioLimiter = IOLimiter.unlimited(); - formats = StandardV3_0.RECORD_FORMATS; - registerRecovery( platformModule.databaseInfo, life, dependencies ); publishEditionInfo( dependencies.resolveDependency( UsageData.class ), platformModule.databaseInfo, config ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java index dcfa2b63f49e..39292fd101b8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java @@ -201,8 +201,7 @@ public DataSourceModule( final GraphDatabaseFacadeFactory.Dependencies dependenc platformModule.monitors, platformModule.tracers, procedures, - editionModule.ioLimiter, - editionModule.formats ) ); + editionModule.ioLimiter ) ); dataSourceManager.register( neoStoreDataSource ); life.add( new MonitorGc( config, logging.getInternalLog( MonitorGc.class ) ) ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/EditionModule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/EditionModule.java index 9f9a84e8db0e..7f8a61cbe786 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/EditionModule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/EditionModule.java @@ -37,7 +37,6 @@ import org.neo4j.kernel.impl.locking.Locks; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.proc.Procedures; -import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; import org.neo4j.kernel.info.DiagnosticsManager; @@ -86,8 +85,6 @@ public interface SPI public IOLimiter ioLimiter; - public RecordFormats formats; - protected void doAfterRecoveryAndStartup( DatabaseInfo databaseInfo, DependencyResolver dependencyResolver ) { DiagnosticsManager diagnosticsManager = dependencyResolver.resolveDependency( DiagnosticsManager.class ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java index 107bab22f5a4..32a72fe4b62d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java @@ -74,7 +74,6 @@ import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.SchemaStorage; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.id.BufferingIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.transaction.command.CacheInvalidationBatchTransactionApplier; @@ -186,8 +185,7 @@ public RecordStorageEngine( LegacyIndexProviderLookup legacyIndexProviderLookup, IndexConfigStore indexConfigStore, IdOrderingQueue legacyIndexTransactionOrdering, - Supplier transactionsSnapshotSupplier, - RecordFormats recordFormats ) + Supplier transactionsSnapshotSupplier ) { this.propertyKeyTokenHolder = propertyKeyTokenHolder; this.relationshipTypeTokenHolder = relationshipTypeTokens; @@ -201,8 +199,6 @@ public RecordStorageEngine( this.constraintSemantics = constraintSemantics; this.legacyIndexTransactionOrdering = legacyIndexTransactionOrdering; - final StoreFactory storeFactory = new StoreFactory( storeDir, config, idGeneratorFactory, - pageCache, fs, recordFormats, logProvider ); if ( safeIdBuffering ) { // This buffering id generator factory will have properly buffering id generators injected into @@ -210,9 +206,11 @@ public RecordStorageEngine( // so we'll initialize it below when all those components have been instantiated. bufferingIdGeneratorFactory = new BufferingIdGeneratorFactory( idGeneratorFactory, transactionsSnapshotSupplier ); - storeFactory.setIdGeneratorFactory( bufferingIdGeneratorFactory ); + + idGeneratorFactory = bufferingIdGeneratorFactory; } - neoStores = storeFactory.openAllNeoStores( true ); + StoreFactory factory = new StoreFactory( storeDir, config, idGeneratorFactory, pageCache, fs, logProvider ); + neoStores = factory.openAllNeoStores( true ); try { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreAccess.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreAccess.java index f58287d42a69..4b514801c28a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreAccess.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreAccess.java @@ -26,8 +26,6 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.api.CountsAccessor; -import org.neo4j.kernel.impl.logging.NullLogService; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord; @@ -87,8 +85,7 @@ public StoreAccess( FileSystemAbstraction fileSystem, PageCache pageCache, File public StoreAccess( FileSystemAbstraction fileSystem, PageCache pageCache, File storeDir, Config config ) { this( new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fileSystem ), pageCache, - fileSystem, RecordFormatSelector.autoSelectFormat(config, NullLogService.getInstance()), - NullLogProvider.getInstance() ).openAllNeoStores() ); + fileSystem, NullLogProvider.getInstance() ).openAllNeoStores() ); this.closeable = true; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreFactory.java index 245c8f3c2ec8..68f7788c05c4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/StoreFactory.java @@ -26,6 +26,7 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.store.format.RecordFormatPropertyConfigurator; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; @@ -59,75 +60,49 @@ public class StoreFactory public static final String RELATIONSHIP_GROUP_STORE_NAME = ".relationshipgroupstore.db"; public static final String COUNTS_STORE = ".counts.db"; - private Config config; - private IdGeneratorFactory idGeneratorFactory; - private FileSystemAbstraction fileSystemAbstraction; - private LogProvider logProvider; - private File neoStoreFileName; - private PageCache pageCache; - private RecordFormats recordFormats; + private final Config config; + private final IdGeneratorFactory idGeneratorFactory; + private final FileSystemAbstraction fileSystemAbstraction; + private final LogProvider logProvider; + private final File neoStoreFileName; + private final PageCache pageCache; + private final RecordFormats recordFormats; - public StoreFactory() + public StoreFactory( File storeDir, PageCache pageCache, FileSystemAbstraction fileSystem, LogProvider logProvider ) { + this( storeDir, Config.defaults(), new DefaultIdGeneratorFactory( fileSystem ), pageCache, fileSystem, + logProvider ); } - public StoreFactory( FileSystemAbstraction fileSystem, File storeDir, PageCache pageCache, + public StoreFactory( File storeDir, PageCache pageCache, FileSystemAbstraction fileSystem, RecordFormats recordFormats, LogProvider logProvider ) { this( storeDir, Config.defaults(), new DefaultIdGeneratorFactory( fileSystem ), pageCache, fileSystem, recordFormats, logProvider ); } - public StoreFactory( File storeDir, Config config, - IdGeneratorFactory idGeneratorFactory, PageCache pageCache, - FileSystemAbstraction fileSystemAbstraction, RecordFormats recordFormats, LogProvider logProvider ) + public StoreFactory( File storeDir, Config config, IdGeneratorFactory idGeneratorFactory, PageCache pageCache, + FileSystemAbstraction fileSystemAbstraction, LogProvider logProvider ) { - this.config = config; - this.idGeneratorFactory = idGeneratorFactory; - this.fileSystemAbstraction = fileSystemAbstraction; - this.recordFormats = recordFormats; - new RecordFormatPropertyConfigurator( recordFormats, config ).configure(); - - setLogProvider( logProvider ); - setStoreDir( storeDir ); - this.pageCache = pageCache; + this( storeDir, config, idGeneratorFactory, pageCache, fileSystemAbstraction, + RecordFormatSelector.selectForStoreOrConfig( config, storeDir, fileSystemAbstraction, pageCache, logProvider ), + logProvider ); } - public void setConfig( Config config ) + public StoreFactory( File storeDir, Config config, IdGeneratorFactory idGeneratorFactory, PageCache pageCache, + FileSystemAbstraction fileSystemAbstraction, RecordFormats recordFormats, LogProvider logProvider ) { this.config = config; - } - - public void setIdGeneratorFactory( IdGeneratorFactory idGeneratorFactory ) - { this.idGeneratorFactory = idGeneratorFactory; - } - - public void setFileSystemAbstraction( FileSystemAbstraction fileSystemAbstraction ) - { this.fileSystemAbstraction = fileSystemAbstraction; - } + this.recordFormats = recordFormats; + new RecordFormatPropertyConfigurator( recordFormats, config ).configure(); - public void setLogProvider( LogProvider logProvider ) - { this.logProvider = logProvider; - } - - public void setStoreDir( File storeDir ) - { this.neoStoreFileName = new File( storeDir, MetaDataStore.DEFAULT_NAME ); - } - - public void setPageCache( PageCache pageCache ) - { this.pageCache = pageCache; } - public void setRecordFormat( RecordFormats formats ) - { - this.recordFormats = formats; - } - /** * Open {@link NeoStores} with all possible stores. If some store does not exist it will not be created. * @return container with all opened stores diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/BaseRecordFormats.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/BaseRecordFormats.java index ecfd3666ff62..3b5d2b9b8c77 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/BaseRecordFormats.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/BaseRecordFormats.java @@ -35,15 +35,23 @@ public abstract class BaseRecordFormats implements RecordFormats { private final int generation; private final Capability[] capabilities; + private final String name; private final String storeVersion; - protected BaseRecordFormats( String storeVersion, int generation, Capability... capabilities ) + protected BaseRecordFormats( String name, String storeVersion, int generation, Capability... capabilities ) { + this.name = name; this.storeVersion = storeVersion; this.generation = generation; this.capabilities = capabilities; } + @Override + public String name() + { + return name; + } + @Override public String storeVersion() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormatSelector.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormatSelector.java index 5397279da15c..77ea91e57dbe 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormatSelector.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormatSelector.java @@ -21,33 +21,41 @@ import org.apache.commons.lang3.StringUtils; +import java.io.File; +import java.io.IOException; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.helpers.Service; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.logging.LogService; -import org.neo4j.kernel.impl.logging.NullLogService; +import org.neo4j.kernel.impl.store.MetaDataStore; +import org.neo4j.kernel.impl.store.format.standard.MetaDataRecordFormat; import org.neo4j.kernel.impl.store.format.standard.StandardV2_0; import org.neo4j.kernel.impl.store.format.standard.StandardV2_1; import org.neo4j.kernel.impl.store.format.standard.StandardV2_2; import org.neo4j.kernel.impl.store.format.standard.StandardV2_3; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; -import org.neo4j.logging.Log; +import org.neo4j.logging.LogProvider; +import org.neo4j.logging.NullLogProvider; import static java.util.Arrays.asList; import static org.neo4j.helpers.collection.Iterables.concat; import static org.neo4j.helpers.collection.Iterables.map; +import static org.neo4j.kernel.impl.store.MetaDataStore.Position.STORE_VERSION; /** * Selects record format that will be used in a database. - * Support two types of selection : config based or automatic. + * Supports selection based on the existing store and given configuration. *

* Automatic selection is used by various tools and tests that should pretend being format independent (for - * example backup) + * example backup). */ public class RecordFormatSelector { - - private static final RecordFormats DEFAULT_AUTOSELECT_FORMAT = StandardV3_0.RECORD_FORMATS; + private static final RecordFormats DEFAULT_FORMAT = StandardV3_0.RECORD_FORMATS; private static final Iterable KNOWN_FORMATS = asList( StandardV2_0.RECORD_FORMATS, @@ -57,48 +65,20 @@ public class RecordFormatSelector StandardV3_0.RECORD_FORMATS ); - /** - * Select record formats based on provided format name in - * {@link GraphDatabaseSettings#record_format} property - * - * @param config database configuration - * @param logService logging service - * @return configured record formats - * @throws IllegalArgumentException if requested format not found - */ - public static RecordFormats select( Config config, LogService logService ) + private RecordFormatSelector() { - String recordFormat = configuredRecordFormat( config ); - RecordFormats formats = loadRecordFormat( recordFormat ); - if ( formats == null ) - { - handleMissingFormat( recordFormat, logService ); - } - logSelectedFormat( logService, formats ); - return formats; + throw new AssertionError( "Not for instantiation!" ); } /** - * Select record formats based on provided format name in - * {@link GraphDatabaseSettings#record_format} property - * If property not specified provided defaultFormat will be return instead. + * Select {@link #DEFAULT_FORMAT} record format. * - * @param config database configuration - * @param defaultFormat default format - * @param logService logging service - * @return configured or default record format - * @throws IllegalArgumentException if requested format not found + * @return default record format. */ - public static RecordFormats select( Config config, RecordFormats defaultFormat, LogService logService ) + @Nonnull + public static RecordFormats defaultFormat() { - RecordFormats selectedFormat = defaultFormat; - String recordFormat = configuredRecordFormat( config ); - if ( StringUtils.isNotEmpty( recordFormat ) ) - { - selectedFormat = selectSpecificFormat( recordFormat, logService ); - } - logSelectedFormat( logService, selectedFormat ); - return selectedFormat; + return DEFAULT_FORMAT; } /** @@ -108,11 +88,10 @@ public static RecordFormats select( Config config, RecordFormats defaultFormat, * @return record formats * @throws IllegalArgumentException if format for specified store version not found */ + @Nonnull public static RecordFormats selectForVersion( String storeVersion ) { - Iterable currentFormats = - map( RecordFormats.Factory::newInstance, Service.load( RecordFormats.Factory.class ) ); - for ( RecordFormats format : concat( KNOWN_FORMATS, currentFormats ) ) + for ( RecordFormats format : allFormats() ) { if ( format.storeVersion().equals( storeVersion ) ) { @@ -123,46 +102,188 @@ public static RecordFormats selectForVersion( String storeVersion ) } /** - * Select {@link #DEFAULT_AUTOSELECT_FORMAT} record format. + * Select configured record format based on available services in class path. + * Specific format can be specified by {@link GraphDatabaseSettings#record_format} property. + *

+ * If format is not specified {@link #DEFAULT_FORMAT} will be used. * - * @return selected record format. + * @param config configuration parameters + * @param logProvider logging provider + * @return selected record format + * @throws IllegalArgumentException if requested format not found */ - public static RecordFormats autoSelectFormat() + @Nonnull + public static RecordFormats selectForConfig( Config config, LogProvider logProvider ) { - return autoSelectFormat( Config.empty(), NullLogService.getInstance() ); + String recordFormat = configuredRecordFormat( config ); + if ( StringUtils.isEmpty( recordFormat ) ) + { + info( logProvider, "Record format not configured, selected default: " + defaultFormat().name() ); + return defaultFormat(); + } + RecordFormats format = selectSpecificFormat( recordFormat ); + info( logProvider, "Selected record format based on config: " + format.name() ); + return format; } /** - * Select configured record format based on available services in class path. - * Specific format can be specified by {@link GraphDatabaseSettings#record_format} property. + * Select record format for the given store directory. *

- * If format is not specified {@link #DEFAULT_AUTOSELECT_FORMAT} will be used. + * Note: package private only for testing. * - * @param config - configuration parameters - * @param logService - logging service - * @return - selected record format. - * @throws IllegalArgumentException if specific requested format not found + * @param storeDir directory with the store + * @param fs the file system + * @param pageCache page cache to read store files + * @return record format of the given store or null if {@value MetaDataStore#DEFAULT_NAME} file not + * found or can't be read */ - public static RecordFormats autoSelectFormat( Config config, LogService logService ) + @Nullable + static RecordFormats selectForStore( File storeDir, FileSystemAbstraction fs, PageCache pageCache, + LogProvider logProvider ) { - String recordFormat = configuredRecordFormat( config ); - RecordFormats recordFormats = StringUtils.isNotEmpty( recordFormat ) ? - selectSpecificFormat( recordFormat, logService ) : - DEFAULT_AUTOSELECT_FORMAT; - logSelectedFormat( logService, recordFormats ); - return recordFormats; + File neoStoreFile = new File( storeDir, MetaDataStore.DEFAULT_NAME ); + if ( fs.fileExists( neoStoreFile ) ) + { + try + { + long value = MetaDataStore.getRecord( pageCache, neoStoreFile, STORE_VERSION ); + if ( value != MetaDataRecordFormat.FIELD_NOT_PRESENT ) + { + String storeVersion = MetaDataStore.versionLongToString( value ); + + for ( RecordFormats format : allFormats() ) + { + if ( format.storeVersion().equals( storeVersion ) ) + { + info( logProvider, "Selected " + format.name() + " record format from store " + storeDir ); + return format; + } + } + } + } + catch ( IOException e ) + { + info( logProvider, "Unable to read store format: " + e.getMessage() ); + } + } + return null; } - private static RecordFormats selectSpecificFormat( String recordFormat, LogService logService ) + /** + * Select record format for the given store (if exists) or from the given configuration. If there is no store and + * record format is not configured than {@link #DEFAULT_FORMAT} is selected. + * + * @param config configuration parameters + * @param storeDir directory with the store + * @param fs the file system + * @param pageCache page cache to read store files + * @return record format from the store (if it can be read) or configured record format or {@link #DEFAULT_FORMAT} + * @throws IllegalArgumentException when configured format is different from the format present in the store + */ + @Nonnull + public static RecordFormats selectForStoreOrConfig( Config config, File storeDir, FileSystemAbstraction fs, + PageCache pageCache, LogProvider logProvider ) + { + String configFormatName = configuredRecordFormat( config ); + boolean formatConfigured = StringUtils.isNotEmpty( configFormatName ); + + RecordFormats currentFormat = selectForStore( storeDir, fs, pageCache, NullLogProvider.getInstance() ); + boolean storeWithFormatExists = currentFormat != null; + + if ( formatConfigured && storeWithFormatExists ) + { + if ( currentFormat.name().equals( configFormatName ) ) + { + info( logProvider, "Configured format matches format in the store. Selected: " + currentFormat.name() ); + return currentFormat; + } + throw new IllegalArgumentException( String.format( + "Configured format '%s' is different from the actual format in the store '%s'", + configFormatName, currentFormat.name() ) ); + } + + if ( !formatConfigured && storeWithFormatExists ) + { + info( logProvider, "Format not configured. Selected format from the store: " + currentFormat.name() ); + return currentFormat; + } + + if ( formatConfigured ) + { + RecordFormats configuredFormat = loadRecordFormat( configFormatName ); + if ( configuredFormat == null ) + { + throw new IllegalArgumentException( "Unable to load configured format '" + configFormatName + "'" ); + } + info( logProvider, "Selected configured format: " + configFormatName ); + return configuredFormat; + } + + return DEFAULT_FORMAT; + } + + /** + * Select explicitly configured record format (via given {@code config}) or format from the store. If store does + * not exist or has old format ({@link RecordFormats#generation()}) than this method returns + * {@link #DEFAULT_FORMAT}. + * + * @param config configuration parameters + * @param storeDir directory with the store + * @param fs the file system + * @param pageCache page cache to read store files + * @return record format from the store (if it can be read) or configured record format or {@link #DEFAULT_FORMAT} + * @see RecordFormats#generation() + */ + @Nonnull + public static RecordFormats selectNewestFormat( Config config, File storeDir, FileSystemAbstraction fs, + PageCache pageCache, LogProvider logProvider ) + { + boolean formatConfigured = StringUtils.isNotEmpty( configuredRecordFormat( config ) ); + if ( formatConfigured ) + { + // format was explicitly configured so select it + return selectForConfig( config, logProvider ); + } + else + { + RecordFormats result = selectForStore( storeDir, fs, pageCache, logProvider ); + if ( result == null ) + { + // format was not explicitly configured and store does not exist, select default format + info( logProvider, "Selected format '" + DEFAULT_FORMAT + "' for the new store" ); + result = DEFAULT_FORMAT; + } + else if ( result.generation() < DEFAULT_FORMAT.generation() ) + { + // format was not explicitly configured and store has lower format + // select default format, upgrade is intended + info( logProvider, + "Selected format '" + DEFAULT_FORMAT + "' for existing store with format '" + result + "'" ); + result = DEFAULT_FORMAT; + } + return result; + } + } + + private static Iterable allFormats() + { + Iterable loadableFormatFactories = Service.load( RecordFormats.Factory.class ); + Iterable loadableFormats = map( RecordFormats.Factory::newInstance, loadableFormatFactories ); + return concat( KNOWN_FORMATS, loadableFormats ); + } + + @Nonnull + private static RecordFormats selectSpecificFormat( String recordFormat ) { RecordFormats formats = loadRecordFormat( recordFormat ); if ( formats == null ) { - return handleMissingFormat( recordFormat, logService ); + throw new IllegalArgumentException( "No record format found with the name '" + recordFormat + "'." ); } return formats; } + @Nullable private static RecordFormats loadRecordFormat( String recordFormat ) { if ( StringUtils.isNotEmpty( recordFormat ) ) @@ -180,24 +301,12 @@ private static RecordFormats loadRecordFormat( String recordFormat ) return null; } - private static void logSelectedFormat( LogService logService, RecordFormats formats ) - { - String selectionMessage = - String.format( "Select %s as record format implementation.", formats.getClass().getName() ); - getLog( logService ).warn( selectionMessage ); - } - - private static RecordFormats handleMissingFormat( String recordFormat, LogService logService ) - { - getLog( logService ).warn( "Record format with key '" + recordFormat + "' not found." ); - throw new IllegalArgumentException( "No record format found with the name '" + recordFormat + "'." ); - } - - private static Log getLog( LogService logService ) + private static void info( LogProvider logProvider, String message ) { - return logService.getInternalLog( RecordFormatSelector.class ); + logProvider.getLog( RecordFormatSelector.class ).info( message ); } + @Nonnull private static String configuredRecordFormat( Config config ) { return config.get( GraphDatabaseSettings.record_format ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormats.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormats.java index f3cb75f795c9..b6d939292591 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormats.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/RecordFormats.java @@ -46,6 +46,8 @@ public Factory( String key, String... altKeys ) public abstract RecordFormats newInstance(); } + String name(); + String storeVersion(); /** diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_0.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_0.java index 6fb82c870dd8..80606e4c83e8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_0.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_0.java @@ -37,10 +37,11 @@ public class StandardV2_0 extends BaseRecordFormats { public static final String STORE_VERSION = StoreVersion.STANDARD_V2_0.versionString(); public static final RecordFormats RECORD_FORMATS = new StandardV2_0(); + private static final String NAME = "standard_v2.0"; public StandardV2_0() { - super( STORE_VERSION, 2, Capability.SCHEMA, Capability.LUCENE_3, Capability.VERSION_TRAILERS ); + super( NAME, STORE_VERSION, 2, Capability.SCHEMA, Capability.LUCENE_3, Capability.VERSION_TRAILERS ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_1.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_1.java index d534d83df5a0..2a1e35776f81 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_1.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_1.java @@ -37,10 +37,11 @@ public class StandardV2_1 extends BaseRecordFormats { public static final String STORE_VERSION = StoreVersion.STANDARD_V2_1.versionString(); public static final RecordFormats RECORD_FORMATS = new StandardV2_1(); + private static final String NAME = "standard_v2.1"; public StandardV2_1() { - super( STORE_VERSION, 3, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3, + super( NAME, STORE_VERSION, 3, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3, Capability.VERSION_TRAILERS ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_2.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_2.java index 2364a0d1ba9b..8694985489c9 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_2.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_2.java @@ -37,10 +37,11 @@ public class StandardV2_2 extends BaseRecordFormats { public static final String STORE_VERSION = StoreVersion.STANDARD_V2_2.versionString(); public static final RecordFormats RECORD_FORMATS = new StandardV2_2(); + private static final String NAME = "standard_v2.2"; public StandardV2_2() { - super( STORE_VERSION, 4, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3, + super( NAME, STORE_VERSION, 4, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3, Capability.VERSION_TRAILERS ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_3.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_3.java index 07d832b2c5cb..905ffd50bbef 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_3.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV2_3.java @@ -37,10 +37,11 @@ public class StandardV2_3 extends BaseRecordFormats { public static final String STORE_VERSION = StoreVersion.STANDARD_V2_3.versionString(); public static final RecordFormats RECORD_FORMATS = new StandardV2_3(); + private static final String NAME = "standard_v2.3"; public StandardV2_3() { - super( STORE_VERSION, 5, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3 ); + super( NAME, STORE_VERSION, 5, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_3 ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV3_0.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV3_0.java index 48121c114d69..8ab007d12a1b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV3_0.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/format/standard/StandardV3_0.java @@ -41,7 +41,7 @@ public class StandardV3_0 extends BaseRecordFormats public StandardV3_0() { - super( STORE_VERSION, 6, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_5 ); + super( NAME, STORE_VERSION, 6, Capability.SCHEMA, Capability.DENSE_NODES, Capability.LUCENE_5 ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/PropertyDeduplicator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/PropertyDeduplicator.java index e3337068b11e..ed3dff9fe78f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/PropertyDeduplicator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/legacystore/v21/propertydeduplication/PropertyDeduplicator.java @@ -39,7 +39,6 @@ import org.neo4j.kernel.impl.store.SchemaStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; -import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.record.PropertyBlock; import org.neo4j.kernel.impl.store.record.PropertyRecord; import org.neo4j.kernel.impl.store.record.Record; @@ -54,18 +53,16 @@ public class PropertyDeduplicator private final File workingDir; private final PageCache pageCache; private final SchemaIndexProvider schemaIndexProvider; - private final RecordFormats recordFormats; private final PrimitiveIntObjectMap seenPropertyKeys; private final PrimitiveIntObjectMap localDuplicateClusters; public PropertyDeduplicator( FileSystemAbstraction fileSystem, File workingDir, PageCache pageCache, - SchemaIndexProvider schemaIndexProvider, RecordFormats recordFormats ) + SchemaIndexProvider schemaIndexProvider ) { this.fileSystem = fileSystem; this.workingDir = workingDir; this.pageCache = pageCache; this.schemaIndexProvider = schemaIndexProvider; - this.recordFormats = recordFormats; seenPropertyKeys = Primitive.intObjectMap(); localDuplicateClusters = Primitive.intObjectMap(); @@ -73,10 +70,8 @@ public PropertyDeduplicator( FileSystemAbstraction fileSystem, File workingDir, public void deduplicateProperties() throws IOException { - final StoreFactory storeFactory = - new StoreFactory( fileSystem, workingDir, pageCache, recordFormats, NullLogProvider.getInstance() ); - try ( NeoStores neoStores = storeFactory.openNeoStores( StoreType.PROPERTY, StoreType - .NODE, StoreType.SCHEMA) ) + StoreFactory factory = new StoreFactory( workingDir, pageCache, fileSystem, NullLogProvider.getInstance() ); + try ( NeoStores neoStores = factory.openNeoStores( StoreType.PROPERTY, StoreType.NODE, StoreType.SCHEMA) ) { PropertyStore propertyStore = neoStores.getPropertyStore(); NodeStore nodeStore = neoStores.getNodeStore(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java index 9d89586c95d3..911717deb57e 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigrator.java @@ -166,7 +166,7 @@ public void migrate( File storeDir, File migrationDir, MigrationProgressMonitor. if ( versionToMigrateFrom.equals( StandardV2_1.STORE_VERSION ) ) { - removeDuplicateEntityProperties( storeDir, migrationDir, pageCache, schemaIndexProvider, oldFormat, newFormat ); + removeDuplicateEntityProperties( storeDir, migrationDir, pageCache, schemaIndexProvider, oldFormat ); } // DO NOT migrate logs. LegacyLogs is able to migrate logs, but only changes its format, not any @@ -281,7 +281,7 @@ private LogPosition extractTransactionLogPosition( File neoStore, File storeDir, } private void removeDuplicateEntityProperties( File storeDir, File migrationDir, PageCache pageCache, - SchemaIndexProvider schemaIndexProvider, RecordFormats oldFormat, RecordFormats newFormat ) + SchemaIndexProvider schemaIndexProvider, RecordFormats oldFormat ) throws IOException { StoreFile.fileOperation( COPY, fileSystem, storeDir, migrationDir, Iterables.iterable( @@ -305,17 +305,15 @@ private void removeDuplicateEntityProperties( File storeDir, File migrationDir, // there are no store trailers StoreFile.removeTrailers( oldFormat.storeVersion(), fileSystem, migrationDir, pageCache.pageSize() ); - new PropertyDeduplicator( fileSystem, migrationDir, pageCache, schemaIndexProvider, newFormat ) + new PropertyDeduplicator( fileSystem, migrationDir, pageCache, schemaIndexProvider ) .deduplicateProperties(); } - private void rebuildCountsFromScratch( File storeDir, long lastTxId, PageCache pageCache, - RecordFormats recordFormats ) + private void rebuildCountsFromScratch( File storeDir, long lastTxId, PageCache pageCache ) { final File storeFileBase = new File( storeDir, MetaDataStore.DEFAULT_NAME + StoreFactory.COUNTS_STORE ); - final StoreFactory storeFactory = - new StoreFactory( fileSystem, storeDir, pageCache, recordFormats, NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( storeDir, pageCache, fileSystem, NullLogProvider.getInstance() ); try ( NeoStores neoStores = storeFactory.openAllNeoStores() ) { NodeStore nodeStore = neoStores.getNodeStore(); @@ -606,7 +604,7 @@ public void rebuildCounts( File storeDir, String versionToMigrateFrom, String ve countsStoreFiles, true, null, StoreFileType.STORE ); File neoStore = new File( storeDir, DEFAULT_NAME ); long lastTxId = MetaDataStore.getRecord( pageCache, neoStore, Position.LAST_TRANSACTION_ID ); - rebuildCountsFromScratch( storeDir, lastTxId, pageCache, selectForVersion( versionToMigrateTo ) ); + rebuildCountsFromScratch( storeDir, lastTxId, pageCache ); } } diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java index 612c691bbe08..9e27d8031862 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java @@ -148,6 +148,7 @@ import org.neo4j.kernel.internal.StoreLocker; import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.logging.Log; +import org.neo4j.logging.LogProvider; import org.neo4j.logging.NullLog; import org.neo4j.storageengine.api.Token; import org.neo4j.storageengine.api.schema.SchemaRule; @@ -210,7 +211,6 @@ public Label apply( long from ) private final LabelTokenStore labelTokenStore; private final Locks.Client noopLockClient = new NoOpClient(); - private final RecordFormats recordFormats; private final long maxNodeId; private final RecordCursors cursors; @@ -247,11 +247,13 @@ public BatchInserterImpl( final File storeDir, final FileSystemAbstraction fileS boolean dump = config.get( GraphDatabaseSettings.dump_configuration ); this.idGeneratorFactory = new DefaultIdGeneratorFactory( fileSystem ); - recordFormats = RecordFormatSelector.autoSelectFormat( config, logService ); - maxNodeId = recordFormats.node().getMaxId(); - + LogProvider internalLogProvider = logService.getInternalLogProvider(); + RecordFormats recordFormats = RecordFormatSelector.selectForStoreOrConfig( config, storeDir, fileSystem, + pageCache, internalLogProvider ); StoreFactory sf = new StoreFactory( this.storeDir, config, idGeneratorFactory, pageCache, fileSystem, - recordFormats, logService.getInternalLogProvider() ); + recordFormats, internalLogProvider ); + + maxNodeId = recordFormats.node().getMaxId(); if ( dump ) { diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/store/BatchingNeoStores.java b/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/store/BatchingNeoStores.java index 3b2f8d51844e..66b1fa40454c 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/store/BatchingNeoStores.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/store/BatchingNeoStores.java @@ -38,7 +38,6 @@ import org.neo4j.kernel.impl.api.scan.LabelScanStoreProvider; import org.neo4j.kernel.impl.factory.DatabaseInfo; import org.neo4j.kernel.impl.logging.LogService; -import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory; import org.neo4j.kernel.impl.spi.KernelContext; import org.neo4j.kernel.impl.spi.SimpleKernelContext; @@ -50,7 +49,6 @@ import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.UnderlyingStorageException; import org.neo4j.kernel.impl.store.counts.CountsTracker; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.record.RelationshipGroupRecord; import org.neo4j.kernel.impl.util.Dependencies; @@ -193,7 +191,7 @@ public static void createStore( FileSystemAbstraction fileSystem, String storeDi try ( PageCache pageCache = createPageCache( fileSystem, dbConfig, NullLogProvider.getInstance(), PageCacheTracer.NULL ) ) { - StoreFactory storeFactory = new StoreFactory( fileSystem, new File( storeDir ), pageCache, newFormat, + StoreFactory storeFactory = new StoreFactory( new File( storeDir ), pageCache, fileSystem, newFormat, NullLogProvider.getInstance() ); try ( NeoStores neoStores = storeFactory.openAllNeoStores( true ) ) { @@ -212,7 +210,7 @@ private NeoStores newNeoStores( PageCache pageCache ) { BatchingIdGeneratorFactory idGeneratorFactory = new BatchingIdGeneratorFactory( fileSystem ); StoreFactory storeFactory = new StoreFactory( storeDir, neo4jConfig, idGeneratorFactory, pageCache, fileSystem, - RecordFormatSelector.autoSelectFormat( neo4jConfig, NullLogService.getInstance() ), logProvider ); + logProvider ); return storeFactory.openAllNeoStores( true ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/PropertyPhysicalToLogicalConverterTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/PropertyPhysicalToLogicalConverterTest.java index 7e6a3c4c8185..60e81e2e68da 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/PropertyPhysicalToLogicalConverterTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/PropertyPhysicalToLogicalConverterTest.java @@ -37,7 +37,6 @@ import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.PropertyStore; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.PropertyBlock; import org.neo4j.kernel.impl.store.record.PropertyRecord; @@ -221,8 +220,7 @@ public void before() throws Exception File storeDir = new File( "dir" ); fs.get().mkdirs( storeDir ); StoreFactory storeFactory = new StoreFactory( storeDir, Config.empty(), new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider - .getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); neoStores = storeFactory.openAllNeoStores( true ); store = neoStores.getPropertyStore(); converter = new PropertyPhysicalToLogicalConverter( store ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyCursorTest.java index 33c05cd5e895..34fbbfe90390 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyCursorTest.java @@ -51,7 +51,6 @@ import org.neo4j.kernel.impl.store.RecordStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.format.standard.PropertyRecordFormat; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.PropertyBlock; @@ -298,7 +297,7 @@ public void setup() throws IOException fs.deleteRecursively( storeDir ); } fs.mkdirs( storeDir ); - StoreFactory storeFactory = new StoreFactory( fs, storeDir, pageCache, StandardV3_0.RECORD_FORMATS, log ); + StoreFactory storeFactory = new StoreFactory( storeDir, pageCache, fs, log ); neoStores = storeFactory.openAllNeoStores( true ); propertyStore = neoStores.getPropertyStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java index c1dd9bd424e2..c2bc0dbb788a 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/core/ManyPropertyKeysIT.java @@ -42,7 +42,6 @@ import org.neo4j.kernel.impl.store.PropertyKeyTokenStore; import org.neo4j.kernel.impl.store.PropertyStore; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.PropertyKeyTokenRecord; import org.neo4j.kernel.internal.GraphDatabaseAPI; @@ -125,8 +124,7 @@ private GraphDatabaseAPI databaseWithManyPropertyKeys( int propertyKeyCount ) th { DefaultFileSystemAbstraction fs = new DefaultFileSystemAbstraction(); PageCache pageCache = pageCacheRule.getPageCache( fs ); - StoreFactory storeFactory = new StoreFactory( fs, storeDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( storeDir, pageCache, fs, NullLogProvider.getInstance() ); NeoStores neoStores = storeFactory.openAllNeoStores( true ); PropertyKeyTokenStore store = neoStores.getPropertyKeyTokenStore(); for ( int i = 0; i < propertyKeyCount; i++ ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/FreeIdsAfterRecoveryTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/FreeIdsAfterRecoveryTest.java index ce048c92de99..b9f27a4689f9 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/FreeIdsAfterRecoveryTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/FreeIdsAfterRecoveryTest.java @@ -28,7 +28,6 @@ import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.StoreChannel; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.IdGeneratorImpl; import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.kernel.impl.storemigration.StoreFile; @@ -54,8 +53,8 @@ public class FreeIdsAfterRecoveryTest public void shouldCompletelyRebuildIdGeneratorsAfterCrash() throws Exception { // GIVEN - StoreFactory storeFactory = new StoreFactory( fs, directory.directory(), pageCacheRule.getPageCache( fs ), - StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( directory.directory(), pageCacheRule.getPageCache( fs ), fs, + NullLogProvider.getInstance() ); long highId; try ( NeoStores stores = storeFactory.openAllNeoStores( true ) ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/IdGeneratorRebuildFailureEmulationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/IdGeneratorRebuildFailureEmulationTest.java index 74c1e4a8c10d..4aa1650f219f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/IdGeneratorRebuildFailureEmulationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/IdGeneratorRebuildFailureEmulationTest.java @@ -47,7 +47,6 @@ import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory; import org.neo4j.kernel.impl.factory.PlatformModule; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.ImpermanentGraphDatabase; @@ -123,7 +122,7 @@ public void initialize() params.put( GraphDatabaseSettings.rebuild_idgenerators_fast.name(), Settings.FALSE ); Config config = new Config( params, GraphDatabaseSettings.class ); factory = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs ), - pageCacheRule.getPageCache( fs ), fs, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs ), fs, NullLogProvider.getInstance() ); } @After diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/LabelTokenStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/LabelTokenStoreTest.java index bf9ba3328c16..46cf5064209d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/LabelTokenStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/LabelTokenStoreTest.java @@ -28,7 +28,7 @@ import org.neo4j.io.pagecache.PageCursor; import org.neo4j.io.pagecache.PagedFile; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.logging.NullLogService; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.store.record.LabelTokenRecord; import org.neo4j.kernel.impl.store.record.Record; @@ -38,7 +38,6 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.autoSelectFormat; import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE; import static org.neo4j.kernel.impl.store.record.RecordLoad.NORMAL; @@ -74,7 +73,7 @@ class UnusedLabelTokenStore extends LabelTokenStore public UnusedLabelTokenStore() throws IOException { super( file, config, generatorFactory, cache, logProvider, dynamicStringStore, - autoSelectFormat( config, NullLogService.getInstance() ) ); + StandardV3_0.RECORD_FORMATS ); storeFile = mock( PagedFile.class ); when( storeFile.io( any( Long.class ), any( Integer.class ) ) ).thenReturn( pageCursor ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/MetaDataStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/MetaDataStoreTest.java index fcfc9a5ec562..eaacce57c77f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/MetaDataStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/MetaDataStoreTest.java @@ -51,6 +51,7 @@ import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.MetaDataRecord; import org.neo4j.kernel.impl.store.record.RecordLoad; +import org.neo4j.logging.LogProvider; import org.neo4j.logging.NullLogProvider; import org.neo4j.logging.NullLogger; import org.neo4j.test.rule.PageCacheRule; @@ -118,8 +119,8 @@ public boolean checkAndClearBoundsFlag() private MetaDataStore newMetaDataStore() throws IOException { - StoreFactory storeFactory = new StoreFactory( fs, STORE_DIR, pageCacheWithFakeOverflow, - StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + LogProvider logProvider = NullLogProvider.getInstance(); + StoreFactory storeFactory = new StoreFactory( STORE_DIR, pageCacheWithFakeOverflow, fs, logProvider ); return storeFactory.openNeoStores( true, StoreType.META_DATA ).getMetaDataStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java index 6835061a18c8..9748a02c074d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NeoStoresTest.java @@ -61,9 +61,8 @@ import org.neo4j.kernel.impl.core.RelationshipTypeToken; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; import org.neo4j.kernel.impl.store.MetaDataStore.Position; -import org.neo4j.kernel.impl.store.format.RecordFormats; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.standard.DynamicRecordFormat; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdType; import org.neo4j.kernel.impl.store.record.PropertyBlock; @@ -128,7 +127,7 @@ public void setUpNeoStores() throws Exception Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); pageCache = pageCacheRule.getPageCache( fs.get() ); StoreFactory sf = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), pageCache, - fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs.get(), NullLogProvider.getInstance() ); sf.openAllNeoStores( true ).close(); } @@ -137,7 +136,7 @@ public void impossibleToGetStoreFromClosedNeoStoresContainer() { Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); StoreFactory sf = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), pageCache, - fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs.get(), NullLogProvider.getInstance() ); NeoStores neoStores = sf.openAllNeoStores( true ); assertNotNull( neoStores.getMetaDataStore() ); @@ -154,7 +153,7 @@ public void notAllowCreateDynamicStoreWithNegativeBlockSize() { Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); StoreFactory sf = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), pageCache, - fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs.get(), NullLogProvider.getInstance() ); exception.expect( IllegalArgumentException.class ); exception.expectMessage( "Block size of dynamic array store should be positive integer." ); @@ -170,7 +169,7 @@ public void impossibleToGetNotRequestedStore() { Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); StoreFactory sf = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), pageCache, - fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs.get(), NullLogProvider.getInstance() ); NeoStores neoStores = sf.openNeoStores( true, StoreType.NODE_LABEL ); exception.expect( IllegalStateException.class ); @@ -506,9 +505,9 @@ public void setVersion() throws Exception assertEquals( 10, MetaDataStore.setRecord( pageCache, new File( storeDir, MetaDataStore.DEFAULT_NAME ).getAbsoluteFile(), Position.LOG_VERSION, 12 ) ); - Config config = new Config( new HashMap(), GraphDatabaseSettings.class ); + Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); StoreFactory sf = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fileSystem ), pageCache, - fileSystem, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fileSystem, NullLogProvider.getInstance() ); NeoStores neoStores = sf.openAllNeoStores(); assertEquals( 12, neoStores.getMetaDataStore().getCurrentLogVersion() ); @@ -520,9 +519,8 @@ public void shouldNotReadNonRecordDataAsRecord() throws Exception { FileSystemAbstraction fileSystem = fs.get(); File neoStoreDir = new File( "/tmp/graph.db/neostore" ).getAbsoluteFile(); - StoreFactory factory = new StoreFactory( fileSystem, neoStoreDir, pageCache, getRecordFormat(), - NullLogProvider.getInstance() ); - long recordVersion = MetaDataStore.versionStringToLong( getRecordFormat().storeVersion() ); + StoreFactory factory = newStoreFactory( neoStoreDir, pageCache, fileSystem ); + long recordVersion = defaultStoreVersion(); try ( NeoStores neoStores = factory.openAllNeoStores( true ) ) { MetaDataStore metaDataStore = neoStores.getMetaDataStore(); @@ -564,8 +562,7 @@ public void testSetLatestConstraintTx() throws Exception // given Config config = new Config( new HashMap<>(), GraphDatabaseSettings.class ); StoreFactory sf = new StoreFactory( dir.directory(), config, new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); // when NeoStores neoStores = sf.openAllNeoStores( true ); @@ -594,8 +591,7 @@ public void testSetLatestConstraintTx() throws Exception public void shouldInitializeTheTxIdToOne() { StoreFactory factory = - new StoreFactory( fs.get(), new File( "graph.db/neostore" ), pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + new StoreFactory( new File( "graph.db/neostore" ), pageCache, fs.get(), NullLogProvider.getInstance() ); try ( NeoStores neoStores = factory.openAllNeoStores( true ) ) { @@ -614,8 +610,7 @@ public void shouldThrowUnderlyingStorageExceptionWhenFailingToLoadStorage() { FileSystemAbstraction fileSystem = fs.get(); File neoStoreDir = new File( "/tmp/graph.db/neostore" ).getAbsoluteFile(); - StoreFactory factory = new StoreFactory( fileSystem, neoStoreDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory factory = new StoreFactory( neoStoreDir, pageCache, fileSystem, NullLogProvider.getInstance() ); try ( NeoStores neoStores = factory.openAllNeoStores( true ) ) { @@ -636,9 +631,8 @@ public void shouldAddUpgradeFieldsToTheNeoStoreIfNotPresent() throws IOException { FileSystemAbstraction fileSystem = fs.get(); File neoStoreDir = new File( "/tmp/graph.db/neostore" ).getAbsoluteFile(); - StoreFactory factory = new StoreFactory( fileSystem, neoStoreDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); - long recordVersion = MetaDataStore.versionStringToLong( getRecordFormat().storeVersion() ); + StoreFactory factory = newStoreFactory( neoStoreDir, pageCache, fileSystem ); + long recordVersion = defaultStoreVersion(); try ( NeoStores neoStores = factory.openAllNeoStores( true ) ) { MetaDataStore metaDataStore = neoStores.getMetaDataStore(); @@ -681,8 +675,7 @@ public void shouldSetHighestTransactionIdWhenNeeded() throws Throwable // GIVEN FileSystemAbstraction fileSystem = fs.get(); fileSystem.mkdirs( storeDir ); - StoreFactory factory = new StoreFactory( fileSystem, storeDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory factory = new StoreFactory( storeDir, pageCache, fileSystem, NullLogProvider.getInstance() ); try ( NeoStores neoStore = factory.openAllNeoStores( true ) ) { @@ -703,8 +696,7 @@ public void shouldNotSetHighestTransactionIdWhenNeeded() throws Throwable // GIVEN FileSystemAbstraction fileSystem = fs.get(); fileSystem.mkdirs( storeDir ); - StoreFactory factory = new StoreFactory( fileSystem, storeDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory factory = new StoreFactory( storeDir, pageCache, fileSystem, NullLogProvider.getInstance() ); try ( NeoStores neoStore = factory.openAllNeoStores( true ) ) { @@ -750,6 +742,17 @@ public static void add( MyPropertyKeyToken index ) } } + private static long defaultStoreVersion() + { + return MetaDataStore.versionStringToLong( RecordFormatSelector.defaultFormat().storeVersion() ); + } + + private static StoreFactory newStoreFactory( File neoStoreDir, PageCache pageCache, FileSystemAbstraction fs ) + { + return new StoreFactory( neoStoreDir, pageCache, fs, RecordFormatSelector.defaultFormat(), + NullLogProvider.getInstance() ); + } + private Token createDummyIndex( int id, String key ) { MyPropertyKeyToken index = new MyPropertyKeyToken( key, id ); @@ -1370,9 +1373,4 @@ private void testGetRels( long[] relIds ) } } } - - private RecordFormats getRecordFormat() - { - return StandardV3_0.RECORD_FORMATS; - } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NodeStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NodeStoreTest.java index 17d828f6a749..9a7fff148435 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NodeStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/NodeStoreTest.java @@ -47,7 +47,6 @@ import org.neo4j.io.fs.StoreChannel; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGenerator; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; @@ -411,7 +410,7 @@ protected IdGenerator instantiate( FileSystemAbstraction fs, File fileName, int } } ); StoreFactory factory = new StoreFactory( storeDir, Config.empty(), idGeneratorFactory, pageCache, fs, - StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + NullLogProvider.getInstance() ); neoStores = factory.openAllNeoStores( true ); nodeStore = neoStores.getNodeStore(); return nodeStore; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/PropertyStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/PropertyStoreTest.java index 8c02c7ea6f40..e121b3ec0559 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/PropertyStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/PropertyStoreTest.java @@ -33,8 +33,7 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.core.JumpingIdGeneratorFactory; -import org.neo4j.kernel.impl.logging.NullLogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.PropertyBlock; import org.neo4j.kernel.impl.store.record.PropertyKeyTokenRecord; @@ -48,7 +47,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.select; import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE; public class PropertyStoreTest @@ -83,7 +81,7 @@ public void shouldWriteOutTheDynamicChainBeforeUpdatingThePropertyRecord() throw final PropertyStore store = new PropertyStore( path, config, new JumpingIdGeneratorFactory( 1 ), pageCache, NullLogProvider.getInstance(), stringPropertyStore, mock( PropertyKeyTokenStore.class ), mock( DynamicArrayStore.class ), - select(config, StandardV3_0.RECORD_FORMATS, NullLogService.getInstance()) ); + RecordFormatSelector.defaultFormat() ); store.initialise( true ); try diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RecordStoreConsistentReadTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RecordStoreConsistentReadTest.java index 0cf7cb23d0ad..b603f10b7494 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RecordStoreConsistentReadTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RecordStoreConsistentReadTest.java @@ -34,7 +34,6 @@ import org.neo4j.helpers.collection.Iterables; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.LabelTokenRecord; @@ -74,8 +73,7 @@ private NeoStores storeFixture() PageCache pageCache = pageCacheRule.getPageCache( fs ); pageCache = pageCacheRule.withInconsistentReads( pageCache, nextReadIsInconsistent ); File storeDir = new File( "stores" ); - StoreFactory factory = new StoreFactory( fs, storeDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory factory = new StoreFactory( storeDir, pageCache, fs, NullLogProvider.getInstance() ); NeoStores neoStores = factory.openAllNeoStores( true ); S store = initialiseStore( neoStores ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RelationshipGroupStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RelationshipGroupStoreTest.java index a1715feadb65..0c09a91c407a 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RelationshipGroupStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/RelationshipGroupStoreTest.java @@ -42,7 +42,6 @@ import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.MyRelTypes; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.kernel.impl.store.record.Record; @@ -168,7 +167,7 @@ private StoreFactory factory( Integer customThreshold, PageCache pageCache ) customConfig.put( GraphDatabaseSettings.dense_node_threshold.name(), "" + customThreshold ); } return new StoreFactory( directory, new Config( customConfig ), new DefaultIdGeneratorFactory( fs ), pageCache, - fs, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs, NullLogProvider.getInstance() ); } @Test diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java index fd84d3a29570..02a0aa2ec62c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/SchemaStoreTest.java @@ -31,7 +31,6 @@ import org.neo4j.helpers.collection.Iterables; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractSchemaRule; import org.neo4j.kernel.impl.store.record.DynamicRecord; @@ -66,7 +65,7 @@ public void before() throws Exception config = Config.empty(); DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( fs.get() ); storeFactory = new StoreFactory( storeDir, config, idGeneratorFactory, pageCacheRule.getPageCache( fs.get() ), - fs.get(), StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fs.get(), NullLogProvider.getInstance() ); neoStores = storeFactory.openAllNeoStores( true ); store = neoStores.getSchemaStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/StoreFactoryTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/StoreFactoryTest.java index 2a3ef4d57969..16536ab5ef28 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/StoreFactoryTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/StoreFactoryTest.java @@ -34,7 +34,6 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; @@ -63,8 +62,8 @@ public void setUp() throws IOException storeDir = testDirectory.graphDbDir(); fs.mkdirs( storeDir ); - storeFactory = new StoreFactory( storeDir, Config.empty(), idGeneratorFactory, pageCache, - fs, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + storeFactory = new StoreFactory( storeDir, Config.empty(), idGeneratorFactory, pageCache, fs, + NullLogProvider.getInstance() ); } @After @@ -106,8 +105,7 @@ public void shouldHaveSpecificCountsTrackerForReadOnlyDatabase() throws IOExcept PageCache pageCache = pageCacheRule.getPageCache( fs ); StoreFactory readOnlyStoreFactory = new StoreFactory( testDirectory.directory( "readOnlyStore" ), new Config( MapUtil.stringMap( GraphDatabaseSettings.read_only.name(), Settings.TRUE ) ), - new DefaultIdGeneratorFactory( fs ), pageCache, fs, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + new DefaultIdGeneratorFactory( fs ), pageCache, fs, NullLogProvider.getInstance() ); neoStores = readOnlyStoreFactory.openAllNeoStores( true ); long lastClosedTransactionId = neoStores.getMetaDataStore().getLastClosedTransactionId(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestArrayStore.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestArrayStore.java index 620b4fad4dc5..db2cc16d817d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestArrayStore.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestArrayStore.java @@ -37,7 +37,6 @@ import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.util.Bits; @@ -67,7 +66,7 @@ public void before() throws Exception DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( fs ); PageCache pageCache = pageCacheRule.getPageCache( fs ); StoreFactory factory = new StoreFactory( dir, Config.empty(), idGeneratorFactory, pageCache, fs, - StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + NullLogProvider.getInstance() ); neoStores = factory.openAllNeoStores( true ); arrayStore = neoStores.getPropertyStore().getArrayStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestDynamicStore.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestDynamicStore.java index b12334b6d454..18f1c5a3a533 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestDynamicStore.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestDynamicStore.java @@ -38,7 +38,6 @@ import org.neo4j.helpers.collection.Iterators; import org.neo4j.helpers.collection.MapUtil; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.logging.NullLogProvider; @@ -67,8 +66,7 @@ public void setUp() fs.get().mkdir( storeDir ); config = config(); storeFactory = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); } @After diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGraphProperties.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGraphProperties.java index 79f9a2f17e11..bc12ef33449f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGraphProperties.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGraphProperties.java @@ -36,7 +36,6 @@ import org.neo4j.graphdb.mockfs.EphemeralFileSystemAbstraction; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.core.NodeManager; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.logging.NullLogProvider; @@ -178,8 +177,7 @@ public void firstRecordOtherThanZeroIfNotFirst() throws Exception Config config = new Config( Collections.emptyMap(), GraphDatabaseSettings.class ); StoreFactory storeFactory = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); NeoStores neoStores = storeFactory.openAllNeoStores(); long prop = neoStores.getMetaDataStore().getGraphNextProp(); assertTrue( prop != 0 ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGrowingFileMemoryMapping.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGrowingFileMemoryMapping.java index 6eaacfffb811..3cb244244251 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGrowingFileMemoryMapping.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestGrowingFileMemoryMapping.java @@ -29,7 +29,6 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.store.format.standard.NodeRecordFormat; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.logging.NullLogProvider; @@ -66,7 +65,7 @@ public void shouldGrowAFileWhileContinuingToMemoryMapNewRegions() throws Excepti DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( fileSystemAbstraction ); PageCache pageCache = pageCacheRule.getPageCache( fileSystemAbstraction, config ); StoreFactory storeFactory = new StoreFactory( storeDir, config, idGeneratorFactory, pageCache, - fileSystemAbstraction, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + fileSystemAbstraction, NullLogProvider.getInstance() ); NeoStores neoStores = storeFactory.openAllNeoStores( true ); NodeStore nodeStore = neoStores.getNodeStore(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestIdGeneratorRebuilding.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestIdGeneratorRebuilding.java index 265987f98c89..d61c0bb26c10 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestIdGeneratorRebuilding.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestIdGeneratorRebuilding.java @@ -34,8 +34,7 @@ import org.neo4j.helpers.collection.MapUtil; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.AbstractNeo4jTestCase; -import org.neo4j.kernel.impl.logging.NullLogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -47,7 +46,6 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; -import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.select; public class TestIdGeneratorRebuilding { @@ -82,7 +80,7 @@ public void verifyFixedSizeStoresCanRebuildIdGeneratorSlowly() throws IOExceptio DynamicArrayStore labelStore = mock( DynamicArrayStore.class ); NodeStore store = new NodeStore( storeFile, config, new DefaultIdGeneratorFactory( fs ), pageCacheRule.getPageCache( fs ), NullLogProvider.getInstance(), labelStore, - select(config, StandardV3_0.RECORD_FORMATS, NullLogService.getInstance()) ); + RecordFormatSelector.defaultFormat() ); store.initialise( true ); store.makeStoreOk(); @@ -131,7 +129,7 @@ public void verifyDynamicSizedStoresCanRebuildIdGeneratorSlowly() throws Excepti GraphDatabaseSettings.rebuild_idgenerators_fast.name(), "false" ) ); StoreFactory storeFactory = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs ), - pageCacheRule.getPageCache( fs ), fs, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs ), fs, NullLogProvider.getInstance() ); NeoStores neoStores = storeFactory.openAllNeoStores( true ); DynamicStringStore store = neoStores.getPropertyStore().getStringStore(); @@ -187,7 +185,7 @@ public void rebuildingIdGeneratorMustNotMissOutOnFreeRecordsAtEndOfFilePage() th DynamicArrayStore labelStore = mock( DynamicArrayStore.class ); NodeStore store = new NodeStore( storeFile, config, new DefaultIdGeneratorFactory( fs ), pageCacheRule.getPageCache( fs ), NullLogProvider.getInstance(), labelStore, - select( config, StandardV3_0.RECORD_FORMATS, NullLogService.getInstance() ) ); + RecordFormatSelector.defaultFormat() ); store.initialise( true ); store.makeStoreOk(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/UpgradeStoreIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/UpgradeStoreIT.java index fa3e788b3fb5..698e0a192c04 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/UpgradeStoreIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/UpgradeStoreIT.java @@ -43,7 +43,7 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.logging.NullLogService; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.standard.DynamicRecordFormat; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; @@ -65,7 +65,6 @@ import static org.junit.Assert.fail; import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.kernel.impl.AbstractNeo4jTestCase.deleteFileOrDirectory; -import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.select; @Ignore public class UpgradeStoreIT @@ -381,7 +380,7 @@ public RelationshipTypeTokenStoreWithOneOlderVersion( { super( fileName, Config.defaults(), new NoLimitIdGeneratorFactory( fs ), pageCache, NullLogProvider.getInstance(), stringStore, - select( Config.defaults(), NullLogService.getInstance() ) ); + RecordFormatSelector.defaultFormat() ); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/counts/CountsComputerTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/counts/CountsComputerTest.java index 7c8927f75b0a..df2f9bc54d69 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/counts/CountsComputerTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/counts/CountsComputerTest.java @@ -43,7 +43,6 @@ import org.neo4j.kernel.impl.store.RelationshipStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.counts.keys.CountsKey; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.kernel.lifecycle.Lifespan; @@ -317,7 +316,7 @@ private void rebuildCounts( long lastCommittedTransactionId ) throws IOException { cleanupCountsForRebuilding(); - StoreFactory storeFactory = new StoreFactory( fs, dir, pageCache, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( dir, pageCache, fs, NullLogProvider.getInstance() ); try ( Lifespan life = new Lifespan(); NeoStores neoStores = storeFactory.openAllNeoStores() ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatPropertyConfiguratorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatPropertyConfiguratorTest.java index 7f218d6cac94..a52edede47df 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatPropertyConfiguratorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatPropertyConfiguratorTest.java @@ -96,6 +96,12 @@ public ResizableRecordFormats(int dynamicRecordHeaderSize) this.dynamicRecordHeaderSize = dynamicRecordHeaderSize; } + @Override + public String name() + { + return "resizable"; + } + @Override public String storeVersion() { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/MigrationTestUtils.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/MigrationTestUtils.java index a22eb12c508f..9bd14c090326 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/MigrationTestUtils.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/MigrationTestUtils.java @@ -240,10 +240,10 @@ public static boolean containsAnyStoreFiles( FileSystemAbstraction fileSystem, F return false; } - public static boolean checkNeoStoreHasCurrentFormatVersion( StoreVersionCheck check, File workingDirectory ) + public static boolean checkNeoStoreHasDefaultFormatVersion( StoreVersionCheck check, File workingDirectory ) { File neostoreFile = new File( workingDirectory, MetaDataStore.DEFAULT_NAME ); - return check.hasVersion( neostoreFile, RecordFormatSelector.autoSelectFormat().storeVersion() ) + return check.hasVersion( neostoreFile, RecordFormatSelector.defaultFormat().storeVersion() ) .outcome.isSuccessful(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigratorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigratorTest.java index a6511716a452..4ed9b2883e57 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigratorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/storemigration/participant/StoreMigratorTest.java @@ -118,9 +118,8 @@ public void shouldBeAbleToResumeMigrationOnMoving() throws Exception upgradableDatabase.currentVersion() ); // THEN starting the new store should be successful - StoreFactory storeFactory = new StoreFactory( fs, storeDirectory, pageCache, selectFormat(), - logService.getInternalLogProvider() ); - storeFactory.openAllNeoStores().close(); + StoreFactory factory = new StoreFactory( storeDirectory, pageCache, fs, logService.getInternalLogProvider() ); + factory.openAllNeoStores().close(); } @Test @@ -152,9 +151,8 @@ public void shouldBeAbleToResumeMigrationOnRebuildingCounts() throws Exception migrator.rebuildCounts( storeDirectory, versionToMigrateFrom, upgradableDatabase.currentVersion() ); // THEN starting the new store should be successful - StoreFactory storeFactory = new StoreFactory( fs, storeDirectory, pageCache, selectFormat(), - logService.getInternalLogProvider() ); - storeFactory.openAllNeoStores().close(); + StoreFactory factory = new StoreFactory( storeDirectory, pageCache, fs, logService.getInternalLogProvider() ); + factory.openAllNeoStores().close(); } @Test diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/ApplyRecoveredTransactionsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/ApplyRecoveredTransactionsTest.java index d2c52227540a..1fbf02edc794 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/ApplyRecoveredTransactionsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/ApplyRecoveredTransactionsTest.java @@ -34,7 +34,6 @@ import org.neo4j.kernel.impl.locking.LockService; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -114,7 +113,7 @@ public void before() FileSystemAbstraction fs = fsr.get(); File storeDir = new File( "dir" ); StoreFactory storeFactory = new StoreFactory( storeDir, Config.empty(), new DefaultIdGeneratorFactory( fs ), - pageCacheRule.getPageCache( fs ), fs, StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs ), fs, NullLogProvider.getInstance() ); neoStores = storeFactory.openAllNeoStores( true ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeCommandTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeCommandTest.java index 6796fb70fc24..a1923520af63 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeCommandTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeCommandTest.java @@ -36,7 +36,6 @@ import org.neo4j.kernel.impl.store.NodeLabels; import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -246,8 +245,7 @@ public void before() throws Exception fs.get().mkdirs( dir ); @SuppressWarnings("deprecation") StoreFactory storeFactory = new StoreFactory( dir, Config.empty(), new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); neoStores = storeFactory.openAllNeoStores( true ); nodeStore = neoStores.getNodeStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeLabelsFieldTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeLabelsFieldTest.java index fb4f45a86640..1148108d57c3 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeLabelsFieldTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/NodeLabelsFieldTest.java @@ -46,7 +46,6 @@ import org.neo4j.kernel.impl.store.NodeLabelsField; import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -508,8 +507,7 @@ public void startUp() fs.get().mkdirs( storeDir ); Config config = new Config( stringMap( GraphDatabaseSettings.label_block_size.name(), "60" ) ); StoreFactory storeFactory = new StoreFactory( storeDir, config, new DefaultIdGeneratorFactory( fs.get() ), - pageCacheRule.getPageCache( fs.get() ), fs.get(), StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + pageCacheRule.getPageCache( fs.get() ), fs.get(), NullLogProvider.getInstance() ); neoStores = storeFactory.openAllNeoStores( true ); nodeStore = neoStores.getNodeStore(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/PrepareTrackingRecordFormats.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/PrepareTrackingRecordFormats.java index f6944126b3e3..aec23391ce45 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/PrepareTrackingRecordFormats.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/PrepareTrackingRecordFormats.java @@ -60,6 +60,12 @@ public PrepareTrackingRecordFormats( RecordFormats actual ) this.actual = actual; } + @Override + public String name() + { + return actual.name(); + } + @Override public String storeVersion() { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/RelationshipGroupGetterTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/RelationshipGroupGetterTest.java index 88c2d73478d5..08af2804b479 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/RelationshipGroupGetterTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/RelationshipGroupGetterTest.java @@ -30,11 +30,11 @@ import org.neo4j.kernel.impl.store.RecordStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.kernel.impl.store.record.RecordLoad; import org.neo4j.kernel.impl.store.record.RelationshipGroupRecord; import org.neo4j.kernel.impl.transaction.state.RelationshipGroupGetter.RelationshipGroupPosition; +import org.neo4j.logging.LogProvider; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; import org.neo4j.test.rule.fs.EphemeralFileSystemRule; @@ -61,8 +61,8 @@ public void shouldAbortLoadingGroupChainIfComeTooFar() throws Exception // GIVEN a node with relationship group chain 2-->4-->10-->23 File dir = new File( "dir" ); fs.get().mkdirs( dir ); - StoreFactory storeFactory = new StoreFactory( fs.get(), dir, pageCache.getPageCache( fs.get() ), - StandardV3_0.RECORD_FORMATS, NullLogProvider.getInstance() ); + LogProvider logProvider = NullLogProvider.getInstance(); + StoreFactory storeFactory = new StoreFactory( dir, pageCache.getPageCache( fs.get() ), fs.get(), logProvider ); try ( NeoStores stores = storeFactory.openNeoStores( true, StoreType.RELATIONSHIP_GROUP ) ) { RecordStore store = spy( stores.getRelationshipGroupStore() ); diff --git a/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoreDataSourceRule.java b/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoreDataSourceRule.java index d49be8211239..d126c1d0f9a4 100644 --- a/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoreDataSourceRule.java +++ b/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoreDataSourceRule.java @@ -46,7 +46,6 @@ import org.neo4j.kernel.impl.locking.Locks; import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.proc.Procedures; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; import org.neo4j.kernel.impl.transaction.TransactionMonitor; @@ -95,8 +94,7 @@ fs, mock( TransactionMonitor.class ), databaseHealth, new StandardConstraintSemantics(), monitors, new Tracers( "null", NullLog.getInstance(), monitors, jobScheduler ), mock( Procedures.class ), - IOLimiter.unlimited(), - RecordFormatSelector.autoSelectFormat() ); + IOLimiter.unlimited() ); return dataSource; } diff --git a/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoresRule.java b/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoresRule.java index 268df27098f0..71f655ca7d2f 100644 --- a/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoresRule.java +++ b/community/kernel/src/test/java/org/neo4j/test/rule/NeoStoresRule.java @@ -25,14 +25,14 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.logging.NullLogService; import org.neo4j.kernel.impl.pagecache.ConfiguringPageCacheFactory; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.RecordFormats; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; +import org.neo4j.logging.Log; import org.neo4j.logging.NullLog; import org.neo4j.logging.NullLogProvider; @@ -47,11 +47,9 @@ public class NeoStoresRule extends ExternalResource { private final Class testClass; - private TargetDirectory targetDirectory; private NeoStores neoStores; private EphemeralFileSystemAbstraction efs; private PageCache pageCache; - private StoreFactory storeFactory; private final StoreType[] stores; public NeoStoresRule( Class testClass, StoreType... stores ) @@ -62,18 +60,14 @@ public NeoStoresRule( Class testClass, StoreType... stores ) public NeoStores open( String... config ) { - Config conf = new Config( stringMap( config ) ); - return open( RecordFormatSelector.select( conf, RecordFormatSelector.autoSelectFormat(), - NullLogService.getInstance() ), config ); + return open( StandardV3_0.RECORD_FORMATS, config ); } public NeoStores open( RecordFormats format, String... config ) { efs = new EphemeralFileSystemAbstraction(); Config conf = new Config( stringMap( config ) ); - ConfiguringPageCacheFactory pageCacheFactory = new ConfiguringPageCacheFactory( efs, conf, NULL, - NullLog.getInstance() ); - pageCache = pageCacheFactory.getOrCreatePageCache(); + pageCache = getOrCreatePageCache( conf, efs ); return open( efs, pageCache, format, config ); } @@ -83,7 +77,7 @@ public NeoStores open( FileSystemAbstraction fs, PageCache pageCache, RecordForm TargetDirectory targetDirectory = new TargetDirectory( fs, testClass ); File storeDir = targetDirectory.makeGraphDbDir(); Config configuration = new Config( stringMap( config ) ); - storeFactory = new StoreFactory( storeDir, configuration, new DefaultIdGeneratorFactory( fs ), + StoreFactory storeFactory = new StoreFactory( storeDir, configuration, new DefaultIdGeneratorFactory( fs ), pageCache, fs, format, NullLogProvider.getInstance() ); return neoStores = stores.length == 0 ? storeFactory.openAllNeoStores( true ) @@ -101,13 +95,16 @@ protected void after( boolean successful ) throws Throwable { pageCache.close(); } - if ( targetDirectory != null ) - { - targetDirectory.cleanup(); - } if ( efs != null ) { efs.shutdown(); } } + + private static PageCache getOrCreatePageCache( Config config, FileSystemAbstraction fs ) + { + Log log = NullLog.getInstance(); + ConfiguringPageCacheFactory pageCacheFactory = new ConfiguringPageCacheFactory( fs, config, NULL, log ); + return pageCacheFactory.getOrCreatePageCache(); + } } diff --git a/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java b/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java index 97e509afdf2b..9f2a77d745b3 100644 --- a/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java +++ b/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java @@ -43,8 +43,6 @@ import org.neo4j.kernel.impl.index.IndexConfigStore; import org.neo4j.kernel.impl.locking.ReentrantLockService; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; -import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.util.JobScheduler; import org.neo4j.kernel.impl.util.Neo4jJobScheduler; @@ -85,8 +83,7 @@ public Builder getWith( FileSystemAbstraction fs, PageCache pageCache ) } private RecordStorageEngine get( FileSystemAbstraction fs, PageCache pageCache, LabelScanStore labelScanStore, - SchemaIndexProvider schemaIndexProvider, DatabaseHealth databaseHealth, File storeDirectory, - RecordFormats recordFormats ) + SchemaIndexProvider schemaIndexProvider, DatabaseHealth databaseHealth, File storeDirectory ) { if ( !fs.fileExists( storeDirectory ) && !fs.mkdir( storeDirectory ) ) { @@ -107,7 +104,7 @@ private RecordStorageEngine get( FileSystemAbstraction fs, PageCache pageCache, scheduler, mock( TokenNameLookup.class ), new ReentrantLockService(), schemaIndexProvider, IndexingService.NO_MONITOR, databaseHealth, labelScanStoreProvider, legacyIndexProviderLookup, indexConfigStore, - new SynchronizedArrayIdOrderingQueue( 20 ), txSnapshotSupplier, recordFormats ) ); + new SynchronizedArrayIdOrderingQueue( 20 ), txSnapshotSupplier ) ); } @Override @@ -122,7 +119,6 @@ public class Builder private final FileSystemAbstraction fs; private final PageCache pageCache; private LabelScanStore labelScanStore = new InMemoryLabelScanStore(); - private RecordFormats recordFormats = RecordFormatSelector.autoSelectFormat(); private DatabaseHealth databaseHealth = new DatabaseHealth( new DatabasePanicEventGenerator( new KernelEventHandlers( NullLog.getInstance() ) ), NullLog.getInstance() ); @@ -147,12 +143,6 @@ public Builder indexProvider( SchemaIndexProvider schemaIndexProvider ) return this; } - public Builder recordFormats( RecordFormats recordFormats) - { - this.recordFormats = recordFormats; - return this; - } - public Builder databaseHealth( DatabaseHealth databaseHealth ) { this.databaseHealth = databaseHealth; @@ -169,7 +159,7 @@ public Builder storeDirectory( File storeDirectory ) public RecordStorageEngine build() { - return get( fs, pageCache, labelScanStore, schemaIndexProvider, databaseHealth, storeDirectory, recordFormats ); + return get( fs, pageCache, labelScanStore, schemaIndexProvider, databaseHealth, storeDirectory ); } } } diff --git a/community/kernel/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertTest.java b/community/kernel/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertTest.java index 4856a93b651c..615e9bb0041d 100644 --- a/community/kernel/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertTest.java +++ b/community/kernel/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertTest.java @@ -86,7 +86,6 @@ import org.neo4j.kernel.impl.store.SchemaStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.UnderlyingStorageException; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.IndexRule; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -318,8 +317,7 @@ private NeoStores switchToNeoStores( BatchInserter inserter ) inserter.shutdown(); File dir = new File( inserter.getStoreDir() ); PageCache pageCache = pageCacheRule.getPageCache( fs ); - StoreFactory storeFactory = new StoreFactory( fs, dir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( dir, pageCache, fs, NullLogProvider.getInstance() ); return storeFactory.openAllNeoStores(); } diff --git a/community/kernel/src/test/java/org/neo4j/unsafe/impl/batchimport/PropertyEncoderStepTest.java b/community/kernel/src/test/java/org/neo4j/unsafe/impl/batchimport/PropertyEncoderStepTest.java index 9ca95155e6e6..e5d884428ab5 100644 --- a/community/kernel/src/test/java/org/neo4j/unsafe/impl/batchimport/PropertyEncoderStepTest.java +++ b/community/kernel/src/test/java/org/neo4j/unsafe/impl/batchimport/PropertyEncoderStepTest.java @@ -30,7 +30,6 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; @@ -61,9 +60,8 @@ public void setUpNeoStore() { File storeDir = new File( "dir" ); pageCache = pageCacheRule.getPageCache( fsRule.get() ); - StoreFactory storeFactory = new StoreFactory( fsRule.get(), storeDir, pageCache, StandardV3_0.RECORD_FORMATS, - NullLogProvider.getInstance() ); - neoStores = storeFactory.openAllNeoStores( true ); + StoreFactory factory = new StoreFactory( storeDir, pageCache, fsRule.get(), NullLogProvider.getInstance() ); + neoStores = factory.openAllNeoStores( true ); } @After diff --git a/community/neo4j/src/test/java/upgrade/StoreUpgradeOnStartupTest.java b/community/neo4j/src/test/java/upgrade/StoreUpgradeOnStartupTest.java index ce4956b85dfa..d0f6f7dc4d35 100644 --- a/community/neo4j/src/test/java/upgrade/StoreUpgradeOnStartupTest.java +++ b/community/neo4j/src/test/java/upgrade/StoreUpgradeOnStartupTest.java @@ -55,7 +55,7 @@ import static org.neo4j.consistency.store.StoreAssertions.assertConsistentStore; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allLegacyStoreFilesHaveVersion; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allStoreFilesHaveNoTrailer; -import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.checkNeoStoreHasCurrentFormatVersion; +import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.checkNeoStoreHasDefaultFormatVersion; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.prepareSampleLegacyDatabase; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.removeCheckPointFromTxLog; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.truncateFile; @@ -106,7 +106,7 @@ public void shouldUpgradeAutomaticallyOnDatabaseStartup() throws IOException, Co // then assertTrue( "Some store files did not have the correct version", - checkNeoStoreHasCurrentFormatVersion( check, workingDirectory ) ); + checkNeoStoreHasDefaultFormatVersion( check, workingDirectory ) ); assertTrue( allStoreFilesHaveNoTrailer( fileSystem, workingDirectory ) ); assertConsistentStore( workingDirectory ); } diff --git a/community/neo4j/src/test/java/upgrade/StoreUpgraderInterruptionTestIT.java b/community/neo4j/src/test/java/upgrade/StoreUpgraderInterruptionTestIT.java index 773fd2cd3607..8eb14494eddd 100644 --- a/community/neo4j/src/test/java/upgrade/StoreUpgraderInterruptionTestIT.java +++ b/community/neo4j/src/test/java/upgrade/StoreUpgraderInterruptionTestIT.java @@ -68,7 +68,7 @@ import static org.neo4j.consistency.store.StoreAssertions.assertConsistentStore; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allLegacyStoreFilesHaveVersion; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allStoreFilesHaveNoTrailer; -import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.checkNeoStoreHasCurrentFormatVersion; +import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.checkNeoStoreHasDefaultFormatVersion; @RunWith( Parameterized.class ) public class StoreUpgraderInterruptionTestIT @@ -145,7 +145,7 @@ public void migrate( File sourceStoreDir, File targetStoreDir, SchemaIndexMigrator indexMigrator = createIndexMigrator(); newUpgrader(upgradableDatabase, progressMonitor, indexMigrator, migrator ).migrateIfNeeded( workingDirectory ); - assertTrue( checkNeoStoreHasCurrentFormatVersion( check, workingDirectory ) ); + assertTrue( checkNeoStoreHasDefaultFormatVersion( check, workingDirectory ) ); assertTrue( allStoreFilesHaveNoTrailer( fs, workingDirectory ) ); assertConsistentStore( workingDirectory ); @@ -195,7 +195,7 @@ public void moveMigratedFiles( File migrationDir, File storeDir, String versionT assertEquals( "This upgrade is failing", e.getMessage() ); } - assertTrue( checkNeoStoreHasCurrentFormatVersion( check, workingDirectory ) ); + assertTrue( checkNeoStoreHasDefaultFormatVersion( check, workingDirectory ) ); assertTrue( allStoreFilesHaveNoTrailer( fs, workingDirectory ) ); assertConsistentStore( workingDirectory ); @@ -205,7 +205,7 @@ public void moveMigratedFiles( File migrationDir, File storeDir, String versionT newUpgrader( upgradableDatabase, progressMonitor, createIndexMigrator(), migrator ) .migrateIfNeeded( workingDirectory ); - assertTrue( checkNeoStoreHasCurrentFormatVersion( check, workingDirectory ) ); + assertTrue( checkNeoStoreHasDefaultFormatVersion( check, workingDirectory ) ); assertTrue( allStoreFilesHaveNoTrailer( fs, workingDirectory ) ); pageCache.close(); diff --git a/community/neo4j/src/test/java/upgrade/StoreUpgraderTest.java b/community/neo4j/src/test/java/upgrade/StoreUpgraderTest.java index 1aa8bf765e7f..19e8847766f6 100644 --- a/community/neo4j/src/test/java/upgrade/StoreUpgraderTest.java +++ b/community/neo4j/src/test/java/upgrade/StoreUpgraderTest.java @@ -19,7 +19,6 @@ */ package upgrade; -import org.apache.commons.lang3.StringUtils; import org.junit.Assume; import org.junit.Before; import org.junit.Rule; @@ -50,12 +49,12 @@ import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.format.standard.StandardV2_0; import org.neo4j.kernel.impl.store.format.standard.StandardV2_1; import org.neo4j.kernel.impl.store.format.standard.StandardV2_2; import org.neo4j.kernel.impl.store.format.standard.StandardV2_3; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.storemigration.StoreMigrationParticipant; import org.neo4j.kernel.impl.storemigration.StoreUpgrader; import org.neo4j.kernel.impl.storemigration.StoreUpgrader.UnableToUpgradeException; @@ -92,7 +91,6 @@ import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allLegacyStoreFilesHaveVersion; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.allStoreFilesHaveNoTrailer; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.changeVersionNumber; -import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.checkNeoStoreHasCurrentFormatVersion; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.containsAnyStoreFiles; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.isolatedMigrationDirectoryOf; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.prepareSampleLegacyDatabase; @@ -158,19 +156,13 @@ public void shouldUpgradeAnOldFormatStore() throws IOException, ConsistencyCheck newUpgrader( upgradableDatabase, pageCache ).migrateIfNeeded( dbDirectory ); // Then - assertTrue( checkNeoStoreHasCurrentFormatVersion( check, dbDirectory ) ); + assertCorrectStoreVersion( getRecordFormats().storeVersion(), check, dbDirectory ); assertTrue( allStoreFilesHaveNoTrailer( fileSystem, dbDirectory ) ); // We leave logical logs in place since the new version can read the old assertFalse( containsAnyStoreFiles( fileSystem, isolatedMigrationDirectoryOf( dbDirectory ) ) ); - assertConsistentStore( dbDirectory, getTunnningConfig() ); - } - - private Config getTunnningConfig() - { - return new Config( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), - getRecordFormatsName() ) ); + assertConsistentStore( dbDirectory ); } @Test @@ -342,9 +334,8 @@ public void upgradedNeoStoreShouldHaveNewUpgradeTimeAndUpgradeId() throws Except newUpgrader( upgradableDatabase, allowMigrateConfig, pageCache ).migrateIfNeeded( dbDirectory ); // Then - StoreFactory storeFactory = new StoreFactory( fileSystem, dbDirectory, pageCache, getRecordFormats(), - NullLogProvider.getInstance() ); - try ( NeoStores neoStores = storeFactory.openAllNeoStores() ) + StoreFactory factory = new StoreFactory( dbDirectory, pageCache, fileSystem, NullLogProvider.getInstance() ); + try ( NeoStores neoStores = factory.openAllNeoStores() ) { assertThat( neoStores.getMetaDataStore().getUpgradeTransaction(), equalTo( neoStores.getMetaDataStore().getLastCommittedTransaction() ) ); @@ -396,6 +387,13 @@ public void upgraderShouldCleanupLegacyLeftoverAndMigrationDirs() throws Excepti assertThat( migrationHelperDirs(), is( emptyCollectionOf( File.class ) ) ); } + private static void assertCorrectStoreVersion( String expectedStoreVersion, StoreVersionCheck check, File storeDir ) + { + File neoStoreFile = new File( storeDir, MetaDataStore.DEFAULT_NAME ); + StoreVersionCheck.Result result = check.hasVersion( neoStoreFile, expectedStoreVersion ); + assertTrue( "Unexpected store version", result.outcome.isSuccessful() ); + } + private StoreMigrationParticipant participantThatWillFailWhenMoving( final String failureMessage ) { return new AbstractStoreMigrationParticipant( "Failing" ) @@ -425,7 +423,7 @@ private StoreUpgrader newUpgrader( UpgradableDatabase upgradableDatabase, PageCa SilentMigrationProgressMonitor progressMonitor = new SilentMigrationProgressMonitor(); NullLogService instance = NullLogService.getInstance(); - StoreMigrator defaultMigrator = new StoreMigrator( fileSystem, pageCache, getTunnningConfig(), instance, + StoreMigrator defaultMigrator = new StoreMigrator( fileSystem, pageCache, getTuningConfig(), instance, schemaIndexProvider ); SchemaIndexMigrator indexMigrator = new SchemaIndexMigrator( fileSystem, schemaIndexProvider, labelScanStoreProvider ); @@ -467,13 +465,13 @@ private void makeDbNotCleanlyShutdown( boolean truncateAll ) throws IOException } } - protected RecordFormats getRecordFormats() + private Config getTuningConfig() { - return RecordFormatSelector.autoSelectFormat(); + return new Config( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), getRecordFormats().name() ) ); } - protected String getRecordFormatsName() + protected RecordFormats getRecordFormats() { - return StringUtils.EMPTY; + return StandardV3_0.RECORD_FORMATS; } } diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/BackupService.java b/enterprise/backup/src/main/java/org/neo4j/backup/BackupService.java index ed5856400396..2bc926fedc04 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/BackupService.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/BackupService.java @@ -162,7 +162,7 @@ public void done() } }, CancellationRequest.NEVER_CANCELLED ); - bumpMessagesDotLogFile( targetDirectory, timestamp ); + bumpDebugDotLogFileVersion( targetDirectory, timestamp ); boolean consistent = false; try { @@ -205,7 +205,7 @@ BackupOutcome doIncrementalBackup( String sourceHostNameOrIp, int sourcePort, Fi { targetDb.shutdown(); } - bumpMessagesDotLogFile( targetDirectory, backupStartTime ); + bumpDebugDotLogFileVersion( targetDirectory, backupStartTime ); clearIdFiles( targetDirectory ); return outcome; } @@ -353,7 +353,7 @@ private BackupOutcome incrementalWithContext( String sourceHostNameOrIp, int sou return new BackupOutcome( handler.getLastSeenTransactionId(), consistent ); } - private static boolean bumpMessagesDotLogFile( File dbDirectory, long toTimestamp ) + private static boolean bumpDebugDotLogFileVersion( File dbDirectory, long toTimestamp ) { File[] candidates = dbDirectory.listFiles( new FilenameFilter() { diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/BackupEmbeddedIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/BackupEmbeddedIT.java index 779356cdae71..add6275e9b42 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/BackupEmbeddedIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/BackupEmbeddedIT.java @@ -25,6 +25,11 @@ import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import java.io.File; import java.util.ArrayList; @@ -36,10 +41,9 @@ import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.helpers.collection.MapUtil; import org.neo4j.io.proc.ProcessUtil; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.DbRepresentation; import org.neo4j.test.ProcessStreamHandler; @@ -48,29 +52,41 @@ import org.neo4j.test.rule.TargetDirectory; import static org.junit.Assert.assertEquals; +import static org.neo4j.test.TargetDirectory.testDirForTest; +@RunWith( Parameterized.class ) public class BackupEmbeddedIT { @ClassRule - public static TargetDirectory.TestDirectory testDirectory = - TargetDirectory.testDirForTest( BackupEmbeddedIT.class ); - @Rule - public SuppressOutput suppressOutput = SuppressOutput.suppressAll(); + public static final TargetDirectory.TestDirectory testDirectory = testDirForTest( BackupEmbeddedIT.class ); + + private final EmbeddedDatabaseRule db = new EmbeddedDatabaseRule( testDirectory.directory( "db" ) ).startLazily(); + @Rule - public EmbeddedDatabaseRule db = new EmbeddedDatabaseRule( testDirectory.directory( "db" ) ) - .startLazily().withConfig( getConfig() ); + public final RuleChain ruleChain = RuleChain.outerRule( SuppressOutput.suppressAll() ).around( db ); private static final String ip = "127.0.0.1"; private final File backupPath = testDirectory.directory( "backup-db" ); + @Parameter + public String recordFormat; + + @Parameters( name = "{0}" ) + public static List recordFormats() + { + return Arrays.asList( StandardV3_0.NAME, HighLimit.NAME ); + } + @Before public void before() throws Exception { - if ( SystemUtils.IS_OS_WINDOWS ) return; + if ( SystemUtils.IS_OS_WINDOWS ) + { + return; + } FileUtils.deleteDirectory( backupPath ); } - @SuppressWarnings("deprecation") public static DbRepresentation createSomeData( GraphDatabaseService db ) { try (Transaction tx = db.beginTx()) @@ -130,6 +146,7 @@ public void makeSureBackupCanBePerformedWithCustomPort() throws Exception private void startDb( String backupPort ) { + db.setConfig( GraphDatabaseSettings.record_format, recordFormat ); db.setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ); if(backupPort != null) { @@ -150,12 +167,6 @@ public static int runBackupToolFromOtherJvmToGetExitCode( String... args ) return new ProcessStreamHandler( process, false ).waitForResult(); } - private Config getConfig() - { - return new Config( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), - StandardV3_0.NAME ) ); - } - private DbRepresentation getDbRepresentation() { return DbRepresentation.of( db ); @@ -163,6 +174,6 @@ private DbRepresentation getDbRepresentation() private DbRepresentation getBackupDbRepresentation() { - return DbRepresentation.of( backupPath, getConfig() ); + return DbRepresentation.of( backupPath ); } } diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/BackupServiceIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/BackupServiceIT.java index 20152ecd405e..7bfdb039b5ce 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/BackupServiceIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/BackupServiceIT.java @@ -46,7 +46,6 @@ import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.index.Index; import org.neo4j.helpers.collection.Iterables; -import org.neo4j.helpers.collection.MapUtil; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileUtils; @@ -59,7 +58,6 @@ import org.neo4j.kernel.impl.store.MetaDataStore.Position; import org.neo4j.kernel.impl.store.MismatchingStoreIdException; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.storemigration.LogFiles; import org.neo4j.kernel.impl.storemigration.StoreFile; import org.neo4j.kernel.impl.transaction.CommittedTransactionRepresentation; @@ -136,8 +134,7 @@ public void finishStreamingStoreFile( File storefile ) public int backupPort = 8200; @Rule - public EmbeddedDatabaseRule dbRule = new EmbeddedDatabaseRule( getClass() ) - .startLazily().withConfig( getConfig() ); + public EmbeddedDatabaseRule dbRule = new EmbeddedDatabaseRule( getClass() ).startLazily(); @Rule public SuppressOutput suppressOutput = SuppressOutput.suppressAll(); @@ -327,10 +324,8 @@ public void incrementallyBackupDatabaseShouldNotKeepGeneratedIdFiles() // it should be possible to at this point to start db based on our backup and create couple of properties // their ids should not clash with already existing - GraphDatabaseService backupBasedDatabase = - new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( backupDir.getAbsoluteFile() ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) - .newGraphDatabase(); + GraphDatabaseService backupBasedDatabase = new GraphDatabaseFactory() + .newEmbeddedDatabase( backupDir.getAbsoluteFile() ); try { try ( Transaction transaction = backupBasedDatabase.beginTx() ) @@ -865,20 +860,14 @@ private Node findNodeByLabel( GraphDatabaseAPI graphDatabase, Label label ) } } - private Config getConfig() - { - return new Config( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), - StandardV3_0.NAME ) ); - } - private DbRepresentation getBackupDbRepresentation() { - return DbRepresentation.of( backupDir, getConfig() ); + return DbRepresentation.of( backupDir ); } private DbRepresentation getDbRepresentation() { - return DbRepresentation.of( storeDir, getConfig() ); + return DbRepresentation.of( storeDir ); } } diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/EmbeddedServer.java b/enterprise/backup/src/test/java/org/neo4j/backup/EmbeddedServer.java index 66df8f58f61a..3c961fd02123 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/EmbeddedServer.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/EmbeddedServer.java @@ -26,7 +26,6 @@ import org.neo4j.graphdb.factory.GraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; public class EmbeddedServer implements ServerInterface { @@ -37,7 +36,6 @@ public EmbeddedServer( File storeDir, String serverAddress ) GraphDatabaseBuilder graphDatabaseBuilder = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( storeDir ); graphDatabaseBuilder.setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ); graphDatabaseBuilder.setConfig( OnlineBackupSettings.online_backup_server, serverAddress ); - graphDatabaseBuilder.setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); graphDatabaseBuilder.setConfig( GraphDatabaseSettings.pagecache_memory, "8m" ); this.db = graphDatabaseBuilder.newGraphDatabase(); } diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/IncrementalBackupTests.java b/enterprise/backup/src/test/java/org/neo4j/backup/IncrementalBackupTests.java index 0efd64d3063d..7a0f6ab97631 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/IncrementalBackupTests.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/IncrementalBackupTests.java @@ -35,10 +35,7 @@ import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.helpers.collection.MapUtil; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.DbRepresentation; import org.neo4j.test.TestGraphDatabaseFactory; import org.neo4j.test.rule.SuppressOutput; @@ -228,7 +225,6 @@ private GraphDatabaseService startGraphDatabase( File path ) newEmbeddedDatabaseBuilder( path ). setConfig( OnlineBackupSettings.online_backup_enabled, Settings.FALSE ). setConfig( GraphDatabaseSettings.keep_logical_logs, Settings.TRUE ). - setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ). newGraphDatabase(); } @@ -247,12 +243,6 @@ private void shutdownServer( ServerInterface server ) throws Exception private DbRepresentation getBackupDbRepresentation() { - return DbRepresentation.of( backupPath, getFormatConfig() ); - } - - private Config getFormatConfig() - { - return new Config( - MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME ) ); + return DbRepresentation.of( backupPath ); } } diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/TestBackup.java b/enterprise/backup/src/test/java/org/neo4j/backup/TestBackup.java index e20cf2fb76f8..40245a98622a 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/TestBackup.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/TestBackup.java @@ -24,10 +24,15 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -39,11 +44,9 @@ import org.neo4j.graphdb.factory.GraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.index.Index; -import org.neo4j.helpers.collection.MapUtil; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.StoreLockException; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.impl.api.TransactionHeaderInformation; import org.neo4j.kernel.impl.factory.CommunityEditionModule; @@ -55,6 +58,7 @@ import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.MetaDataStore.Position; import org.neo4j.kernel.impl.store.MismatchingStoreIdException; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.IdGeneratorImpl; import org.neo4j.kernel.impl.storemigration.StoreFile; @@ -77,6 +81,7 @@ import static org.neo4j.graphdb.factory.GraphDatabaseSettings.dense_node_threshold; import static org.neo4j.kernel.impl.MyRelTypes.TEST; +@RunWith( Parameterized.class ) public class TestBackup { @Rule @@ -86,11 +91,20 @@ public class TestBackup @Rule public SuppressOutput suppressOutput = SuppressOutput.suppressAll(); + @Parameter + public String recordFormatName; + private File serverPath; private File otherServerPath; private File backupPath; private List servers; + @Parameters( name = "{0}" ) + public static List recordFormatNames() + { + return Arrays.asList( StandardV3_0.NAME, HighLimit.NAME ); + } + @Before public void before() throws Exception { @@ -246,7 +260,7 @@ public void makeSureStoreIdIsEnforced() throws Exception OnlineBackup backup = OnlineBackup.from( "127.0.0.1" ); backup.full( backupPath.getPath() ); assertTrue( "Should be consistent", backup.isConsistent() ); - assertEquals( initialDataSetRepresentation, DbRepresentation.of( backupPath, getFormatConfig() ) ); + assertEquals( initialDataSetRepresentation, DbRepresentation.of( backupPath ) ); shutdownServer( server ); // Create data set X+Y on server B @@ -272,7 +286,7 @@ public void makeSureStoreIdIsEnforced() throws Exception server = startServer( serverPath ); backup.incremental( backupPath.getPath() ); assertTrue( "Should be consistent", backup.isConsistent() ); - assertEquals( furtherRepresentation, DbRepresentation.of( backupPath, getFormatConfig() ) ); + assertEquals( furtherRepresentation, DbRepresentation.of( backupPath ) ); shutdownServer( server ); } @@ -405,7 +419,7 @@ public void shouldRetainFileLocksAfterFullBackupOnLiveDatabase() throws Exceptio GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( sourcePath ) .setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) + .setConfig( GraphDatabaseSettings.record_format, recordFormatName ) .newGraphDatabase(); try { @@ -643,7 +657,7 @@ protected TransactionHeaderInformation createUsing( byte[] additionalHeader ) return dbFactory.newEmbeddedDatabaseBuilder( storeDir ) .setConfig( OnlineBackupSettings.online_backup_enabled, String.valueOf( withOnlineBackup ) ) .setConfig( GraphDatabaseSettings.keep_logical_logs, Settings.TRUE ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) + .setConfig( GraphDatabaseSettings.record_format, recordFormatName ) .newGraphDatabase(); } @@ -679,18 +693,12 @@ private GraphDatabaseService getEmbeddedTestDataBaseService() { return new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( serverPath ) .setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) + .setConfig( GraphDatabaseSettings.record_format, recordFormatName ) .newGraphDatabase(); } - private Config getFormatConfig() - { - return new Config( - MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME ) ); - } - private DbRepresentation getDbRepresentation() { - return DbRepresentation.of( backupPath, getFormatConfig() ); + return DbRepresentation.of( backupPath ); } } diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/TestConfiguration.java b/enterprise/backup/src/test/java/org/neo4j/backup/TestConfiguration.java index 82b4d6eaea2c..6697e9e948fe 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/TestConfiguration.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/TestConfiguration.java @@ -27,9 +27,7 @@ import java.io.File; import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.TestGraphDatabaseFactory; import org.neo4j.test.rule.SuppressOutput; @@ -54,9 +52,7 @@ public void before() throws Exception @Test public void testOnByDefault() throws Exception { - GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( SOURCE_DIR ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) - .newGraphDatabase(); + GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabase( SOURCE_DIR ); OnlineBackup.from( HOST_ADDRESS ).full( BACKUP_DIR ); db.shutdown(); } @@ -66,7 +62,6 @@ public void testOffByConfig() throws Exception { GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( SOURCE_DIR ) .setConfig( OnlineBackupSettings.online_backup_enabled, Settings.FALSE ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) .newGraphDatabase(); try { @@ -84,7 +79,6 @@ public void testEnableDefaultsInConfig() throws Exception { GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( SOURCE_DIR ) .setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) .newGraphDatabase(); OnlineBackup.from( HOST_ADDRESS ).full( BACKUP_DIR ); @@ -97,8 +91,7 @@ public void testEnableCustomPortInConfig() throws Exception String customPort = "12345"; GraphDatabaseService db = new TestGraphDatabaseFactory().newEmbeddedDatabaseBuilder( SOURCE_DIR ) .setConfig( OnlineBackupSettings.online_backup_enabled, Settings.TRUE ) - .setConfig( OnlineBackupSettings.online_backup_server, ":"+customPort ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) + .setConfig( OnlineBackupSettings.online_backup_server, ":" + customPort ) .newGraphDatabase(); try { diff --git a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java index 38e52c547abf..b695fed5100d 100644 --- a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java +++ b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java @@ -56,7 +56,6 @@ import org.neo4j.logging.NullLogProvider; import static java.lang.Math.max; -import static org.neo4j.graphdb.factory.GraphDatabaseSettings.record_format; import static org.neo4j.helpers.Format.bytes; import static org.neo4j.kernel.impl.transaction.log.TransactionIdStore.BASE_TX_ID; import static org.neo4j.kernel.impl.transaction.log.entry.LogHeader.LOG_HEADER_SIZE; @@ -319,7 +318,6 @@ private GraphDatabaseService newTempDatabase( File tempStore ) .setUserLogProvider( NullLogProvider.getInstance() ) .newEmbeddedDatabaseBuilder( tempStore.getAbsoluteFile() ) .setConfig( "dbms.backup.enabled", Settings.FALSE ) - .setConfig( record_format, config.get( record_format ) ) .setConfig( GraphDatabaseSettings.logs_directory, tempStore.getAbsolutePath() ) .setConfig( GraphDatabaseSettings.keep_logical_logs, Settings.TRUE ) .setConfig( GraphDatabaseSettings.allow_store_upgrade, diff --git a/enterprise/com/src/test/java/org/neo4j/com/StoreIdTestFactory.java b/enterprise/com/src/test/java/org/neo4j/com/StoreIdTestFactory.java index 1069fab6a4df..cb735dc7a925 100644 --- a/enterprise/com/src/test/java/org/neo4j/com/StoreIdTestFactory.java +++ b/enterprise/com/src/test/java/org/neo4j/com/StoreIdTestFactory.java @@ -26,11 +26,11 @@ public class StoreIdTestFactory { - private static RecordFormats select = RecordFormatSelector.autoSelectFormat(); + private static final RecordFormats format = RecordFormatSelector.defaultFormat(); private static long currentStoreVersionAsLong() { - return MetaDataStore.versionStringToLong( select.storeVersion() ); + return MetaDataStore.versionStringToLong( format.storeVersion() ); } public static StoreId newStoreIdForCurrentVersion() @@ -41,7 +41,7 @@ public static StoreId newStoreIdForCurrentVersion() public static StoreId newStoreIdForCurrentVersion( long creationTime, long randomId, long upgradeTime, long upgradeId ) { - return new StoreId( creationTime, randomId, MetaDataStore.versionStringToLong( select.storeVersion() ), + return new StoreId( creationTime, randomId, MetaDataStore.versionStringToLong( format.storeVersion() ), upgradeTime, upgradeId ); } } diff --git a/enterprise/com/src/test/java/org/neo4j/com/storecopy/ResponsePackerIT.java b/enterprise/com/src/test/java/org/neo4j/com/storecopy/ResponsePackerIT.java index 70e012c4b62c..7f322a5d2a6e 100644 --- a/enterprise/com/src/test/java/org/neo4j/com/storecopy/ResponsePackerIT.java +++ b/enterprise/com/src/test/java/org/neo4j/com/storecopy/ResponsePackerIT.java @@ -35,10 +35,8 @@ import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.transaction.CommittedTransactionRepresentation; import org.neo4j.kernel.impl.transaction.log.LogicalTransactionStore; -import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; import org.neo4j.test.rule.fs.EphemeralFileSystemRule; @@ -62,9 +60,8 @@ public void shouldPackTheHighestTxCommittedAsObligation() throws Exception LogicalTransactionStore transactionStore = mock( LogicalTransactionStore.class ); FileSystemAbstraction fs = fsRule.get(); PageCache pageCache = pageCacheRule.getPageCache( fs ); - Monitors monitors = new Monitors(); - try ( NeoStores neoStore = createNeoStore( fs, pageCache, monitors ) ) + try ( NeoStores neoStore = createNeoStore( fs, pageCache ) ) { MetaDataStore store = neoStore.getMetaDataStore(); store.transactionCommitted( 2, 111 ); @@ -104,13 +101,11 @@ public Visitor transactions() } } - private NeoStores createNeoStore( FileSystemAbstraction fs, PageCache pageCache, Monitors monitors ) - throws IOException + private NeoStores createNeoStore( FileSystemAbstraction fs, PageCache pageCache ) throws IOException { File storeDir = new File( "/store/" ); fs.mkdirs( storeDir ); - StoreFactory storeFactory = new StoreFactory( fs, storeDir, pageCache, RecordFormatSelector.autoSelectFormat(), - NullLogProvider.getInstance() ); + StoreFactory storeFactory = new StoreFactory( storeDir, pageCache, fs, NullLogProvider.getInstance() ); return storeFactory.openAllNeoStores( true ); } } diff --git a/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java b/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java index 237675d8c764..284bc3b95867 100644 --- a/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java +++ b/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java @@ -44,6 +44,7 @@ import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.StoreId; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.transaction.log.LogicalTransactionStore; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; @@ -57,13 +58,11 @@ import org.neo4j.test.rule.PageCacheRule; import org.neo4j.test.rule.TargetDirectory; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -140,50 +139,34 @@ public void finishRecoveringStore() } @Test - public void storeCopyClientMustRespectConfiguredRecordFormat() throws Exception + public void storeCopyClientMustWorkWithStandardRecordFormat() throws Exception { - final File copyDir = new File( testDir.directory(), "copy" ); - final File originalDir = new File( testDir.directory(), "original" ); - PageCache pageCache = pageCacheRule.getPageCache( fs ); - String unkownFormat = "unkown_format"; - Config config = Config.empty().augment( stringMap( record_format.name(), unkownFormat ) ); - StoreCopyClient copier = new StoreCopyClient( - copyDir, config, loadKernelExtensions(), NullLogProvider.getInstance(), fs, pageCache, - new StoreCopyClient.Monitor.Adapter(), false ); - - final GraphDatabaseAPI original = (GraphDatabaseAPI) startDatabase( originalDir ); - StoreCopyClient.StoreCopyRequester storeCopyRequest = storeCopyRequest( originalDir, original ); - - // This should complain about the unkown format - try - { - copier.copyStore( storeCopyRequest, CancellationRequest.NEVER_CANCELLED ); - fail( "copyStore should have failed with this format configuration" ); - } - catch ( Exception e ) - { - assertThat( e.getMessage(), containsString( unkownFormat ) ); - } + checkStoreCopyClientWithRecordFormats( StandardV3_0.NAME ); } @Test - public void storeCopyClientMustWorkWithLowLimitRecordFormat() throws Exception + public void storeCopyClientMustWorkWithHighLimitRecordFormat() throws Exception + { + checkStoreCopyClientWithRecordFormats( HighLimit.NAME ); + } + + private void checkStoreCopyClientWithRecordFormats( String recordFormatsName ) throws Exception { final File copyDir = new File( testDir.directory(), "copy" ); final File originalDir = new File( testDir.directory(), "original" ); PageCache pageCache = pageCacheRule.getPageCache( fs ); - Config config = Config.empty().augment( stringMap( record_format.name(), StandardV3_0.NAME ) ); + Config config = Config.empty().augment( stringMap( record_format.name(), recordFormatsName ) ); StoreCopyClient copier = new StoreCopyClient( copyDir, config, loadKernelExtensions(), NullLogProvider.getInstance(), fs, pageCache, new StoreCopyClient.Monitor.Adapter(), false ); - final GraphDatabaseAPI original = (GraphDatabaseAPI) startDatabase( originalDir, StandardV3_0.NAME ); + final GraphDatabaseAPI original = (GraphDatabaseAPI) startDatabase( originalDir, recordFormatsName ); StoreCopyClient.StoreCopyRequester storeCopyRequest = storeCopyRequest( originalDir, original ); copier.copyStore( storeCopyRequest, CancellationRequest.NEVER_CANCELLED ); // Must not throw - startDatabase( copyDir, StandardV3_0.NAME ).shutdown(); + startDatabase( copyDir, recordFormatsName ).shutdown(); } @Test diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/factory/HighlyAvailableEditionModule.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/factory/HighlyAvailableEditionModule.java index 0dc3c88e0cde..9146de082a93 100644 --- a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/factory/HighlyAvailableEditionModule.java +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/factory/HighlyAvailableEditionModule.java @@ -135,7 +135,6 @@ import org.neo4j.kernel.impl.locking.Locks; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.store.StoreId; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.store.stats.IdBasedStoreEntityCounters; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; @@ -176,8 +175,6 @@ public HighlyAvailableEditionModule( final PlatformModule platformModule ) { ioLimiter = new ConfigurableIOLimiter( platformModule.config ); - formats = StandardV3_0.RECORD_FORMATS; - final LifeSupport life = platformModule.life; life.add( platformModule.dataSourceManager ); diff --git a/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java b/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java index 765b1196e91c..59c76748ef21 100644 --- a/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java +++ b/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java @@ -29,12 +29,8 @@ import java.util.List; import org.neo4j.backup.OnlineBackupSettings; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.helpers.collection.MapUtil; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.impl.ha.ClusterManager.ManagedCluster; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.DbRepresentation; import org.neo4j.test.ha.ClusterRule; import org.neo4j.test.rule.SuppressOutput; @@ -83,7 +79,7 @@ public void makeSureBackupCanBePerformed() throws Throwable cluster.sync(); // Verify that backed up database can be started and compare representation - DbRepresentation backupRepresentation = DbRepresentation.of( backupPath, getConfig() ); + DbRepresentation backupRepresentation = DbRepresentation.of( backupPath ); assertEquals( beforeChange, backupRepresentation ); assertNotEquals( backupRepresentation, afterChange ); } @@ -106,7 +102,7 @@ public void makeSureBackupCanBePerformedFromAnyInstance() throws Throwable cluster.sync(); // Verify that old data is back - DbRepresentation backupRepresentation = DbRepresentation.of( backupPath, getConfig() ); + DbRepresentation backupRepresentation = DbRepresentation.of( backupPath ); assertEquals( beforeChange, backupRepresentation ); assertNotEquals( backupRepresentation, afterChange ); } @@ -126,10 +122,4 @@ private String[] backupArguments( String from, String to, String clusterName ) } return args.toArray( new String[args.size()] ); } - - private Config getConfig() - { - return new Config( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), - StandardV3_0.NAME ) ); - } } diff --git a/enterprise/ha/src/test/java/org/neo4j/ha/TestBranchedData.java b/enterprise/ha/src/test/java/org/neo4j/ha/TestBranchedData.java index a743df6d2d47..163c225ee2f0 100644 --- a/enterprise/ha/src/test/java/org/neo4j/ha/TestBranchedData.java +++ b/enterprise/ha/src/test/java/org/neo4j/ha/TestBranchedData.java @@ -35,7 +35,6 @@ import org.neo4j.graphdb.Node; import org.neo4j.graphdb.ResourceIterator; import org.neo4j.graphdb.Transaction; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.TestHighlyAvailableGraphDatabaseFactory; import org.neo4j.graphdb.index.Index; import org.neo4j.helpers.collection.Iterables; @@ -47,7 +46,6 @@ import org.neo4j.kernel.impl.ha.ClusterManager.ManagedCluster; import org.neo4j.kernel.impl.ha.ClusterManager.RepairKit; import org.neo4j.kernel.impl.logging.StoreLogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.util.Listener; import org.neo4j.kernel.impl.util.StoreUtil; import org.neo4j.kernel.lifecycle.LifeRule; @@ -331,9 +329,6 @@ private void startDbAndCreateNode() private GraphDatabaseService startGraphDatabaseService( File storeDir ) { - return new TestGraphDatabaseFactory() - .newEmbeddedDatabaseBuilder( storeDir ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) - .newGraphDatabase(); + return new TestGraphDatabaseFactory().newEmbeddedDatabase( storeDir ); } } diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/api/impl/labelscan/LabelScanStoreHaIT.java b/enterprise/ha/src/test/java/org/neo4j/kernel/api/impl/labelscan/LabelScanStoreHaIT.java index 1f685e78a292..ccfde35ee2eb 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/api/impl/labelscan/LabelScanStoreHaIT.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/api/impl/labelscan/LabelScanStoreHaIT.java @@ -30,12 +30,10 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Transaction; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.TestHighlyAvailableGraphDatabaseFactory; import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.ha.ClusterManager; import org.neo4j.kernel.impl.ha.ClusterManager.ManagedCluster; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.test.TestGraphDatabaseFactory; import org.neo4j.test.rule.TargetDirectory; @@ -119,7 +117,6 @@ public void setUp() { GraphDatabaseService db = new TestGraphDatabaseFactory() .newEmbeddedDatabaseBuilder( storeDir.getAbsoluteFile() ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) .newGraphDatabase(); try { diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/OnDiskLastTxIdGetterTest.java b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/OnDiskLastTxIdGetterTest.java index 77761787f3e0..b76bc73d5ea5 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/OnDiskLastTxIdGetterTest.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/OnDiskLastTxIdGetterTest.java @@ -28,7 +28,6 @@ import org.neo4j.kernel.ha.transaction.OnDiskLastTxIdGetter; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; @@ -55,9 +54,8 @@ public void testGetLastTxIdNoFilePresent() throws Exception @Test public void lastTransactionIdIsBaseTxIdWhileNeoStoresAreStopped() { - final StoreFactory storeFactory = new StoreFactory( fs.get(), new File( "store" ), - pageCacheRule.getPageCache( fs.get() ), RecordFormatSelector.autoSelectFormat(), - NullLogProvider.getInstance() ); + final StoreFactory storeFactory = new StoreFactory( new File( "store" ), pageCacheRule.getPageCache( fs.get() ), + fs.get(), NullLogProvider.getInstance() ); final NeoStores neoStores = storeFactory.openAllNeoStores( true ); neoStores.close(); diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/impl/ha/ClusterManager.java b/enterprise/ha/src/test/java/org/neo4j/kernel/impl/ha/ClusterManager.java index dd2dc1b6b549..f40be5391fac 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/impl/ha/ClusterManager.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/impl/ha/ClusterManager.java @@ -86,7 +86,6 @@ import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.NullLogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.util.Dependencies; import org.neo4j.kernel.impl.util.Listener; import org.neo4j.kernel.lifecycle.LifeSupport; @@ -133,8 +132,7 @@ public enum NetworkFlag public static final long DEFAULT_TIMEOUT_SECONDS = 60L; public static final Map CONFIG_FOR_SINGLE_JVM_CLUSTER = unmodifiableMap( stringMap( - GraphDatabaseSettings.pagecache_memory.name(), "8m", - GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME ) ); + GraphDatabaseSettings.pagecache_memory.name(), "8m" ) ); public interface StoreDirInitializer { diff --git a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/EnterpriseEditionModule.java b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/EnterpriseEditionModule.java index 59dc192b2f93..46fa2f0b391d 100644 --- a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/EnterpriseEditionModule.java +++ b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/EnterpriseEditionModule.java @@ -27,7 +27,6 @@ import org.neo4j.kernel.impl.factory.EditionModule; import org.neo4j.kernel.impl.factory.PlatformModule; import org.neo4j.kernel.impl.proc.Procedures; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.store.stats.IdBasedStoreEntityCounters; /** @@ -41,7 +40,6 @@ public EnterpriseEditionModule( PlatformModule platformModule ) super( platformModule ); platformModule.dependencies.satisfyDependency( new IdBasedStoreEntityCounters( this.idGeneratorFactory ) ); ioLimiter = new ConfigurableIOLimiter( platformModule.config ); - formats = StandardV3_0.RECORD_FORMATS; } @Override diff --git a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimit.java b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimit.java index 1d4a54efa356..364ff54b630e 100644 --- a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimit.java +++ b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimit.java @@ -54,7 +54,7 @@ public class HighLimit extends BaseRecordFormats public HighLimit() { - super( STORE_VERSION, 7, Capability.DENSE_NODES, Capability.SCHEMA, Capability.LUCENE_5 ); + super( NAME, STORE_VERSION, 7, Capability.DENSE_NODES, Capability.SCHEMA, Capability.LUCENE_5 ); } @Override diff --git a/enterprise/kernel/src/test/java/org/neo4j/graphdb/StartupConstraintSemanticsTest.java b/enterprise/kernel/src/test/java/org/neo4j/graphdb/StartupConstraintSemanticsTest.java index f5e5639de761..b2a26b8258de 100644 --- a/enterprise/kernel/src/test/java/org/neo4j/graphdb/StartupConstraintSemanticsTest.java +++ b/enterprise/kernel/src/test/java/org/neo4j/graphdb/StartupConstraintSemanticsTest.java @@ -24,17 +24,14 @@ import org.neo4j.graphdb.factory.EnterpriseGraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseFactory; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.helpers.Exceptions; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.rule.TargetDirectory; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; - import static org.neo4j.test.rule.TargetDirectory.testDirForTest; public class StartupConstraintSemanticsTest @@ -60,10 +57,7 @@ public void shouldNotAllowOpeningADatabaseWithPECInCommunityEdition() throws Exc // when try { - graphDb = new GraphDatabaseFactory() - .newEmbeddedDatabaseBuilder( dir.graphDbDir() ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) - .newGraphDatabase(); + graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( dir.graphDbDir() ); fail( "should have failed to start!" ); } // then diff --git a/enterprise/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatSelectorTest.java b/enterprise/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatSelectorTest.java index ac22681c8cf1..304a9c572992 100644 --- a/enterprise/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatSelectorTest.java +++ b/enterprise/kernel/src/test/java/org/neo4j/kernel/impl/store/format/RecordFormatSelectorTest.java @@ -21,70 +21,349 @@ import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.neo4j.helpers.collection.MapUtil; +import java.io.File; +import java.io.IOException; + +import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.graphdb.mockfs.EphemeralFileSystemAbstraction; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.logging.NullLogService; +import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; +import org.neo4j.kernel.impl.store.format.standard.StandardV2_0; +import org.neo4j.kernel.impl.store.format.standard.StandardV2_1; +import org.neo4j.kernel.impl.store.format.standard.StandardV2_2; +import org.neo4j.kernel.impl.store.format.standard.StandardV2_3; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.logging.LogProvider; +import org.neo4j.logging.NullLogProvider; +import org.neo4j.test.PageCacheRule; -import static org.junit.Assert.assertEquals; -import static org.neo4j.graphdb.factory.GraphDatabaseSettings.record_format; +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyVararg; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.neo4j.helpers.collection.MapUtil.stringMap; +import static org.neo4j.kernel.impl.store.MetaDataStore.Position.STORE_VERSION; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.defaultFormat; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectForConfig; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectForStore; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectForStoreOrConfig; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectForVersion; +import static org.neo4j.kernel.impl.store.format.RecordFormatSelector.selectNewestFormat; public class RecordFormatSelectorTest { + private static final LogProvider LOG = NullLogProvider.getInstance(); + @Rule - public ExpectedException expectedException = ExpectedException.none(); + public final PageCacheRule pageCacheRule = new PageCacheRule(); + private final FileSystemAbstraction fs = new EphemeralFileSystemAbstraction(); + private final File storeDir = new File( "graph.db" ); + + @Test + public void defaultFormatTest() + { + assertSame( StandardV3_0.RECORD_FORMATS, defaultFormat() ); + } + + @Test + public void selectForVersionTest() + { + assertSame( StandardV2_0.RECORD_FORMATS, selectForVersion( StandardV2_0.STORE_VERSION ) ); + assertSame( StandardV2_1.RECORD_FORMATS, selectForVersion( StandardV2_1.STORE_VERSION ) ); + assertSame( StandardV2_2.RECORD_FORMATS, selectForVersion( StandardV2_2.STORE_VERSION ) ); + assertSame( StandardV2_3.RECORD_FORMATS, selectForVersion( StandardV2_3.STORE_VERSION ) ); + assertSame( StandardV3_0.RECORD_FORMATS, selectForVersion( StandardV3_0.STORE_VERSION ) ); + assertSame( HighLimit.RECORD_FORMATS, selectForVersion( HighLimit.STORE_VERSION ) ); + } + + @Test + public void selectForWrongVersionTest() + { + try + { + selectForVersion( "vA.B.9" ); + fail( "Exception expected" ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } @Test - public void selectSpecifiedRecordFormat() throws Exception + public void selectForConfigWithRecordFormatParameter() { - Config config = new Config( MapUtil.stringMap( record_format.name(), HighLimit.NAME ) ); - RecordFormats formatSelector = RecordFormatSelector.select( config, - StandardV3_0.RECORD_FORMATS, NullLogService.getInstance() ); - assertEquals( HighLimit.RECORD_FORMATS.storeVersion(), formatSelector.storeVersion() ); + assertSame( StandardV3_0.RECORD_FORMATS, selectForConfig( config( StandardV3_0.NAME ), LOG ) ); + assertSame( HighLimit.RECORD_FORMATS, selectForConfig( config( HighLimit.NAME ), LOG ) ); } @Test - public void selectDefaultFormatByDefault() throws Exception + public void selectForConfigWithoutRecordFormatParameter() { + assertSame( defaultFormat(), selectForConfig( Config.empty(), LOG ) ); + } + + @Test + public void selectForConfigWithWrongRecordFormatParameter() + { + try + { + selectForConfig( config( "unknown_format" ), LOG ); + fail( "Exception expected" ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + + @Test + public void selectForStoreWithValidStore() throws IOException + { + PageCache pageCache = getPageCache(); + verifySelectForStore( pageCache, StandardV2_0.RECORD_FORMATS ); + verifySelectForStore( pageCache, StandardV2_1.RECORD_FORMATS ); + verifySelectForStore( pageCache, StandardV2_2.RECORD_FORMATS ); + verifySelectForStore( pageCache, StandardV2_3.RECORD_FORMATS ); + verifySelectForStore( pageCache, StandardV3_0.RECORD_FORMATS ); + verifySelectForStore( pageCache, HighLimit.RECORD_FORMATS ); + } + + @Test + public void selectForStoreWithNoStore() throws IOException + { + assertNull( selectForStore( storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectForStoreWithThrowingPageCache() throws IOException + { + createNeoStoreFile(); + PageCache pageCache = mock( PageCache.class ); + when( pageCache.pageSize() ).thenReturn( 8192 ); + when( pageCache.map( any(), anyInt(), anyVararg() ) ).thenThrow( new IOException( "No reading..." ) ); + assertNull( selectForStore( storeDir, fs, pageCache, LOG ) ); + } + + @Test + public void selectForStoreWithInvalidStoreVersion() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( "v9.Z.9", pageCache ); + assertNull( selectForStore( storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectForStoreOrConfigWithSameStandardConfiguredAndStoredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( StandardV3_0.STORE_VERSION, pageCache ); + + Config config = config( StandardV3_0.NAME ); + + assertSame( StandardV3_0.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); + } + + @Test + public void selectForStoreOrConfigWithSameHighLimitConfiguredAndStoredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( HighLimit.STORE_VERSION, pageCache ); + + Config config = config( HighLimit.NAME ); + + assertSame( HighLimit.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); + } + + @Test + public void selectForStoreOrConfigWithDifferentlyConfiguredAndStoredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( StandardV3_0.STORE_VERSION, pageCache ); + + Config config = config( HighLimit.STORE_VERSION ); + + try + { + selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ); + fail( "Exception expected" ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + + @Test + public void selectForStoreOrConfigWithOnlyStandardStoredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( StandardV3_0.STORE_VERSION, pageCache ); + Config config = Config.empty(); - RecordFormats formatSelector = RecordFormatSelector.select( config, - StandardV3_0.RECORD_FORMATS, NullLogService.getInstance() ); - assertEquals( StandardV3_0.RECORD_FORMATS.storeVersion(), formatSelector.storeVersion() ); + + assertSame( StandardV3_0.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); } @Test - public void shouldNotResolveNoneExistingRecordFormat() throws Exception + public void selectForStoreOrConfigWithOnlyHighLimitStoredFormat() throws IOException { - Config config = new Config( MapUtil.stringMap( record_format.name(), "notAValidRecordFormat" ) ); - expectedException.expect( IllegalArgumentException.class ); + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( HighLimit.STORE_VERSION, pageCache ); - RecordFormatSelector.select( config, StandardV3_0.RECORD_FORMATS, NullLogService.getInstance() ); + Config config = Config.empty(); + + assertSame( HighLimit.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); } @Test - public void autoSelectStandardFormat() + public void selectForStoreOrConfigWithOnlyStandardConfiguredFormat() throws IOException { - RecordFormats recordFormats = RecordFormatSelector.autoSelectFormat(); - assertEquals( "Autoselectable format should be equal to default format.", recordFormats, - StandardV3_0.RECORD_FORMATS ); + PageCache pageCache = getPageCache(); + + Config config = config( StandardV3_0.NAME ); + + assertSame( StandardV3_0.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); + } + + @Test + public void selectForStoreOrConfigWithOnlyHighLimitConfiguredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + + Config config = config( HighLimit.NAME ); + + assertSame( HighLimit.RECORD_FORMATS, selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ) ); + } + + @Test + public void selectForStoreOrConfigWithWrongConfiguredFormat() throws IOException + { + PageCache pageCache = getPageCache(); + + Config config = config( "unknown_format" ); + + try + { + selectForStoreOrConfig( config, storeDir, fs, pageCache, LOG ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + + @Test + public void selectForStoreOrConfigWithoutConfiguredAndStoredFormats() throws IOException + { + assertSame( defaultFormat(), selectForStoreOrConfig( Config.empty(), storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectNewestFormatWithConfiguredStandardFormat() + { + assertSame( StandardV3_0.RECORD_FORMATS, + selectNewestFormat( config( StandardV3_0.NAME ), storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectNewestFormatWithConfiguredHighLimitFormat() + { + assertSame( HighLimit.RECORD_FORMATS, + selectNewestFormat( config( HighLimit.NAME ), storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectNewestFormatWithWrongConfiguredFormat() + { + try + { + selectNewestFormat( config( "unknown_format" ), storeDir, fs, getPageCache(), LOG ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + + @Test + public void selectNewestFormatWithoutConfigAndStore() + { + assertSame( defaultFormat(), selectNewestFormat( Config.empty(), storeDir, fs, getPageCache(), LOG ) ); } @Test - public void autoselectCommunityFormat() + public void selectNewestFormatForExistingStandardStore() throws IOException { - RecordFormats recordFormats = RecordFormatSelector.autoSelectFormat( Config.empty(), NullLogService.getInstance() ); - assertEquals( "autoselect should select specified format.", recordFormats, StandardV3_0.RECORD_FORMATS ); + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( StandardV3_0.STORE_VERSION, pageCache ); + + Config config = Config.empty(); + + assertSame( StandardV3_0.RECORD_FORMATS, selectNewestFormat( config, storeDir, fs, getPageCache(), LOG ) ); } @Test - public void overrideWithNonExistingFormatFailure() + public void selectNewestFormatForExistingHighLimitStore() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( HighLimit.STORE_VERSION, pageCache ); + + Config config = Config.empty(); + + assertSame( HighLimit.RECORD_FORMATS, selectNewestFormat( config, storeDir, fs, getPageCache(), LOG ) ); + } + + @Test + public void selectNewestFormatForExistingStoreWithLegacyFormat() throws IOException + { + PageCache pageCache = getPageCache(); + prepareNeoStoreFile( StandardV2_3.STORE_VERSION, pageCache ); + + Config config = Config.empty(); + + assertSame( defaultFormat(), selectNewestFormat( config, storeDir, fs, getPageCache(), LOG ) ); + } + + private PageCache getPageCache() { - Config config = new Config( MapUtil.stringMap( record_format.name(), "notAValidRecordFormat" ) ); - expectedException.expect( IllegalArgumentException.class ); + return pageCacheRule.getPageCache( fs ); + } + + private void verifySelectForStore( PageCache pageCache, RecordFormats format ) throws IOException + { + prepareNeoStoreFile( format.storeVersion(), pageCache ); + assertSame( format, selectForStore( storeDir, fs, pageCache, LOG ) ); + } - RecordFormatSelector.autoSelectFormat( config, NullLogService.getInstance() ); + private File prepareNeoStoreFile( String storeVersion, PageCache pageCache ) throws IOException + { + File neoStoreFile = createNeoStoreFile(); + long value = MetaDataStore.versionStringToLong( storeVersion ); + MetaDataStore.setRecord( pageCache, neoStoreFile, STORE_VERSION, value ); + return neoStoreFile; + } + + private File createNeoStoreFile() throws IOException + { + fs.mkdir( storeDir ); + File neoStoreFile = new File( storeDir, MetaDataStore.DEFAULT_NAME ); + fs.create( neoStoreFile ).close(); + return neoStoreFile; + } + + private static Config config( String recordFormatName ) + { + return new Config( stringMap( GraphDatabaseSettings.record_format.name(), recordFormatName ) ); } } diff --git a/enterprise/neo4j-enterprise/src/test/java/batchimport/ParallelBatchImporterTest.java b/enterprise/neo4j-enterprise/src/test/java/batchimport/ParallelBatchImporterTest.java index 47f60ce9957d..f4add5514c4c 100644 --- a/enterprise/neo4j-enterprise/src/test/java/batchimport/ParallelBatchImporterTest.java +++ b/enterprise/neo4j-enterprise/src/test/java/batchimport/ParallelBatchImporterTest.java @@ -19,7 +19,7 @@ */ package batchimport; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.unsafe.impl.batchimport.ParallelBatchImporter; import org.neo4j.unsafe.impl.batchimport.cache.idmapping.IdGenerator; import org.neo4j.unsafe.impl.batchimport.cache.idmapping.IdMapper; @@ -38,6 +38,6 @@ public ParallelBatchImporterTest( InputIdGenerator inputIdGenerator, IdMapper id @Override public String getFormatName() { - return StandardV3_0.NAME; + return HighLimit.NAME; } } diff --git a/enterprise/neo4j-enterprise/src/test/java/org/neo4j/consistency/ConsistencyCheckServiceRecordFormatIT.java b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/consistency/ConsistencyCheckServiceRecordFormatIT.java new file mode 100644 index 000000000000..8da21cdb8529 --- /dev/null +++ b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/consistency/ConsistencyCheckServiceRecordFormatIT.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.consistency; + +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.graphdb.Label; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.RelationshipType; +import org.neo4j.graphdb.Transaction; +import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.helpers.progress.ProgressMonitorFactory; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.internal.GraphDatabaseAPI; +import org.neo4j.logging.FormattedLogProvider; +import org.neo4j.test.EmbeddedDatabaseRule; +import org.neo4j.test.SuppressOutput; +import org.neo4j.test.TargetDirectory; + +import static org.junit.Assert.assertTrue; +import static org.neo4j.test.TargetDirectory.testDirForTest; + +@RunWith( Parameterized.class ) +public class ConsistencyCheckServiceRecordFormatIT +{ + @ClassRule + public static final TargetDirectory.TestDirectory dir = + testDirForTest( ConsistencyCheckServiceRecordFormatIT.class ); + + private final File storeDir = dir.directory( "db" ); + private final EmbeddedDatabaseRule db = new EmbeddedDatabaseRule( storeDir ).startLazily(); + + @Rule + public final RuleChain ruleChain = RuleChain.outerRule( SuppressOutput.suppressAll() ).around( db ); + + @Parameter + public String recordFormat; + + @Parameters( name = "{0}" ) + public static List recordFormats() + { + return Arrays.asList( StandardV3_0.NAME, HighLimit.NAME ); + } + + @Before + public void configureRecordFormat() throws Exception + { + db.setConfig( GraphDatabaseSettings.record_format, recordFormat ); + } + + @Test + public void checkTinyConsistentStore() throws Exception + { + db.ensureStarted(); + createLinkedList( db, 1_000 ); + db.shutdownAndKeepStore(); + + assertConsistentStore( db ); + } + + private static void createLinkedList( GraphDatabaseService db, int size ) + { + Node previous = null; + try ( Transaction tx = db.beginTx() ) + { + for ( int i = 0; i < size; i++ ) + { + Label label = (i % 2 == 0) ? TestLabel.FOO : TestLabel.BAR; + Node current = db.createNode( label ); + current.setProperty( "value", ThreadLocalRandom.current().nextLong() ); + + if ( previous != null ) + { + previous.createRelationshipTo( current, TestRelType.FORWARD ); + current.createRelationshipTo( previous, TestRelType.BACKWARD ); + } + previous = current; + } + tx.success(); + } + } + + private static void assertConsistentStore( GraphDatabaseAPI db ) throws Exception + { + ConsistencyCheckService service = new ConsistencyCheckService(); + + File storeDir = new File( db.getStoreDir() ); + ConsistencyCheckService.Result result = service.runFullConsistencyCheck( storeDir, Config.empty(), + ProgressMonitorFactory.textual( System.out ), FormattedLogProvider.toOutputStream( System.out ), true ); + + assertTrue( "Store is inconsistent", result.isSuccessful() ); + } + + private enum TestLabel implements Label + { + FOO, + BAR + } + + private enum TestRelType implements RelationshipType + { + FORWARD, + BACKWARD + } +} diff --git a/enterprise/neo4j-enterprise/src/test/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimitWithSmallRecords.java b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimitWithSmallRecords.java index 4f7cb0af8f22..73b49b4706a9 100644 --- a/enterprise/neo4j-enterprise/src/test/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimitWithSmallRecords.java +++ b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/kernel/impl/store/format/highlimit/HighLimitWithSmallRecords.java @@ -31,6 +31,7 @@ public class HighLimitWithSmallRecords extends HighLimit { public static final String NAME = "high_limit_with_small_records"; + public static final String STORE_VERSION = "vT.H.0"; public static final RecordFormats RECORD_FORMATS = new HighLimitWithSmallRecords(); private static final int NODE_RECORD_SIZE = NodeRecordFormat.RECORD_SIZE / 2; @@ -41,6 +42,18 @@ private HighLimitWithSmallRecords() { } + @Override + public String name() + { + return NAME; + } + + @Override + public String storeVersion() + { + return STORE_VERSION; + } + @Override public RecordFormat node() { diff --git a/enterprise/neo4j-enterprise/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertEnterpriseTest.java b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertEnterpriseTest.java index 07a2e1c15dc2..47aa507fcca9 100644 --- a/enterprise/neo4j-enterprise/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertEnterpriseTest.java +++ b/enterprise/neo4j-enterprise/src/test/java/org/neo4j/unsafe/batchinsert/BatchInsertEnterpriseTest.java @@ -21,16 +21,27 @@ import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; import java.util.Map; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.Relationship; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.factory.EnterpriseGraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.helpers.collection.Iterables; import org.neo4j.kernel.impl.MyRelTypes; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.rule.TargetDirectory; @@ -44,24 +55,28 @@ * Just testing the {@link BatchInserter} in an enterprise setting, i.e. with all packages and extensions * that exist in enterprise edition. */ +@RunWith( Parameterized.class ) public class BatchInsertEnterpriseTest { - private enum Labels implements Label - { - One, - Two - } - @Rule public final TargetDirectory.TestDirectory directory = TargetDirectory.testDirForTest( getClass() ); + @Parameter + public String recordFormat; + + @Parameters( name = "{0}" ) + public static List recordFormats() + { + return Arrays.asList( StandardV3_0.NAME, HighLimit.NAME ); + } + @Test public void shouldInsertDifferentTypesOfThings() throws Exception { // GIVEN BatchInserter inserter = BatchInserters.inserter( directory.directory(), stringMap( GraphDatabaseSettings.log_queries.name(), "true", - GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME, + GraphDatabaseSettings.record_format.name(), recordFormat, GraphDatabaseSettings.log_queries_filename.name(), directory.file( "query.log" ).getAbsolutePath() ) ); long node1Id, node2Id, relationshipId; try @@ -98,8 +113,85 @@ public void shouldInsertDifferentTypesOfThings() throws Exception } } - private Map someProperties( int id ) + @Test + public void insertIntoExistingDatabase() throws IOException + { + File storeDir = directory.directory(); + + GraphDatabaseService db = newDb( storeDir, recordFormat ); + try + { + createThreeNodes( db ); + } + finally + { + db.shutdown(); + } + + BatchInserter inserter = BatchInserters.inserter( storeDir ); + try + { + long start = inserter.createNode( someProperties( 5 ), Labels.One ); + long end = inserter.createNode( someProperties( 5 ), Labels.One ); + inserter.createRelationship( start, end, MyRelTypes.TEST, someProperties( 5 ) ); + } + finally + { + inserter.shutdown(); + } + + db = newDb( storeDir, recordFormat ); + try + { + verifyNodeCount( db, 4 ); + } + finally + { + db.shutdown(); + } + } + + private static void verifyNodeCount( GraphDatabaseService db, int expectedNodeCount ) + { + try ( Transaction tx = db.beginTx() ) + { + assertEquals( expectedNodeCount, Iterables.count( db.getAllNodes() ) ); + tx.success(); + } + } + + private static void createThreeNodes( GraphDatabaseService db ) + { + try ( Transaction tx = db.beginTx() ) + { + Node start = db.createNode( Labels.One ); + someProperties( 5 ).forEach( start::setProperty ); + + Node end = db.createNode( Labels.Two ); + someProperties( 5 ).forEach( end::setProperty ); + + Relationship rel = start.createRelationshipTo( end, MyRelTypes.TEST ); + someProperties( 5 ).forEach( rel::setProperty ); + + tx.success(); + } + } + + private static Map someProperties( int id ) { return map( "key", "value" + id, "number", 10 + id ); } + + private GraphDatabaseService newDb( File storeDir, String recordFormat ) + { + return new EnterpriseGraphDatabaseFactory().newEmbeddedDatabaseBuilder( storeDir ) + .setConfig( GraphDatabaseSettings.record_format, recordFormat ) + .newGraphDatabase(); + } + + private enum Labels implements Label + { + One, + Two + } } diff --git a/enterprise/neo4j-enterprise/src/test/java/upgrade/EnterpriseStoreUpgraderTest.java b/enterprise/neo4j-enterprise/src/test/java/upgrade/EnterpriseStoreUpgraderTest.java index 0b932d40f842..51986bc4ab69 100644 --- a/enterprise/neo4j-enterprise/src/test/java/upgrade/EnterpriseStoreUpgraderTest.java +++ b/enterprise/neo4j-enterprise/src/test/java/upgrade/EnterpriseStoreUpgraderTest.java @@ -20,7 +20,7 @@ package upgrade; import org.neo4j.kernel.impl.store.format.RecordFormats; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; /** * Runs the store upgrader tests from older versions, migrating to the current enterprise version. @@ -35,12 +35,6 @@ public EnterpriseStoreUpgraderTest( String version ) @Override protected RecordFormats getRecordFormats() { - return StandardV3_0.RECORD_FORMATS; - } - - @Override - protected String getRecordFormatsName() - { - return StandardV3_0.NAME; + return HighLimit.RECORD_FORMATS; } } diff --git a/enterprise/neo4j-enterprise/src/test/java/upgrade/RecordFormatsMigrationIT.java b/enterprise/neo4j-enterprise/src/test/java/upgrade/RecordFormatsMigrationIT.java new file mode 100644 index 000000000000..23667cff4074 --- /dev/null +++ b/enterprise/neo4j-enterprise/src/test/java/upgrade/RecordFormatsMigrationIT.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package upgrade; + +import org.junit.Rule; +import org.junit.Test; + +import java.io.IOException; +import java.util.function.Consumer; + +import org.neo4j.graphdb.GraphDatabaseService; +import org.neo4j.graphdb.Label; +import org.neo4j.graphdb.Node; +import org.neo4j.graphdb.Transaction; +import org.neo4j.graphdb.factory.GraphDatabaseFactory; +import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.helpers.Exceptions; +import org.neo4j.io.fs.DefaultFileSystemAbstraction; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.PageCache; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.configuration.Settings; +import org.neo4j.kernel.impl.pagecache.StandalonePageCacheFactory; +import org.neo4j.kernel.impl.store.format.RecordFormatSelector; +import org.neo4j.kernel.impl.store.format.RecordFormats; +import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; +import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; +import org.neo4j.kernel.impl.storemigration.StoreUpgrader.UnexpectedUpgradingStoreFormatException; +import org.neo4j.logging.NullLogProvider; +import org.neo4j.test.rule.TargetDirectory; + +import static org.hamcrest.Matchers.instanceOf; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static org.neo4j.helpers.collection.MapUtil.stringMap; +import static org.neo4j.test.rule.TargetDirectory.testDirForTest; + +public class RecordFormatsMigrationIT +{ + private static final Label LABEL = Label.label( "Centipede" ); + private static final String PROPERTY = "legs"; + private static final int VALUE = 42; + + private final FileSystemAbstraction fs = new DefaultFileSystemAbstraction(); + + @Rule + public final TargetDirectory.TestDirectory testDir = testDirForTest( RecordFormatsMigrationIT.class, fs ); + + @Test + public void migrateStandardToHighLimit() throws IOException + { + executeAndStopDb( startStandardFormatDb(), this::createNode ); + assertStandardStore(); + + executeAndStopDb( startHighLimitFormatDb(), this::assertNodeExists ); + assertHighLimitStore(); + } + + @Test + public void migrateHighLimitToStandard() throws IOException + { + executeAndStopDb( startHighLimitFormatDb(), this::createNode ); + assertHighLimitStore(); + + try + { + startStandardFormatDb(); + fail( "Should not be possible to downgrade" ); + } + catch ( Exception e ) + { + assertThat( Exceptions.rootCause( e ), instanceOf( UnexpectedUpgradingStoreFormatException.class ) ); + } + assertHighLimitStore(); + } + + private void createNode( GraphDatabaseService db ) + { + try ( Transaction tx = db.beginTx() ) + { + Node start = db.createNode( LABEL ); + start.setProperty( PROPERTY, VALUE ); + tx.success(); + } + } + + private void assertNodeExists( GraphDatabaseService db ) + { + try ( Transaction tx = db.beginTx() ) + { + assertNotNull( db.findNode( LABEL, PROPERTY, VALUE ) ); + tx.success(); + } + } + + private GraphDatabaseService startStandardFormatDb() + { + return startDb( StandardV3_0.NAME ); + } + + private GraphDatabaseService startHighLimitFormatDb() + { + return startDb( HighLimit.NAME ); + } + + private GraphDatabaseService startDb( String recordFormatName ) + { + return new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( testDir.graphDbDir() ) + .setConfig( GraphDatabaseSettings.allow_store_upgrade, Settings.TRUE ) + .setConfig( GraphDatabaseSettings.record_format, recordFormatName ) + .newGraphDatabase(); + } + + private void assertStandardStore() throws IOException + { + assertStoreFormat( StandardV3_0.RECORD_FORMATS ); + } + + private void assertHighLimitStore() throws IOException + { + assertStoreFormat( HighLimit.RECORD_FORMATS ); + } + + private void assertStoreFormat( RecordFormats expected ) throws IOException + { + Config config = new Config( stringMap( GraphDatabaseSettings.pagecache_memory.name(), "8m" ) ); + try ( PageCache pageCache = StandalonePageCacheFactory.createPageCache( fs, config ) ) + { + RecordFormats actual = RecordFormatSelector.selectForStoreOrConfig( config, testDir.graphDbDir(), fs, + pageCache, NullLogProvider.getInstance() ); + assertNotNull( actual ); + assertEquals( expected.storeVersion(), actual.storeVersion() ); + } + } + + private static void executeAndStopDb( GraphDatabaseService db, Consumer action ) + { + try + { + action.accept( db ); + } + finally + { + db.shutdown(); + } + } +} diff --git a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom20IT.java b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom20IT.java index 97144e8e06a6..7d3fe25dd102 100644 --- a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom20IT.java +++ b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom20IT.java @@ -30,8 +30,8 @@ import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Map; +import java.util.Arrays; +import java.util.List; import org.neo4j.consistency.checking.full.ConsistencyCheckIncompleteException; import org.neo4j.graphdb.GraphDatabaseService; @@ -54,11 +54,9 @@ import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; -import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.storemigration.StoreUpgrader; import org.neo4j.kernel.impl.storemigration.StoreVersionCheck; import org.neo4j.kernel.impl.storemigration.UpgradableDatabase; @@ -66,6 +64,7 @@ import org.neo4j.kernel.impl.storemigration.participant.SchemaIndexMigrator; import org.neo4j.kernel.impl.storemigration.participant.StoreMigrator; import org.neo4j.kernel.lifecycle.LifeSupport; +import org.neo4j.logging.LogProvider; import org.neo4j.logging.NullLogProvider; import org.neo4j.test.rule.PageCacheRule; import org.neo4j.test.rule.TargetDirectory; @@ -79,51 +78,41 @@ import static org.neo4j.kernel.impl.ha.ClusterManager.allSeesAllAsAvailable; import static org.neo4j.kernel.impl.storemigration.MigrationTestUtils.find20FormatStoreDirectory; -import static java.util.Arrays.asList; - @RunWith( Parameterized.class ) public class StoreMigratorFrom20IT { - @Parameters - public static Collection formats() - { - return asList( StandardV3_0.NAME, HighLimit.NAME ); - } - @Rule public final TargetDirectory.TestDirectory storeDir = TargetDirectory.testDirForTest( getClass() ); @Rule public final PageCacheRule pageCacheRule = new PageCacheRule(); - private Config config; - private final FileSystemAbstraction fs = new DefaultFileSystemAbstraction(); private final ListAccumulatorMigrationProgressMonitor monitor = new ListAccumulatorMigrationProgressMonitor(); - private StoreFactory storeFactory; private PageCache pageCache; private final LifeSupport life = new LifeSupport(); private UpgradableDatabase upgradableDatabase; private SchemaIndexProvider schemaIndexProvider; private LabelScanStoreProvider labelScanStoreProvider; - @Parameter( 0 ) - public String formatName; - private RecordFormats format; + + @Parameter + public RecordFormats recordFormat; + + @Parameters( name = "{0}" ) + public static List recordFormats() + { + return Arrays.asList( StandardV3_0.RECORD_FORMATS, HighLimit.RECORD_FORMATS ); + } @Before public void setUp() { - config = new Config( stringMap( GraphDatabaseSettings.record_format.name(), formatName ) ); - pageCache = pageCacheRule.getPageCache( fs ); schemaIndexProvider = new LuceneSchemaIndexProvider( fs, DirectoryFactory.PERSISTENT, storeDir.directory() ); labelScanStoreProvider = new LabelScanStoreProvider( new InMemoryLabelScanStore(), 1 ); - format = RecordFormatSelector.select( config, NullLogService.getInstance() ); - storeFactory = new StoreFactory( storeDir.directory(), config, new DefaultIdGeneratorFactory( fs ), - pageCache, fs, format, NullLogProvider.getInstance() ); upgradableDatabase = new UpgradableDatabase( fs, new StoreVersionCheck( pageCache ), - new LegacyStoreVersionCheck( fs ), format ); + new LegacyStoreVersionCheck( fs ), recordFormat ); } @After @@ -136,7 +125,7 @@ public void tearDown() public void shouldMigrate() throws IOException, ConsistencyCheckIncompleteException { // WHEN - StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, config, NullLogService.getInstance(), + StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, getConfig(), NullLogService.getInstance(), schemaIndexProvider ); SchemaIndexMigrator indexMigrator = new SchemaIndexMigrator( fs, schemaIndexProvider, labelScanStoreProvider ); upgrader( indexMigrator, storeMigrator ).migrateIfNeeded( find20FormatStoreDirectory( storeDir.directory() ) ); @@ -148,7 +137,6 @@ public void shouldMigrate() throws IOException, ConsistencyCheckIncompleteExcept GraphDatabaseService database = new EnterpriseGraphDatabaseFactory() .newEmbeddedDatabaseBuilder( storeDir.absolutePath() ) - .setConfig( GraphDatabaseSettings.record_format, formatName ) .newGraphDatabase(); try { @@ -160,11 +148,13 @@ public void shouldMigrate() throws IOException, ConsistencyCheckIncompleteExcept database.shutdown(); } + LogProvider logProvider = NullLogProvider.getInstance(); + StoreFactory storeFactory = new StoreFactory( storeDir.directory(), pageCache, fs, logProvider ); try ( NeoStores neoStores = storeFactory.openAllNeoStores( true ) ) { verifyNeoStore( neoStores ); } - assertConsistentStore( storeDir.directory(), config ); + assertConsistentStore( storeDir.directory() ); } @Test @@ -174,12 +164,12 @@ public void shouldMigrateCluster() throws Throwable File legacyStoreDir = find20FormatStoreDirectory( storeDir.directory() ); // When - StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, config, NullLogService.getInstance(), + StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, getConfig(), NullLogService.getInstance(), schemaIndexProvider ); SchemaIndexMigrator indexMigrator = new SchemaIndexMigrator( fs, schemaIndexProvider, labelScanStoreProvider ); upgrader( indexMigrator, storeMigrator ).migrateIfNeeded( legacyStoreDir ); ClusterManager.ManagedCluster cluster = - buildClusterWithMasterDirIn( fs, legacyStoreDir, life, config.getParams() ); + buildClusterWithMasterDirIn( fs, legacyStoreDir, life, getConfig().getParams() ); cluster.await( allSeesAllAsAvailable() ); cluster.sync(); @@ -237,20 +227,24 @@ public void verifyNeoStore( NeoStores neoStores ) assertEquals( 1317392957120L, metaDataStore.getCreationTime() ); assertEquals( -472309512128245482L, metaDataStore.getRandomNumber() ); assertEquals( 5L, metaDataStore.getCurrentLogVersion() ); - assertEquals( format.storeVersion(), + assertEquals( recordFormat.storeVersion(), MetaDataStore.versionLongToString( metaDataStore.getStoreVersion() ) ); assertEquals( 1042L, metaDataStore.getLastCommittedTransactionId() ); } private StoreUpgrader upgrader( SchemaIndexMigrator indexMigrator, StoreMigrator storeMigrator ) { - Map params = config.getParams(); - params.put( GraphDatabaseSettings.allow_store_upgrade.name(), "true" ); - Config config = new Config( params ); + Config config = getConfig().augment( stringMap( GraphDatabaseSettings.allow_store_upgrade.name(), "true" ) ); StoreUpgrader upgrader = new StoreUpgrader( upgradableDatabase, monitor, config, fs, NullLogProvider.getInstance() ); upgrader.addParticipant( indexMigrator ); upgrader.addParticipant( storeMigrator ); return upgrader; } + + private Config getConfig() + { + return new Config( stringMap( GraphDatabaseSettings.record_format.name(), recordFormat.name() ), + GraphDatabaseSettings.class ); + } } diff --git a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java index ec5318e64e8e..5d0bdc3f98fe 100644 --- a/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java +++ b/enterprise/neo4j-enterprise/src/test/java/upgrade/StoreMigratorFrom21IT.java @@ -38,7 +38,6 @@ import org.neo4j.graphdb.factory.GraphDatabaseFactory; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.helpers.collection.Iterators; -import org.neo4j.helpers.collection.MapUtil; import org.neo4j.helpers.collection.Pair; import org.neo4j.helpers.progress.ProgressMonitorFactory; import org.neo4j.kernel.api.KernelAPI; @@ -46,7 +45,6 @@ import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.security.AccessMode; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.storemigration.MigrationTestUtils; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.logging.NullLogProvider; @@ -100,17 +98,13 @@ public void mustMendDuplicatePropertiesWhenUpgradingFromVersion21() throws Excep File dir = MigrationTestUtils.find21FormatStoreDirectoryWithDuplicateProperties( storeDir.directory() ); GraphDatabaseBuilder builder = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( dir ) - .setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); + .setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ); GraphDatabaseService database = builder.newGraphDatabase(); database.shutdown(); ConsistencyCheckService service = new ConsistencyCheckService(); - ConsistencyCheckService.Result result = service.runFullConsistencyCheck( - dir.getAbsoluteFile(), Config.defaults().with( MapUtil.stringMap( GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME ) ), - ProgressMonitorFactory.NONE, - NullLogProvider - .getInstance(), false ); + ConsistencyCheckService.Result result = service.runFullConsistencyCheck( dir.getAbsoluteFile(), + Config.empty(), ProgressMonitorFactory.NONE, NullLogProvider.getInstance(), false ); assertTrue( result.isSuccessful() ); database = builder.newGraphDatabase(); diff --git a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java index 1cfe02ff28f9..10a400b20178 100644 --- a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java +++ b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java @@ -62,7 +62,6 @@ import org.neo4j.kernel.impl.ha.ClusterManager; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.RecordStorageEngine; import org.neo4j.kernel.impl.store.MetaDataStore; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.impl.storemigration.StoreUpgrader; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; import org.neo4j.kernel.internal.GraphDatabaseAPI; @@ -173,7 +172,6 @@ public void embeddedDatabaseShouldStartOnOlderStoreWhenUpgradeIsEnabled() throws GraphDatabaseBuilder builder = factory.newEmbeddedDatabaseBuilder( dir ); builder.setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ); builder.setConfig( GraphDatabaseSettings.pagecache_memory, "8m" ); - builder.setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); builder.setConfig( GraphDatabaseSettings.logs_directory, testDir.directory( "logs" ).getAbsolutePath() ); GraphDatabaseService db = builder.newGraphDatabase(); try @@ -186,7 +184,7 @@ public void embeddedDatabaseShouldStartOnOlderStoreWhenUpgradeIsEnabled() throws db.shutdown(); } - assertConsistentStore( dir, getConfig() ); + assertConsistentStore( dir ); } @Test @@ -205,7 +203,6 @@ public void serverDatabaseShouldStartOnOlderStoreWhenUpgradeIsEnabled() throws T props.setProperty( GraphDatabaseSettings.logs_directory.name(), rootDir.getAbsolutePath() ); props.setProperty( GraphDatabaseSettings.allow_store_upgrade.name(), "true" ); props.setProperty( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); - props.setProperty( GraphDatabaseSettings.record_format.name(), StandardV3_0.NAME ); props.setProperty( httpConnector( "1" ).type.name(), "HTTP" ); props.setProperty( httpConnector( "1" ).enabled.name(), "true" ); try ( FileWriter writer = new FileWriter( configFile ) ) @@ -237,7 +234,6 @@ public void migratingOlderDataAndThanStartAClusterUsingTheNewerDataShouldWork() GraphDatabaseBuilder builder = factory.newEmbeddedDatabaseBuilder( dir ); builder.setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ); builder.setConfig( GraphDatabaseSettings.pagecache_memory, "8m" ); - builder.setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); builder.setConfig( GraphDatabaseSettings.logs_directory, testDir.directory( "logs" ).getAbsolutePath() ); GraphDatabaseService db = builder.newGraphDatabase(); try @@ -249,7 +245,7 @@ public void migratingOlderDataAndThanStartAClusterUsingTheNewerDataShouldWork() db.shutdown(); } - assertConsistentStore( dir, getConfig() ); + assertConsistentStore( dir ); // start the cluster with the db migrated from the old instance File haDir = new File( dir.getParentFile(), "ha-stuff" ); @@ -275,8 +271,8 @@ public void migratingOlderDataAndThanStartAClusterUsingTheNewerDataShouldWork() clusterManager.safeShutdown(); } - assertConsistentStore( new File( master.getStoreDir() ), getConfig() ); - assertConsistentStore( new File( slave.getStoreDir() ), getConfig() ); + assertConsistentStore( new File( master.getStoreDir() ) ); + assertConsistentStore( new File( slave.getStoreDir() ) ); } } @@ -310,7 +306,6 @@ public void migrationShouldFail() throws Throwable GraphDatabaseBuilder builder = factory.newEmbeddedDatabaseBuilder( dir ); builder.setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ); builder.setConfig( GraphDatabaseSettings.pagecache_memory, "8m" ); - builder.setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); try { builder.newGraphDatabase(); @@ -357,7 +352,6 @@ public void shouldBeAbleToUpgradeAStoreWithoutIdFilesAsBackups() throws Throwabl GraphDatabaseFactory factory = new TestGraphDatabaseFactory(); GraphDatabaseBuilder builder = factory.newEmbeddedDatabaseBuilder( dir ); builder.setConfig( GraphDatabaseSettings.allow_store_upgrade, "true" ); - builder.setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ); GraphDatabaseService db = builder.newGraphDatabase(); try { @@ -591,10 +585,4 @@ private static IndexDescriptor awaitOnline( GraphDatabaseAPI db, } throw new IllegalStateException( "Index did not become ONLINE within reasonable time" ); } - - private static Config getConfig() - { - return new Config( stringMap( GraphDatabaseSettings.record_format.name(), - StandardV3_0.NAME ) ); - } } diff --git a/stresstests/src/test/java/org/neo4j/kernel/stresstests/transaction/checkpoint/CheckPointingLogRotationStressTesting.java b/stresstests/src/test/java/org/neo4j/kernel/stresstests/transaction/checkpoint/CheckPointingLogRotationStressTesting.java index 7dc646134278..bded759b5d68 100644 --- a/stresstests/src/test/java/org/neo4j/kernel/stresstests/transaction/checkpoint/CheckPointingLogRotationStressTesting.java +++ b/stresstests/src/test/java/org/neo4j/kernel/stresstests/transaction/checkpoint/CheckPointingLogRotationStressTesting.java @@ -31,7 +31,6 @@ import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory; import org.neo4j.kernel.impl.logging.NullLogService; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.stresstests.transaction.checkpoint.tracers.TimerTransactionTracer; import org.neo4j.kernel.stresstests.transaction.checkpoint.workload.Workload; import org.neo4j.unsafe.impl.batchimport.ParallelBatchImporter; @@ -82,7 +81,6 @@ public void shouldBehaveCorrectlyUnderStress() throws Throwable GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( storeDir ) .setConfig( GraphDatabaseSettings.pagecache_memory, pageCacheMemory ) .setConfig( GraphDatabaseSettings.mapped_memory_page_size, pageSize ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) .setConfig( GraphDatabaseSettings.check_point_interval_time, CHECK_POINT_INTERVAL_SECONDS + "s" ) .setConfig( GraphDatabaseFacadeFactory.Configuration.tracer, "timer" ) .newGraphDatabase(); diff --git a/tools/src/main/java/org/neo4j/tools/dump/DumpCountsStore.java b/tools/src/main/java/org/neo4j/tools/dump/DumpCountsStore.java index 10beb42ad917..94b7bc0a62d2 100644 --- a/tools/src/main/java/org/neo4j/tools/dump/DumpCountsStore.java +++ b/tools/src/main/java/org/neo4j/tools/dump/DumpCountsStore.java @@ -36,7 +36,6 @@ import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.TokenStore; import org.neo4j.kernel.impl.store.counts.CountsTracker; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.kvstore.HeaderField; import org.neo4j.kernel.impl.store.kvstore.Headers; import org.neo4j.kernel.impl.store.kvstore.MetadataVisitor; @@ -71,8 +70,7 @@ public static void dumpCountsStore( FileSystemAbstraction fs, File path, PrintSt { if ( fs.isDirectory( path ) ) { - StoreFactory factory = new StoreFactory( fs, path, pages, RecordFormatSelector.autoSelectFormat(), - NullLogProvider.getInstance() ); + StoreFactory factory = new StoreFactory( path, pages, fs, NullLogProvider.getInstance() ); NeoStores neoStores = factory.openAllNeoStores(); neoStores.getCounts().accept( new DumpCountsStore( out, neoStores ) ); diff --git a/tools/src/main/java/org/neo4j/tools/dump/DumpStore.java b/tools/src/main/java/org/neo4j/tools/dump/DumpStore.java index 89797bb6d368..9083339fae41 100644 --- a/tools/src/main/java/org/neo4j/tools/dump/DumpStore.java +++ b/tools/src/main/java/org/neo4j/tools/dump/DumpStore.java @@ -36,7 +36,6 @@ import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; import org.neo4j.kernel.impl.store.TokenStore; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord; @@ -70,9 +69,8 @@ public static void main( String... args ) throws Exception final DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( fs ); try ( PageCache pageCache = createPageCache( fs ) ) { - Function createStoreFactory = - file -> new StoreFactory( file.getParentFile(), Config.defaults(), idGeneratorFactory, pageCache, fs, - RecordFormatSelector.autoSelectFormat(), logProvider() ); + Function createStoreFactory = file -> new StoreFactory( file.getParentFile(), + Config.defaults(), idGeneratorFactory, pageCache, fs, logProvider() ); for ( String arg : args ) { diff --git a/tools/src/main/java/org/neo4j/tools/dump/DumpStoreChain.java b/tools/src/main/java/org/neo4j/tools/dump/DumpStoreChain.java index a34f24ffbb58..6f7888ba0341 100644 --- a/tools/src/main/java/org/neo4j/tools/dump/DumpStoreChain.java +++ b/tools/src/main/java/org/neo4j/tools/dump/DumpStoreChain.java @@ -36,7 +36,6 @@ import org.neo4j.kernel.impl.store.RelationshipStore; import org.neo4j.kernel.impl.store.StoreFactory; import org.neo4j.kernel.impl.store.StoreType; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -120,7 +119,7 @@ void dump( File storeDir ) throws IOException DefaultIdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( fs ); Config config = Config.defaults(); StoreFactory storeFactory = new StoreFactory( storeDir, config, idGeneratorFactory, pageCache, fs, - RecordFormatSelector.autoSelectFormat(), logProvider() ); + logProvider() ); try ( NeoStores neoStores = storeFactory.openNeoStores( getStoreTypes() ) ) { diff --git a/tools/src/main/java/org/neo4j/tools/migration/StoreMigration.java b/tools/src/main/java/org/neo4j/tools/migration/StoreMigration.java index caf2778d76f9..4a2774eada6d 100644 --- a/tools/src/main/java/org/neo4j/tools/migration/StoreMigration.java +++ b/tools/src/main/java/org/neo4j/tools/migration/StoreMigration.java @@ -123,15 +123,10 @@ public void run( final FileSystemAbstraction fs, final File storeDirectory, Conf try ( PageCache pageCache = createPageCache( fs, config ) ) { long startTime = System.currentTimeMillis(); - new DatabaseMigrator( - progressMonitor, - fs, - config, - logService, - schemaIndexProvider, - labelScanStoreProvider, - legacyIndexProvider.getIndexProviders(), - pageCache, RecordFormatSelector.autoSelectFormat(config, logService) ).migrate( storeDirectory ); + DatabaseMigrator migrator = new DatabaseMigrator( progressMonitor, fs, config, logService, + schemaIndexProvider, labelScanStoreProvider, legacyIndexProvider.getIndexProviders(), + pageCache, RecordFormatSelector.selectForConfig( config, userLogProvider ) ); + migrator.migrate( storeDirectory ); long duration = System.currentTimeMillis() - startTime; log.info( format( "Migration completed in %d s%n", duration / 1000 ) ); } diff --git a/tools/src/main/java/org/neo4j/tools/rawstorereader/RsdrMain.java b/tools/src/main/java/org/neo4j/tools/rawstorereader/RsdrMain.java index a5413e52e774..92ac07e7ae01 100644 --- a/tools/src/main/java/org/neo4j/tools/rawstorereader/RsdrMain.java +++ b/tools/src/main/java/org/neo4j/tools/rawstorereader/RsdrMain.java @@ -41,7 +41,6 @@ import org.neo4j.kernel.impl.store.NeoStores; import org.neo4j.kernel.impl.store.RecordStore; import org.neo4j.kernel.impl.store.StoreFactory; -import org.neo4j.kernel.impl.store.format.RecordFormatSelector; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; @@ -108,8 +107,7 @@ private static StoreFactory openStore( File storeDir, Config config, PageCache p { IdGeneratorFactory idGeneratorFactory = new DefaultIdGeneratorFactory( files ); NullLogProvider logProvider = NullLogProvider.getInstance(); - return new StoreFactory( storeDir, config, idGeneratorFactory, pageCache, files, RecordFormatSelector.autoSelectFormat(), - logProvider ); + return new StoreFactory( storeDir, config, idGeneratorFactory, pageCache, files, logProvider ); } private static void interact( NeoStores neoStores ) throws IOException diff --git a/tools/src/test/java/org/neo4j/tools/migration/StoreMigrationTest.java b/tools/src/test/java/org/neo4j/tools/migration/StoreMigrationTest.java index 044c7988a6d5..b046a2b16450 100644 --- a/tools/src/test/java/org/neo4j/tools/migration/StoreMigrationTest.java +++ b/tools/src/test/java/org/neo4j/tools/migration/StoreMigrationTest.java @@ -28,8 +28,6 @@ import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; -import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.test.TestGraphDatabaseFactory; import org.neo4j.test.Unzip; import org.neo4j.test.rule.SuppressOutput; @@ -54,10 +52,7 @@ public void storeMigrationToolShouldBeAbleToMigrateOldStore() throws IOException StoreMigration.main( new String[]{testDir.graphDbDir().getAbsolutePath()} ); // after migration we can open store and do something - GraphDatabaseService database = new TestGraphDatabaseFactory() - .newEmbeddedDatabaseBuilder( testDir.graphDbDir() ) - .setConfig( GraphDatabaseSettings.record_format, StandardV3_0.NAME ) - .newGraphDatabase(); + GraphDatabaseService database = new TestGraphDatabaseFactory().newEmbeddedDatabase( testDir.graphDbDir() ); try (Transaction transaction = database.beginTx()) { Node node = database.createNode(); diff --git a/tools/src/test/java/org/neo4j/tools/rebuild/RebuildFromLogsTest.java b/tools/src/test/java/org/neo4j/tools/rebuild/RebuildFromLogsTest.java index 3008da622c54..f47fb7f0e7b6 100644 --- a/tools/src/test/java/org/neo4j/tools/rebuild/RebuildFromLogsTest.java +++ b/tools/src/test/java/org/neo4j/tools/rebuild/RebuildFromLogsTest.java @@ -38,9 +38,7 @@ import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileUtils; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.store.MetaDataStore; -import org.neo4j.kernel.impl.store.format.standard.StandardV3_0; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.test.DbRepresentation; import org.neo4j.test.TestGraphDatabaseFactory; @@ -48,8 +46,6 @@ import org.neo4j.test.rule.TargetDirectory; import static org.junit.Assert.assertEquals; -import static org.neo4j.graphdb.factory.GraphDatabaseSettings.record_format; -import static org.neo4j.helpers.collection.MapUtil.stringMap; import static org.neo4j.kernel.impl.transaction.log.TransactionIdStore.BASE_TX_ID; import static org.neo4j.test.rule.TargetDirectory.testDirForTest; @@ -91,7 +87,7 @@ public void shouldRebuildFromLog() throws Exception private DbRepresentation getDbRepresentation( File path ) { - return DbRepresentation.of( path, getConfig() ); + return DbRepresentation.of( path ); } @Test @@ -135,18 +131,9 @@ public void shouldRebuildFromLogUpToATx() throws Exception assertEquals( getDbRepresentation( prototypePath ), getDbRepresentation( rebuildPath ) ); } - private Config getConfig() - { - return new Config( stringMap( record_format.name(), StandardV3_0.NAME ) ); - } - private GraphDatabaseAPI db( File rebuiltPath ) { - return (GraphDatabaseAPI) new TestGraphDatabaseFactory() - .newEmbeddedDatabaseBuilder( rebuiltPath ) - .setConfig( record_format, StandardV3_0.NAME ) - .newGraphDatabase(); - + return (GraphDatabaseAPI) new TestGraphDatabaseFactory().newEmbeddedDatabase( rebuiltPath ); } enum Transaction