diff --git a/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java b/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java new file mode 100644 index 000000000000..553944db1b11 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/DatabaseCreationContext.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2002-2018 "Neo4j," + * Neo4j Sweden AB [http://neo4j.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 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel; + +import java.io.File; +import java.util.function.Function; + +import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; +import org.neo4j.internal.kernel.api.TokenNameLookup; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.IOLimiter; +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.configuration.Config; +import org.neo4j.kernel.extension.KernelExtensionFactory; +import org.neo4j.kernel.impl.api.CommitProcessFactory; +import org.neo4j.kernel.impl.api.ExplicitIndexProvider; +import org.neo4j.kernel.impl.api.SchemaWriteGuard; +import org.neo4j.kernel.impl.api.index.IndexingService; +import org.neo4j.kernel.impl.constraints.ConstraintSemantics; +import org.neo4j.kernel.impl.core.TokenHolders; +import org.neo4j.kernel.impl.factory.AccessCapability; +import org.neo4j.kernel.impl.factory.DatabaseInfo; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.kernel.impl.index.IndexConfigStore; +import org.neo4j.kernel.impl.locking.StatementLocksFactory; +import org.neo4j.kernel.impl.logging.LogService; +import org.neo4j.kernel.impl.proc.Procedures; +import org.neo4j.kernel.impl.query.QueryEngineProvider; +import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController; +import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; +import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; +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.util.collection.CollectionsFactorySupplier; +import org.neo4j.kernel.impl.util.watcher.FileSystemWatcherService; +import org.neo4j.kernel.internal.DatabaseHealth; +import org.neo4j.kernel.internal.TransactionEventHandlers; +import org.neo4j.kernel.monitoring.Monitors; +import org.neo4j.kernel.monitoring.tracing.Tracers; +import org.neo4j.scheduler.JobScheduler; +import org.neo4j.time.SystemNanoClock; + +public interface DatabaseCreationContext +{ + String getDatabaseName(); + + File getDatabaseDirectory(); + + Config getConfig(); + + IdGeneratorFactory getIdGeneratorFactory(); + + LogService getLogService(); + + JobScheduler getScheduler(); + + TokenNameLookup getTokenNameLookup(); + + DependencyResolver getGlobalDependencies(); + + TokenHolders getTokenHolders(); + + StatementLocksFactory getStatementLocksFactory(); + + SchemaWriteGuard getSchemaWriteGuard(); + + TransactionEventHandlers getTransactionEventHandlers(); + + IndexingService.Monitor getIndexingServiceMonitor(); + + FileSystemAbstraction getFs(); + + TransactionMonitor getTransactionMonitor(); + + DatabaseHealth getDatabaseHealth(); + + LogFileCreationMonitor getPhysicalLogMonitor(); + + TransactionHeaderInformationFactory getTransactionHeaderInformationFactory(); + + CommitProcessFactory getCommitProcessFactory(); + + AutoIndexing getAutoIndexing(); + + IndexConfigStore getIndexConfigStore(); + + ExplicitIndexProvider getExplicitIndexProvider(); + + PageCache getPageCache(); + + ConstraintSemantics getConstraintSemantics(); + + Monitors getMonitors(); + + Tracers getTracers(); + + Procedures getProcedures(); + + IOLimiter getIoLimiter(); + + AvailabilityGuard getAvailabilityGuard(); + + SystemNanoClock getClock(); + + AccessCapability getAccessCapability(); + + StoreCopyCheckPointMutex getStoreCopyCheckPointMutex(); + + RecoveryCleanupWorkCollector getRecoveryCleanupWorkCollector(); + + IdController getIdController(); + + DatabaseInfo getDatabaseInfo(); + + VersionContextSupplier getVersionContextSupplier(); + + CollectionsFactorySupplier getCollectionsFactorySupplier(); + + Iterable> getKernelExtensionFactories(); + + Function getWatcherServiceFactory(); + + GraphDatabaseFacade getFacade(); + + Iterable getEngineProviders(); +} 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 86d6154ef4e2..e8d8f19a9d17 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -279,67 +279,56 @@ boolean applicable( DiagnosticsPhase phase ) private final Iterable engineProviders; private final boolean failOnCorruptedLogFiles; - public NeoStoreDataSource( String databaseName, File databaseDirectory, Config config, IdGeneratorFactory idGeneratorFactory, LogService logService, - JobScheduler scheduler, TokenNameLookup tokenNameLookup, DependencyResolver dependencyResolver, TokenHolders tokenHolders, - StatementLocksFactory statementLocksFactory, SchemaWriteGuard schemaWriteGuard, TransactionEventHandlers transactionEventHandlers, - IndexingService.Monitor indexingServiceMonitor, FileSystemAbstraction fs, TransactionMonitor transactionMonitor, DatabaseHealth databaseHealth, - LogFileCreationMonitor physicalLogMonitor, TransactionHeaderInformationFactory transactionHeaderInformationFactory, - CommitProcessFactory commitProcessFactory, AutoIndexing autoIndexing, IndexConfigStore indexConfigStore, - ExplicitIndexProvider explicitIndexProvider, PageCache pageCache, ConstraintSemantics constraintSemantics, Monitors monitors, Tracers tracers, - Procedures procedures, IOLimiter ioLimiter, AvailabilityGuard availabilityGuard, SystemNanoClock clock, AccessCapability accessCapability, - StoreCopyCheckPointMutex storeCopyCheckPointMutex, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, IdController idController, - DatabaseInfo databaseInfo, VersionContextSupplier versionContextSupplier, CollectionsFactorySupplier collectionsFactorySupplier, - Iterable> kernelExtensionFactories, Function watcherServiceFactory, - GraphDatabaseFacade facade, Iterable engineProviders ) - { - this.databaseName = databaseName; - this.databaseDirectory = databaseDirectory; - this.config = config; - this.idGeneratorFactory = idGeneratorFactory; - this.tokenNameLookup = tokenNameLookup; - this.dependencyResolver = dependencyResolver; - this.scheduler = scheduler; - this.logService = logService; - this.autoIndexing = autoIndexing; - this.indexConfigStore = indexConfigStore; - this.explicitIndexProvider = explicitIndexProvider; - this.storeCopyCheckPointMutex = storeCopyCheckPointMutex; - this.logProvider = logService.getInternalLogProvider(); - this.tokenHolders = tokenHolders; - this.statementLocksFactory = statementLocksFactory; - this.schemaWriteGuard = schemaWriteGuard; - this.transactionEventHandlers = transactionEventHandlers; - this.indexingServiceMonitor = indexingServiceMonitor; - this.fs = fs; - this.transactionMonitor = transactionMonitor; - this.databaseHealth = databaseHealth; - this.physicalLogMonitor = physicalLogMonitor; - this.transactionHeaderInformationFactory = transactionHeaderInformationFactory; - this.constraintSemantics = constraintSemantics; - this.monitors = monitors; - this.tracers = tracers; - this.procedures = procedures; - this.ioLimiter = ioLimiter; - this.availabilityGuard = availabilityGuard; - this.clock = clock; - this.accessCapability = accessCapability; - this.recoveryCleanupWorkCollector = recoveryCleanupWorkCollector; - - readOnly = config.get( GraphDatabaseSettings.read_only ); - this.idController = idController; - this.databaseInfo = databaseInfo; - this.versionContextSupplier = versionContextSupplier; - this.kernelExtensionFactories = kernelExtensionFactories; - this.watcherServiceFactory = watcherServiceFactory; - this.facade = facade; - this.engineProviders = engineProviders; + public NeoStoreDataSource( DatabaseCreationContext context ) + { + this.databaseName = context.getDatabaseName(); + this.databaseDirectory = context.getDatabaseDirectory(); + this.config = context.getConfig(); + this.idGeneratorFactory = context.getIdGeneratorFactory(); + this.tokenNameLookup = context.getTokenNameLookup(); + this.dependencyResolver = context.getGlobalDependencies(); + this.scheduler = context.getScheduler(); + this.logService = context.getLogService(); + this.autoIndexing = context.getAutoIndexing(); + this.indexConfigStore = context.getIndexConfigStore(); + this.explicitIndexProvider = context.getExplicitIndexProvider(); + this.storeCopyCheckPointMutex = context.getStoreCopyCheckPointMutex(); + this.logProvider = context.getLogService().getInternalLogProvider(); + this.tokenHolders = context.getTokenHolders(); + this.statementLocksFactory = context.getStatementLocksFactory(); + this.schemaWriteGuard = context.getSchemaWriteGuard(); + this.transactionEventHandlers = context.getTransactionEventHandlers(); + this.indexingServiceMonitor = context.getIndexingServiceMonitor(); + this.fs = context.getFs(); + this.transactionMonitor = context.getTransactionMonitor(); + this.databaseHealth = context.getDatabaseHealth(); + this.physicalLogMonitor = context.getPhysicalLogMonitor(); + this.transactionHeaderInformationFactory = context.getTransactionHeaderInformationFactory(); + this.constraintSemantics = context.getConstraintSemantics(); + this.monitors = context.getMonitors(); + this.tracers = context.getTracers(); + this.procedures = context.getProcedures(); + this.ioLimiter = context.getIoLimiter(); + this.availabilityGuard = context.getAvailabilityGuard(); + this.clock = context.getClock(); + this.accessCapability = context.getAccessCapability(); + this.recoveryCleanupWorkCollector = context.getRecoveryCleanupWorkCollector(); + + readOnly = context.getConfig().get( GraphDatabaseSettings.read_only ); + this.idController = context.getIdController(); + this.databaseInfo = context.getDatabaseInfo(); + this.versionContextSupplier = context.getVersionContextSupplier(); + this.kernelExtensionFactories = context.getKernelExtensionFactories(); + this.watcherServiceFactory = context.getWatcherServiceFactory(); + this.facade = context.getFacade(); + this.engineProviders = context.getEngineProviders(); this.msgLog = logProvider.getLog( getClass() ); this.lockService = new ReentrantLockService(); - this.commitProcessFactory = commitProcessFactory; - this.pageCache = pageCache; + this.commitProcessFactory = context.getCommitProcessFactory(); + this.pageCache = context.getPageCache(); this.monitors.addMonitorListener( new LoggingLogFileMonitor( msgLog ) ); - this.collectionsFactorySupplier = collectionsFactorySupplier; - this.failOnCorruptedLogFiles = config.get( GraphDatabaseSettings.fail_on_corrupted_log_files ); + this.collectionsFactorySupplier = context.getCollectionsFactorySupplier(); + this.failOnCorruptedLogFiles = context.getConfig().get( GraphDatabaseSettings.fail_on_corrupted_log_files ); } // We do our own internal life management: @@ -872,4 +861,14 @@ public LifeSupport getLife() { return life; } + + public AutoIndexing getAutoIndexing() + { + return autoIndexing; + } + + public TransactionEventHandlers getTransactionEventHandlers() + { + return transactionEventHandlers; + } } 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 eb44325376f4..d4011b24d7a3 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 @@ -31,17 +31,25 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.io.pagecache.PageCache; +import org.neo4j.io.pagecache.tracing.cursor.context.VersionContextSupplier; import org.neo4j.kernel.AvailabilityGuard; +import org.neo4j.kernel.DatabaseCreationContext; import org.neo4j.kernel.NeoStoreDataSource; +import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.extension.KernelExtensionFactory; +import org.neo4j.kernel.impl.api.CommitProcessFactory; import org.neo4j.kernel.impl.api.ExplicitIndexProvider; import org.neo4j.kernel.impl.api.SchemaWriteGuard; import org.neo4j.kernel.impl.api.explicitindex.InternalAutoIndexing; import org.neo4j.kernel.impl.api.index.IndexingService; +import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics; import org.neo4j.kernel.impl.context.TransactionVersionContextSupplier; import org.neo4j.kernel.impl.core.DatabasePanicEventGenerator; +import org.neo4j.kernel.impl.core.TokenHolders; +import org.neo4j.kernel.impl.factory.AccessCapability; import org.neo4j.kernel.impl.factory.CanWrite; import org.neo4j.kernel.impl.factory.CommunityCommitProcessFactory; import org.neo4j.kernel.impl.factory.DatabaseInfo; @@ -53,7 +61,9 @@ import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.SimpleLogService; import org.neo4j.kernel.impl.proc.Procedures; +import org.neo4j.kernel.impl.query.QueryEngineProvider; import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.BufferedIdController; +import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController; import org.neo4j.kernel.impl.store.id.BufferingIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory; import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; @@ -67,6 +77,8 @@ import org.neo4j.kernel.impl.transaction.log.files.LogFileCreationMonitor; import org.neo4j.kernel.impl.util.Dependencies; import org.neo4j.kernel.impl.util.UnsatisfiedDependencyException; +import org.neo4j.kernel.impl.util.collection.CollectionsFactorySupplier; +import org.neo4j.kernel.impl.util.watcher.FileSystemWatcherService; import org.neo4j.kernel.info.DiagnosticsManager; import org.neo4j.kernel.internal.DatabaseHealth; import org.neo4j.kernel.internal.TransactionEventHandlers; @@ -130,25 +142,18 @@ public NeoStoreDataSource getDataSource( File storeDir, FileSystemAbstraction fs deps -> new DiagnosticsManager( NullLog.getInstance() ) ); dependency( mutableDependencies, IndexProvider.class, deps -> IndexProvider.EMPTY ); - dataSource = new NeoStoreDataSource( DatabaseManager.DEFAULT_DATABASE_NAME, storeDir, config, idGeneratorFactory, - logService, mock( JobScheduler.class, RETURNS_MOCKS ), mock( TokenNameLookup.class ), - mutableDependencies, - mockedTokenHolders(), locksFactory, - mock( SchemaWriteGuard.class ), mock( TransactionEventHandlers.class ), IndexingService.NO_MONITOR, - fs, transactionMonitor, databaseHealth, - mock( LogFileCreationMonitor.class ), TransactionHeaderInformationFactory.DEFAULT, new CommunityCommitProcessFactory(), - mock( InternalAutoIndexing.class ), mock( IndexConfigStore.class ), mock( ExplicitIndexProvider.class ), pageCache, - new StandardConstraintSemantics(), monitors, - new Tracers( "null", NullLog.getInstance(), monitors, jobScheduler, clock ), - mock( Procedures.class ), - IOLimiter.UNLIMITED, - availabilityGuard, clock, - new CanWrite(), new StoreCopyCheckPointMutex(), - RecoveryCleanupWorkCollector.IMMEDIATE, - new BufferedIdController( - new BufferingIdGeneratorFactory( idGeneratorFactory, IdReuseEligibility.ALWAYS, idConfigurationProvider ), jobScheduler ), - DatabaseInfo.COMMUNITY, new TransactionVersionContextSupplier(), ON_HEAP, Collections.emptyList(), file -> EMPTY_WATCHER, - new GraphDatabaseFacade(), Iterables.empty() ); + dataSource = new NeoStoreDataSource( + new TestDatabaseCreationContext( DatabaseManager.DEFAULT_DATABASE_NAME, storeDir, config, idGeneratorFactory, logService, + mock( JobScheduler.class, RETURNS_MOCKS ), mock( TokenNameLookup.class ), mutableDependencies, mockedTokenHolders(), locksFactory, + mock( SchemaWriteGuard.class ), mock( TransactionEventHandlers.class ), IndexingService.NO_MONITOR, fs, transactionMonitor, + databaseHealth, mock( LogFileCreationMonitor.class ), TransactionHeaderInformationFactory.DEFAULT, new CommunityCommitProcessFactory(), + mock( InternalAutoIndexing.class ), mock( IndexConfigStore.class ), mock( ExplicitIndexProvider.class ), pageCache, + new StandardConstraintSemantics(), monitors, new Tracers( "null", NullLog.getInstance(), monitors, jobScheduler, clock ), + mock( Procedures.class ), IOLimiter.UNLIMITED, availabilityGuard, clock, new CanWrite(), new StoreCopyCheckPointMutex(), + RecoveryCleanupWorkCollector.IMMEDIATE, + new BufferedIdController( new BufferingIdGeneratorFactory( idGeneratorFactory, IdReuseEligibility.ALWAYS, idConfigurationProvider ), + jobScheduler ), DatabaseInfo.COMMUNITY, new TransactionVersionContextSupplier(), ON_HEAP, Collections.emptyList(), + file -> EMPTY_WATCHER, new GraphDatabaseFacade(), Iterables.empty() ) ); return dataSource; } @@ -177,4 +182,318 @@ protected void after( boolean successful ) { shutdownAnyRunning(); } + + private static class TestDatabaseCreationContext implements DatabaseCreationContext + { + private final String databaseName; + private final File databaseDirectory; + private final Config config; + private final IdGeneratorFactory idGeneratorFactory; + private final LogService logService; + private final JobScheduler scheduler; + private final TokenNameLookup tokenNameLookup; + private final DependencyResolver dependencyResolver; + private final TokenHolders tokenHolders; + private final StatementLocksFactory statementLocksFactory; + private final SchemaWriteGuard schemaWriteGuard; + private final TransactionEventHandlers transactionEventHandlers; + private final IndexingService.Monitor indexingServiceMonitor; + private final FileSystemAbstraction fs; + private final TransactionMonitor transactionMonitor; + private final DatabaseHealth databaseHealth; + private final LogFileCreationMonitor physicalLogMonitor; + private final TransactionHeaderInformationFactory transactionHeaderInformationFactory; + private final CommitProcessFactory commitProcessFactory; + private final AutoIndexing autoIndexing; + private final IndexConfigStore indexConfigStore; + private final ExplicitIndexProvider explicitIndexProvider; + private final PageCache pageCache; + private final ConstraintSemantics constraintSemantics; + private final Monitors monitors; + private final Tracers tracers; + private final Procedures procedures; + private final IOLimiter ioLimiter; + private final AvailabilityGuard availabilityGuard; + private final SystemNanoClock clock; + private final AccessCapability accessCapability; + private final StoreCopyCheckPointMutex storeCopyCheckPointMutex; + private final RecoveryCleanupWorkCollector recoveryCleanupWorkCollector; + private final IdController idController; + private final DatabaseInfo databaseInfo; + private final VersionContextSupplier versionContextSupplier; + private final CollectionsFactorySupplier collectionsFactorySupplier; + private final Iterable> kernelExtensionFactories; + private final Function watcherServiceFactory; + private final GraphDatabaseFacade facade; + private final Iterable engineProviders; + + TestDatabaseCreationContext( String databaseName, File databaseDirectory, Config config, IdGeneratorFactory idGeneratorFactory, LogService logService, + JobScheduler scheduler, TokenNameLookup tokenNameLookup, DependencyResolver dependencyResolver, TokenHolders tokenHolders, + StatementLocksFactory statementLocksFactory, SchemaWriteGuard schemaWriteGuard, TransactionEventHandlers transactionEventHandlers, + IndexingService.Monitor indexingServiceMonitor, FileSystemAbstraction fs, TransactionMonitor transactionMonitor, DatabaseHealth databaseHealth, + LogFileCreationMonitor physicalLogMonitor, TransactionHeaderInformationFactory transactionHeaderInformationFactory, + CommitProcessFactory commitProcessFactory, AutoIndexing autoIndexing, IndexConfigStore indexConfigStore, + ExplicitIndexProvider explicitIndexProvider, PageCache pageCache, ConstraintSemantics constraintSemantics, Monitors monitors, Tracers tracers, + Procedures procedures, IOLimiter ioLimiter, AvailabilityGuard availabilityGuard, SystemNanoClock clock, AccessCapability accessCapability, + StoreCopyCheckPointMutex storeCopyCheckPointMutex, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, IdController idController, + DatabaseInfo databaseInfo, VersionContextSupplier versionContextSupplier, CollectionsFactorySupplier collectionsFactorySupplier, + Iterable> kernelExtensionFactories, Function watcherServiceFactory, + GraphDatabaseFacade facade, Iterable engineProviders ) + { + this.databaseName = databaseName; + this.databaseDirectory = databaseDirectory; + this.config = config; + this.idGeneratorFactory = idGeneratorFactory; + this.logService = logService; + this.scheduler = scheduler; + this.tokenNameLookup = tokenNameLookup; + this.dependencyResolver = dependencyResolver; + this.tokenHolders = tokenHolders; + this.statementLocksFactory = statementLocksFactory; + this.schemaWriteGuard = schemaWriteGuard; + this.transactionEventHandlers = transactionEventHandlers; + this.indexingServiceMonitor = indexingServiceMonitor; + this.fs = fs; + this.transactionMonitor = transactionMonitor; + this.databaseHealth = databaseHealth; + this.physicalLogMonitor = physicalLogMonitor; + this.transactionHeaderInformationFactory = transactionHeaderInformationFactory; + this.commitProcessFactory = commitProcessFactory; + this.autoIndexing = autoIndexing; + this.indexConfigStore = indexConfigStore; + this.explicitIndexProvider = explicitIndexProvider; + this.pageCache = pageCache; + this.constraintSemantics = constraintSemantics; + this.monitors = monitors; + this.tracers = tracers; + this.procedures = procedures; + this.ioLimiter = ioLimiter; + this.availabilityGuard = availabilityGuard; + this.clock = clock; + this.accessCapability = accessCapability; + this.storeCopyCheckPointMutex = storeCopyCheckPointMutex; + this.recoveryCleanupWorkCollector = recoveryCleanupWorkCollector; + this.idController = idController; + this.databaseInfo = databaseInfo; + this.versionContextSupplier = versionContextSupplier; + this.collectionsFactorySupplier = collectionsFactorySupplier; + this.kernelExtensionFactories = kernelExtensionFactories; + this.watcherServiceFactory = watcherServiceFactory; + this.facade = facade; + this.engineProviders = engineProviders; + } + + @Override + public String getDatabaseName() + { + return databaseName; + } + + public File getDatabaseDirectory() + { + return databaseDirectory; + } + + public Config getConfig() + { + return config; + } + + public IdGeneratorFactory getIdGeneratorFactory() + { + return idGeneratorFactory; + } + + public LogService getLogService() + { + return logService; + } + + public JobScheduler getScheduler() + { + return scheduler; + } + + public TokenNameLookup getTokenNameLookup() + { + return tokenNameLookup; + } + + @Override + public DependencyResolver getGlobalDependencies() + { + return dependencyResolver; + } + + public DependencyResolver getDependencyResolver() + { + return dependencyResolver; + } + + public TokenHolders getTokenHolders() + { + return tokenHolders; + } + + public StatementLocksFactory getStatementLocksFactory() + { + return statementLocksFactory; + } + + public SchemaWriteGuard getSchemaWriteGuard() + { + return schemaWriteGuard; + } + + public TransactionEventHandlers getTransactionEventHandlers() + { + return transactionEventHandlers; + } + + public IndexingService.Monitor getIndexingServiceMonitor() + { + return indexingServiceMonitor; + } + + public FileSystemAbstraction getFs() + { + return fs; + } + + public TransactionMonitor getTransactionMonitor() + { + return transactionMonitor; + } + + public DatabaseHealth getDatabaseHealth() + { + return databaseHealth; + } + + public LogFileCreationMonitor getPhysicalLogMonitor() + { + return physicalLogMonitor; + } + + public TransactionHeaderInformationFactory getTransactionHeaderInformationFactory() + { + return transactionHeaderInformationFactory; + } + + public CommitProcessFactory getCommitProcessFactory() + { + return commitProcessFactory; + } + + public AutoIndexing getAutoIndexing() + { + return autoIndexing; + } + + public IndexConfigStore getIndexConfigStore() + { + return indexConfigStore; + } + + public ExplicitIndexProvider getExplicitIndexProvider() + { + return explicitIndexProvider; + } + + public PageCache getPageCache() + { + return pageCache; + } + + public ConstraintSemantics getConstraintSemantics() + { + return constraintSemantics; + } + + public Monitors getMonitors() + { + return monitors; + } + + public Tracers getTracers() + { + return tracers; + } + + public Procedures getProcedures() + { + return procedures; + } + + public IOLimiter getIoLimiter() + { + return ioLimiter; + } + + public AvailabilityGuard getAvailabilityGuard() + { + return availabilityGuard; + } + + public SystemNanoClock getClock() + { + return clock; + } + + public AccessCapability getAccessCapability() + { + return accessCapability; + } + + public StoreCopyCheckPointMutex getStoreCopyCheckPointMutex() + { + return storeCopyCheckPointMutex; + } + + public RecoveryCleanupWorkCollector getRecoveryCleanupWorkCollector() + { + return recoveryCleanupWorkCollector; + } + + public IdController getIdController() + { + return idController; + } + + public DatabaseInfo getDatabaseInfo() + { + return databaseInfo; + } + + public VersionContextSupplier getVersionContextSupplier() + { + return versionContextSupplier; + } + + public CollectionsFactorySupplier getCollectionsFactorySupplier() + { + return collectionsFactorySupplier; + } + + public Iterable> getKernelExtensionFactories() + { + return kernelExtensionFactories; + } + + public Function getWatcherServiceFactory() + { + return watcherServiceFactory; + } + + public GraphDatabaseFacade getFacade() + { + return facade; + } + + public Iterable getEngineProviders() + { + return engineProviders; + } + } + } diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ClassicCoreSPI.java b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ClassicCoreSPI.java index 9204b55b5329..87dd7d625a0e 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ClassicCoreSPI.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ClassicCoreSPI.java @@ -89,7 +89,7 @@ public Result executeQuery( String query, MapValue parameters, TransactionalCont @Override public AutoIndexing autoIndexing() { - return dataSource.autoIndexing; + return dataSource.neoStoreDataSource.getAutoIndexing(); } @Override @@ -113,13 +113,13 @@ public void unregisterKernelEventHandler( KernelEventHandler handler ) @Override public void registerTransactionEventHandler( TransactionEventHandler handler ) { - dataSource.transactionEventHandlers.registerTransactionEventHandler( handler ); + dataSource.neoStoreDataSource.getTransactionEventHandlers().registerTransactionEventHandler( handler ); } @Override public void unregisterTransactionEventHandler( TransactionEventHandler handler ) { - dataSource.transactionEventHandlers.unregisterTransactionEventHandler( handler ); + dataSource.neoStoreDataSource.getTransactionEventHandlers().unregisterTransactionEventHandler( handler ); } @Override diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ProcedureGDBFacadeSPI.java b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ProcedureGDBFacadeSPI.java index 43156276a733..213a8cf0a5a9 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ProcedureGDBFacadeSPI.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/facade/spi/ProcedureGDBFacadeSPI.java @@ -114,7 +114,7 @@ public Result executeQuery( String query, MapValue parameters, TransactionalCont @Override public AutoIndexing autoIndexing() { - return sourceModule.autoIndexing; + return sourceModule.neoStoreDataSource.getAutoIndexing(); } @Override diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/DataSourceModule.java b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/DataSourceModule.java index 4aa5910de299..54a52fb84875 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/DataSourceModule.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/DataSourceModule.java @@ -23,125 +23,34 @@ import java.util.function.Supplier; import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory; -import org.neo4j.io.fs.FileSystemAbstraction; -import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.api.InwardKernel; -import org.neo4j.kernel.api.explicitindex.AutoIndexing; -import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.api.DefaultExplicitIndexProvider; -import org.neo4j.kernel.impl.api.NonTransactionalTokenNameLookup; -import org.neo4j.kernel.impl.api.explicitindex.InternalAutoIndexing; -import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.core.TokenHolders; import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; -import org.neo4j.kernel.impl.index.IndexConfigStore; -import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.store.StoreId; -import org.neo4j.kernel.impl.transaction.log.checkpoint.StoreCopyCheckPointMutex; -import org.neo4j.kernel.impl.transaction.log.files.LogFileCreationMonitor; import org.neo4j.kernel.impl.transaction.state.DataSourceManager; -import org.neo4j.kernel.info.DiagnosticsManager; -import org.neo4j.kernel.internal.DatabaseHealth; -import org.neo4j.kernel.internal.TransactionEventHandlers; -import org.neo4j.kernel.monitoring.Monitors; -/** - * Datasource module for {@link GraphDatabaseFacadeFactory}. This implements all the - * remaining services not yet created by either the {@link PlatformModule} or {@link EditionModule}. - *

- * When creating new services, this would be the default place to put them, unless they need to go into the other - * modules for any reason. - */ public class DataSourceModule { public final NeoStoreDataSource neoStoreDataSource; public final Supplier kernelAPI; - public final StoreCopyCheckPointMutex storeCopyCheckPointMutex; - - public final TransactionEventHandlers transactionEventHandlers; - public final Supplier storeId; - public final AutoIndexing autoIndexing; - public final TokenHolders tokenHolders; public DataSourceModule( String databaseName, final PlatformModule platformModule, EditionModule editionModule, Procedures procedures, GraphDatabaseFacade graphDatabaseFacade ) { - Config config = platformModule.config; - LogService logging = platformModule.logging; - FileSystemAbstraction fileSystem = platformModule.fileSystem; - DataSourceManager dataSourceManager = platformModule.dataSourceManager; - tokenHolders = editionModule.tokenHoldersSupplier.get(); - File databaseDirectory = new File( platformModule.storeDir, databaseName ); - DiagnosticsManager diagnosticsManager = platformModule.diagnosticsManager; - Monitors monitors = new Monitors( platformModule.monitors ); - - transactionEventHandlers = new TransactionEventHandlers( graphDatabaseFacade ); - - diagnosticsManager.prependProvider( config ); - - PageCache pageCache = platformModule.pageCache; - - autoIndexing = new InternalAutoIndexing( platformModule.config, tokenHolders.propertyKeyTokens() ); - - DatabaseHealth databaseHealth = new DatabaseHealth( platformModule.panicEventGenerator, logging.getInternalLog( DatabaseHealth.class ) ); - IndexConfigStore indexConfigStore = new IndexConfigStore( databaseDirectory, fileSystem ); - DefaultExplicitIndexProvider explicitIndexProvider = new DefaultExplicitIndexProvider(); - NonTransactionalTokenNameLookup tokenNameLookup = new NonTransactionalTokenNameLookup( tokenHolders ); - storeCopyCheckPointMutex = new StoreCopyCheckPointMutex(); + platformModule.diagnosticsManager.prependProvider( platformModule.config ); neoStoreDataSource = new NeoStoreDataSource( - databaseName, - databaseDirectory, - config, - editionModule.idGeneratorFactory, - logging, - platformModule.jobScheduler, - tokenNameLookup, - platformModule.dependencies, - tokenHolders, - editionModule.statementLocksFactory, - editionModule.schemaWriteGuard, - transactionEventHandlers, - monitors.newMonitor( IndexingService.Monitor.class ), - fileSystem, - platformModule.transactionMonitor, - databaseHealth, - monitors.newMonitor( LogFileCreationMonitor.class ), - editionModule.headerInformationFactory, - editionModule.commitProcessFactory, - autoIndexing, - indexConfigStore, - explicitIndexProvider, - pageCache, - editionModule.constraintSemantics, - monitors, - platformModule.tracers, - procedures, - editionModule.ioLimiter, - platformModule.availabilityGuard, - platformModule.clock, - editionModule.accessCapability, - storeCopyCheckPointMutex, - platformModule.recoveryCleanupWorkCollector, - editionModule.idController, - platformModule.databaseInfo, - platformModule.versionContextSupplier, - platformModule.collectionsFactorySupplier, - platformModule.kernelExtensionFactories, - editionModule.watcherServiceFactory, - graphDatabaseFacade, - platformModule.engineProviders ); + new ModularDatabaseCreationContext( databaseName, databaseDirectory, platformModule, editionModule, procedures, graphDatabaseFacade, tokenHolders ) ); this.storeId = neoStoreDataSource::getStoreId; this.kernelAPI = neoStoreDataSource::getKernel; 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 new file mode 100644 index 000000000000..da546a6bb685 --- /dev/null +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/ModularDatabaseCreationContext.java @@ -0,0 +1,363 @@ +/* + * Copyright (c) 2002-2018 "Neo4j," + * Neo4j Sweden AB [http://neo4j.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 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.graphdb.factory.module; + +import java.io.File; +import java.util.function.Function; + +import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; +import org.neo4j.internal.kernel.api.TokenNameLookup; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.IOLimiter; +import org.neo4j.io.pagecache.PageCache; +import org.neo4j.io.pagecache.tracing.cursor.context.VersionContextSupplier; +import org.neo4j.kernel.AvailabilityGuard; +import org.neo4j.kernel.DatabaseCreationContext; +import org.neo4j.kernel.api.explicitindex.AutoIndexing; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.extension.KernelExtensionFactory; +import org.neo4j.kernel.impl.api.CommitProcessFactory; +import org.neo4j.kernel.impl.api.DefaultExplicitIndexProvider; +import org.neo4j.kernel.impl.api.ExplicitIndexProvider; +import org.neo4j.kernel.impl.api.NonTransactionalTokenNameLookup; +import org.neo4j.kernel.impl.api.SchemaWriteGuard; +import org.neo4j.kernel.impl.api.explicitindex.InternalAutoIndexing; +import org.neo4j.kernel.impl.api.index.IndexingService; +import org.neo4j.kernel.impl.constraints.ConstraintSemantics; +import org.neo4j.kernel.impl.core.TokenHolders; +import org.neo4j.kernel.impl.factory.AccessCapability; +import org.neo4j.kernel.impl.factory.DatabaseInfo; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.kernel.impl.index.IndexConfigStore; +import org.neo4j.kernel.impl.locking.StatementLocksFactory; +import org.neo4j.kernel.impl.logging.LogService; +import org.neo4j.kernel.impl.proc.Procedures; +import org.neo4j.kernel.impl.query.QueryEngineProvider; +import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController; +import org.neo4j.kernel.impl.store.id.IdGeneratorFactory; +import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; +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.util.collection.CollectionsFactorySupplier; +import org.neo4j.kernel.impl.util.watcher.FileSystemWatcherService; +import org.neo4j.kernel.internal.DatabaseHealth; +import org.neo4j.kernel.internal.TransactionEventHandlers; +import org.neo4j.kernel.monitoring.Monitors; +import org.neo4j.kernel.monitoring.tracing.Tracers; +import org.neo4j.scheduler.JobScheduler; +import org.neo4j.time.SystemNanoClock; + +public class ModularDatabaseCreationContext implements DatabaseCreationContext +{ + private final String databaseName; + private final File databaseDirectory; + private final Config config; + private final IdGeneratorFactory idGeneratorFactory; + private final LogService logService; + private final JobScheduler scheduler; + private final TokenNameLookup tokenNameLookup; + private final DependencyResolver globalDependencies; + private final TokenHolders tokenHolders; + private final StatementLocksFactory statementLocksFactory; + private final SchemaWriteGuard schemaWriteGuard; + private final TransactionEventHandlers transactionEventHandlers; + private final IndexingService.Monitor indexingServiceMonitor; + private final FileSystemAbstraction fs; + private final TransactionMonitor transactionMonitor; + private final DatabaseHealth databaseHealth; + private final LogFileCreationMonitor physicalLogMonitor; + private final TransactionHeaderInformationFactory transactionHeaderInformationFactory; + private final CommitProcessFactory commitProcessFactory; + private final AutoIndexing autoIndexing; + private final IndexConfigStore indexConfigStore; + private final ExplicitIndexProvider explicitIndexProvider; + private final PageCache pageCache; + private final ConstraintSemantics constraintSemantics; + private final Monitors monitors; + private final Tracers tracers; + private final Procedures procedures; + private final IOLimiter ioLimiter; + private final AvailabilityGuard availabilityGuard; + private final SystemNanoClock clock; + private final AccessCapability accessCapability; + private final StoreCopyCheckPointMutex storeCopyCheckPointMutex; + private final RecoveryCleanupWorkCollector recoveryCleanupWorkCollector; + private final IdController idController; + private final DatabaseInfo databaseInfo; + private final VersionContextSupplier versionContextSupplier; + private final CollectionsFactorySupplier collectionsFactorySupplier; + private final Iterable> kernelExtensionFactories; + private final Function watcherServiceFactory; + private final GraphDatabaseFacade facade; + private final Iterable engineProviders; + + ModularDatabaseCreationContext( String databaseName, File databaseDirectory, PlatformModule platformModule, EditionModule editionModule, + Procedures procedures, GraphDatabaseFacade facade, TokenHolders tokenHolders ) + { + this.databaseName = databaseName; + this.databaseDirectory = databaseDirectory; + this.config = platformModule.config; + this.idGeneratorFactory = editionModule.idGeneratorFactory; + this.logService = platformModule.logging; + this.scheduler = platformModule.jobScheduler; + this.globalDependencies = platformModule.dependencies; + this.tokenHolders = tokenHolders; + this.tokenNameLookup = new NonTransactionalTokenNameLookup( tokenHolders ); + this.statementLocksFactory = editionModule.statementLocksFactory; + this.schemaWriteGuard = editionModule.schemaWriteGuard; + this.transactionEventHandlers = new TransactionEventHandlers( facade ); + this.monitors = new Monitors( platformModule.monitors ); + this.indexingServiceMonitor = monitors.newMonitor( IndexingService.Monitor.class ); + this.physicalLogMonitor = monitors.newMonitor( LogFileCreationMonitor.class ); + this.fs = platformModule.fileSystem; + this.transactionMonitor = platformModule.transactionMonitor; + this.databaseHealth = new DatabaseHealth( platformModule.panicEventGenerator, logService.getInternalLog( DatabaseHealth.class ) ); + this.transactionHeaderInformationFactory = editionModule.headerInformationFactory; + this.commitProcessFactory = editionModule.commitProcessFactory; + this.autoIndexing = new InternalAutoIndexing( platformModule.config, tokenHolders.propertyKeyTokens() ); + this.indexConfigStore = new IndexConfigStore( databaseDirectory, fs ); + this.explicitIndexProvider = new DefaultExplicitIndexProvider(); + this.pageCache = platformModule.pageCache; + this.constraintSemantics = editionModule.constraintSemantics; + this.tracers = platformModule.tracers; + this.procedures = procedures; + this.ioLimiter = editionModule.ioLimiter; + this.availabilityGuard = platformModule.availabilityGuard; + this.clock = platformModule.clock; + this.accessCapability = editionModule.accessCapability; + this.storeCopyCheckPointMutex = new StoreCopyCheckPointMutex(); + this.recoveryCleanupWorkCollector = platformModule.recoveryCleanupWorkCollector; + this.idController = editionModule.idController; + this.databaseInfo = platformModule.databaseInfo; + this.versionContextSupplier = platformModule.versionContextSupplier; + this.collectionsFactorySupplier = platformModule.collectionsFactorySupplier; + this.kernelExtensionFactories = platformModule.kernelExtensionFactories; + this.watcherServiceFactory = editionModule.watcherServiceFactory; + this.facade = facade; + this.engineProviders = platformModule.engineProviders; + } + + public String getDatabaseName() + { + return databaseName; + } + + public File getDatabaseDirectory() + { + return databaseDirectory; + } + + public Config getConfig() + { + return config; + } + + public IdGeneratorFactory getIdGeneratorFactory() + { + return idGeneratorFactory; + } + + public LogService getLogService() + { + return logService; + } + + public JobScheduler getScheduler() + { + return scheduler; + } + + public TokenNameLookup getTokenNameLookup() + { + return tokenNameLookup; + } + + public DependencyResolver getGlobalDependencies() + { + return globalDependencies; + } + + public TokenHolders getTokenHolders() + { + return tokenHolders; + } + + public StatementLocksFactory getStatementLocksFactory() + { + return statementLocksFactory; + } + + public SchemaWriteGuard getSchemaWriteGuard() + { + return schemaWriteGuard; + } + + public TransactionEventHandlers getTransactionEventHandlers() + { + return transactionEventHandlers; + } + + public IndexingService.Monitor getIndexingServiceMonitor() + { + return indexingServiceMonitor; + } + + public FileSystemAbstraction getFs() + { + return fs; + } + + public TransactionMonitor getTransactionMonitor() + { + return transactionMonitor; + } + + public DatabaseHealth getDatabaseHealth() + { + return databaseHealth; + } + + public LogFileCreationMonitor getPhysicalLogMonitor() + { + return physicalLogMonitor; + } + + public TransactionHeaderInformationFactory getTransactionHeaderInformationFactory() + { + return transactionHeaderInformationFactory; + } + + public CommitProcessFactory getCommitProcessFactory() + { + return commitProcessFactory; + } + + public AutoIndexing getAutoIndexing() + { + return autoIndexing; + } + + public IndexConfigStore getIndexConfigStore() + { + return indexConfigStore; + } + + public ExplicitIndexProvider getExplicitIndexProvider() + { + return explicitIndexProvider; + } + + public PageCache getPageCache() + { + return pageCache; + } + + public ConstraintSemantics getConstraintSemantics() + { + return constraintSemantics; + } + + public Monitors getMonitors() + { + return monitors; + } + + public Tracers getTracers() + { + return tracers; + } + + public Procedures getProcedures() + { + return procedures; + } + + public IOLimiter getIoLimiter() + { + return ioLimiter; + } + + public AvailabilityGuard getAvailabilityGuard() + { + return availabilityGuard; + } + + public SystemNanoClock getClock() + { + return clock; + } + + public AccessCapability getAccessCapability() + { + return accessCapability; + } + + public StoreCopyCheckPointMutex getStoreCopyCheckPointMutex() + { + return storeCopyCheckPointMutex; + } + + public RecoveryCleanupWorkCollector getRecoveryCleanupWorkCollector() + { + return recoveryCleanupWorkCollector; + } + + public IdController getIdController() + { + return idController; + } + + public DatabaseInfo getDatabaseInfo() + { + return databaseInfo; + } + + public VersionContextSupplier getVersionContextSupplier() + { + return versionContextSupplier; + } + + public CollectionsFactorySupplier getCollectionsFactorySupplier() + { + return collectionsFactorySupplier; + } + + public Iterable> getKernelExtensionFactories() + { + return kernelExtensionFactories; + } + + public Function getWatcherServiceFactory() + { + return watcherServiceFactory; + } + + public GraphDatabaseFacade getFacade() + { + return facade; + } + + public Iterable getEngineProviders() + { + return engineProviders; + } +}