From cba5a00e1754319482ce69574405c4fb8137ae0c Mon Sep 17 00:00:00 2001 From: MishaDemianenko Date: Mon, 20 Aug 2018 19:18:00 +0200 Subject: [PATCH] Move DatabasseAvailability to database level. --- .../neo4j/kernel/DatabaseCreationContext.java | 5 +++- .../org/neo4j/kernel/NeoStoreDataSource.java | 15 +++++++---- .../test/rule/NeoStoreDataSourceRule.java | 9 ++++++- .../facade/GraphDatabaseFacadeFactory.java | 6 ----- .../graphdb/factory/module/EditionModule.java | 3 +-- .../ModularDatabaseCreationContext.java | 25 ++++++++++++++++--- 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java b/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java index 1a5a9ee892267..a2467f771c691 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java @@ -31,6 +31,7 @@ import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.tracing.cursor.context.VersionContextSupplier; import org.neo4j.kernel.api.explicitindex.AutoIndexing; +import org.neo4j.kernel.availability.DatabaseAvailability; import org.neo4j.kernel.availability.DatabaseAvailabilityGuard; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.KernelExtensionFactory; @@ -97,7 +98,7 @@ public interface DatabaseCreationContext FileSystemAbstraction getFs(); - TransactionMonitor getTransactionMonitor(); + TransactionMonitor getTransactionStats(); DatabaseHealth getDatabaseHealth(); @@ -152,4 +153,6 @@ public interface DatabaseCreationContext GraphDatabaseFacade getFacade(); Iterable getEngineProviders(); + + DatabaseAvailability getDatabaseAvailability(); } 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 35489bd7ac0b0..6fe919554dff4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -45,6 +45,7 @@ import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.index.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.LabelScanStore; +import org.neo4j.kernel.availability.DatabaseAvailability; import org.neo4j.kernel.availability.DatabaseAvailabilityGuard; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.DatabaseKernelExtensions; @@ -199,6 +200,11 @@ public class NeoStoreDataSource extends LifecycleAdapter private final StoreCopyCheckPointMutex storeCopyCheckPointMutex; private final CollectionsFactorySupplier collectionsFactorySupplier; private final Locks locks; + private final DatabaseAvailability databaseAvailability; + + private Dependencies dataSourceDependencies; + private LifeSupport life; + private IndexProviderMap indexProviderMap; private final String databaseName; private final DatabaseLayout databaseLayout; private final boolean readOnly; @@ -208,10 +214,6 @@ public class NeoStoreDataSource extends LifecycleAdapter private final VersionContextSupplier versionContextSupplier; private final AccessCapability accessCapability; - private Dependencies dataSourceDependencies; - private LifeSupport life; - private IndexProviderMap indexProviderMap; - private StorageEngine storageEngine; private QueryExecutionEngine executionEngine; private NeoStoreTransactionLogModule transactionLogModule; @@ -244,7 +246,7 @@ public NeoStoreDataSource( DatabaseCreationContext context ) this.transactionEventHandlers = context.getTransactionEventHandlers(); this.indexingServiceMonitor = context.getIndexingServiceMonitor(); this.fs = context.getFs(); - this.transactionMonitor = context.getTransactionMonitor(); + this.transactionMonitor = context.getTransactionStats(); this.databaseHealth = context.getDatabaseHealth(); this.physicalLogMonitor = context.getPhysicalLogMonitor(); this.transactionHeaderInformationFactory = context.getTransactionHeaderInformationFactory(); @@ -272,6 +274,7 @@ public NeoStoreDataSource( DatabaseCreationContext context ) this.pageCache = context.getPageCache(); this.monitors.addMonitorListener( new LoggingLogFileMonitor( msgLog ) ); this.collectionsFactorySupplier = context.getCollectionsFactorySupplier(); + this.databaseAvailability = context.getDatabaseAvailability(); this.failOnCorruptedLogFiles = context.getConfig().get( GraphDatabaseSettings.fail_on_corrupted_log_files ); } @@ -293,6 +296,7 @@ public void start() throws IOException dataSourceDependencies.satisfyDependency( transactionMonitor ); dataSourceDependencies.satisfyDependency( locks ); dataSourceDependencies.satisfyDependency( databaseAvailabilityGuard ); + dataSourceDependencies.satisfyDependency( databaseAvailability ); life = new LifeSupport(); dataSourceDependencies.satisfyDependency( explicitIndexProvider ); @@ -410,6 +414,7 @@ public void start() throws IOException } life.add( new DatabaseDiagnostics( dataSourceDependencies.resolveDependency( DiagnosticsManager.class ), this, databaseInfo ) ); + life.add( databaseAvailability ); life.setLast( lifecycleToTriggerCheckPointOnShutdown() ); try 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 8a2efec1113ba..42a8221c2716b 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 @@ -37,6 +37,7 @@ import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.index.IndexProvider; +import org.neo4j.kernel.availability.DatabaseAvailability; import org.neo4j.kernel.availability.DatabaseAvailabilityGuard; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.KernelExtensionFactory; @@ -381,7 +382,7 @@ public FileSystemAbstraction getFs() } @Override - public TransactionMonitor getTransactionMonitor() + public TransactionMonitor getTransactionStats() { return transactionMonitor; } @@ -547,6 +548,12 @@ public Iterable getEngineProviders() { return engineProviders; } + + @Override + public DatabaseAvailability getDatabaseAvailability() + { + return null; + } } } diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseFacadeFactory.java b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseFacadeFactory.java index 98598cb71ff14..19e795a198a0d 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseFacadeFactory.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/GraphDatabaseFacadeFactory.java @@ -39,7 +39,6 @@ import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.kernel.api.KernelTransaction; -import org.neo4j.kernel.availability.DatabaseAvailability; import org.neo4j.kernel.availability.StartupWaiter; import org.neo4j.kernel.builtinprocs.SpecialBuiltInProcedures; import org.neo4j.kernel.configuration.Config; @@ -178,11 +177,6 @@ public GraphDatabaseFacade initFacade( File storeDir, Config config, final Depen platform.life.add( new VmPauseMonitorComponent( config, platform.logging.getInternalLog( VmPauseMonitorComponent.class ), platform.jobScheduler ) ); platform.dependencies.satisfyDependency( edition.globalTransactionCounter() ); platform.life.add( new PublishPageCacheTracerMetricsAfterStart( platform.tracers.pageCursorTracerSupplier ) ); - DatabaseAvailability databaseAvailability = - new DatabaseAvailability( platform.databaseAvailabilityGuard, edition.globalTransactionCounter(), platform.clock, - config.get( GraphDatabaseSettings.shutdown_transaction_end_timeout ).toMillis() ); - platform.dependencies.satisfyDependency( databaseAvailability ); - platform.life.add( databaseAvailability ); platform.life.add( new StartupWaiter( platform.databaseAvailabilityGuard, edition.transactionStartTimeout ) ); platform.dependencies.satisfyDependency( edition.schemaWriteGuard ); platform.life.setLast( platform.eventHandlers ); diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/EditionModule.java b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/EditionModule.java index 07967615b82eb..4f162504863dc 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/EditionModule.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/EditionModule.java @@ -58,7 +58,6 @@ import org.neo4j.kernel.impl.store.id.IdReuseEligibility; import org.neo4j.kernel.impl.store.id.configuration.IdTypeConfigurationProvider; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; -import org.neo4j.kernel.impl.transaction.TransactionMonitor; import org.neo4j.kernel.impl.transaction.stats.DatabaseTransactionStats; import org.neo4j.kernel.impl.transaction.stats.TransactionCounters; import org.neo4j.kernel.impl.util.Dependencies; @@ -280,7 +279,7 @@ public void createDatabases( DatabaseManager databaseManager, Config config ) databaseManager.createDatabase( config.get( GraphDatabaseSettings.active_database ) ); } - public TransactionMonitor createTransactionMonitor() + public DatabaseTransactionStats createTransactionMonitor() { return databaseStatistics; } diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/ModularDatabaseCreationContext.java b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/ModularDatabaseCreationContext.java index bde64fa398dd9..6fb5a2d74dfe0 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/ModularDatabaseCreationContext.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/ModularDatabaseCreationContext.java @@ -23,6 +23,7 @@ import java.util.function.Function; import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; import org.neo4j.internal.kernel.api.TokenNameLookup; import org.neo4j.io.fs.FileSystemAbstraction; @@ -32,6 +33,7 @@ import org.neo4j.io.pagecache.tracing.cursor.context.VersionContextSupplier; import org.neo4j.kernel.DatabaseCreationContext; import org.neo4j.kernel.api.explicitindex.AutoIndexing; +import org.neo4j.kernel.availability.DatabaseAvailability; import org.neo4j.kernel.availability.DatabaseAvailabilityGuard; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.KernelExtensionFactory; @@ -60,6 +62,7 @@ import org.neo4j.kernel.impl.transaction.TransactionMonitor; import org.neo4j.kernel.impl.transaction.log.checkpoint.StoreCopyCheckPointMutex; import org.neo4j.kernel.impl.transaction.log.files.LogFileCreationMonitor; +import org.neo4j.kernel.impl.transaction.stats.DatabaseTransactionStats; import org.neo4j.kernel.impl.util.collection.CollectionsFactorySupplier; import org.neo4j.kernel.impl.util.watcher.FileSystemWatcherService; import org.neo4j.kernel.internal.DatabaseHealth; @@ -85,7 +88,7 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext private final TransactionEventHandlers transactionEventHandlers; private final IndexingService.Monitor indexingServiceMonitor; private final FileSystemAbstraction fs; - private final TransactionMonitor transactionMonitor; + private final DatabaseTransactionStats transactionStats; private final DatabaseHealth databaseHealth; private final LogFileCreationMonitor physicalLogMonitor; private final TransactionHeaderInformationFactory transactionHeaderInformationFactory; @@ -114,6 +117,7 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext private final GraphDatabaseFacade facade; private final Iterable engineProviders; private final DatabaseLayout databaseLayout; + private final DatabaseAvailability databaseAvailability; ModularDatabaseCreationContext( String databaseName, PlatformModule platformModule, EditionModule editionModule, Procedures procedures, GraphDatabaseFacade facade ) @@ -135,7 +139,7 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext this.indexingServiceMonitor = monitors.newMonitor( IndexingService.Monitor.class ); this.physicalLogMonitor = monitors.newMonitor( LogFileCreationMonitor.class ); this.fs = platformModule.fileSystem; - this.transactionMonitor = editionModule.createTransactionMonitor(); + this.transactionStats = editionModule.createTransactionMonitor(); this.databaseHealth = new DatabaseHealth( platformModule.panicEventGenerator, logService.getInternalLog( DatabaseHealth.class ) ); this.transactionHeaderInformationFactory = editionModule.headerInformationFactory; this.commitProcessFactory = editionModule.commitProcessFactory; @@ -149,6 +153,8 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext this.ioLimiter = editionModule.ioLimiter; this.clock = platformModule.clock; this.databaseAvailabilityGuard = new DatabaseAvailabilityGuard( databaseName, clock, logService.getInternalLog( DatabaseAvailabilityGuard.class ) ); + this.databaseAvailability = + new DatabaseAvailability( databaseAvailabilityGuard, transactionStats, platformModule.clock, getAwaitActiveTransactionDeadlineMillis() ); this.coreAPIAvailabilityGuard = new CoreAPIAvailabilityGuard( databaseAvailabilityGuard, editionModule.transactionStartTimeout ); this.accessCapability = editionModule.accessCapability; this.storeCopyCheckPointMutex = new StoreCopyCheckPointMutex(); @@ -254,9 +260,9 @@ public FileSystemAbstraction getFs() } @Override - public TransactionMonitor getTransactionMonitor() + public TransactionMonitor getTransactionStats() { - return transactionMonitor; + return transactionStats; } @Override @@ -420,4 +426,15 @@ public Iterable getEngineProviders() { return engineProviders; } + + @Override + public DatabaseAvailability getDatabaseAvailability() + { + return databaseAvailability; + } + + private long getAwaitActiveTransactionDeadlineMillis() + { + return config.get( GraphDatabaseSettings.shutdown_transaction_end_timeout ).toMillis(); + } }