Skip to content

Commit

Permalink
Extract id components into separate module that constructed using bui…
Browse files Browse the repository at this point in the history
…lder.

Remove methods from edition modules that other modules were suppose to override
since those were creating tons of confusion and interdependencies.
  • Loading branch information
MishaDemianenko committed Aug 30, 2018
1 parent a682d0f commit 3f9b55f
Show file tree
Hide file tree
Showing 12 changed files with 320 additions and 144 deletions.
Expand Up @@ -39,18 +39,17 @@
import org.neo4j.graphdb.factory.module.CommunityEditionModule; import org.neo4j.graphdb.factory.module.CommunityEditionModule;
import org.neo4j.graphdb.factory.module.EditionModule; import org.neo4j.graphdb.factory.module.EditionModule;
import org.neo4j.graphdb.factory.module.PlatformModule; import org.neo4j.graphdb.factory.module.PlatformModule;
import org.neo4j.graphdb.factory.module.id.IdModuleBuilder;
import org.neo4j.helpers.collection.Iterables; import org.neo4j.helpers.collection.Iterables;
import org.neo4j.internal.kernel.api.LabelSet; import org.neo4j.internal.kernel.api.LabelSet;
import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.internal.kernel.api.PropertyCursor; import org.neo4j.internal.kernel.api.PropertyCursor;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge; import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.factory.DatabaseInfo; import org.neo4j.kernel.impl.factory.DatabaseInfo;
import org.neo4j.kernel.impl.store.UnderlyingStorageException; import org.neo4j.kernel.impl.store.UnderlyingStorageException;
import org.neo4j.kernel.impl.store.id.IdGenerator; import org.neo4j.kernel.impl.store.id.IdGenerator;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType; import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.id.configuration.CommunityIdTypeConfigurationProvider; import org.neo4j.kernel.impl.store.id.configuration.CommunityIdTypeConfigurationProvider;
import org.neo4j.kernel.impl.store.id.configuration.IdTypeConfiguration; import org.neo4j.kernel.impl.store.id.configuration.IdTypeConfiguration;
Expand Down Expand Up @@ -751,15 +750,7 @@ protected void create(
GraphDatabaseFacadeFactory.Dependencies dependencies ) GraphDatabaseFacadeFactory.Dependencies dependencies )
{ {
Function<PlatformModule,EditionModule> factory = Function<PlatformModule,EditionModule> factory =
platformModule -> new CommunityEditionModule( platformModule ) platformModule -> new CommunityEditionModuleWithCustomIdModule( platformModule, idFactory );
{
@Override
protected Function<String,IdGeneratorFactory> createIdGeneratorFactory( FileSystemAbstraction fs,
IdTypeConfigurationProvider idTypeConfigurationProvider )
{
return any -> idFactory;
}
};
new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, factory ) new GraphDatabaseFacadeFactory( DatabaseInfo.COMMUNITY, factory )
{ {


Expand Down Expand Up @@ -788,4 +779,15 @@ private Node createNode( GraphDatabaseService db, Label... labels )
return node; return node;
} }
} }

private static class CommunityEditionModuleWithCustomIdModule extends CommunityEditionModule
{
CommunityEditionModuleWithCustomIdModule( PlatformModule platformModule, EphemeralIdGenerator.Factory idFactory )
{
super( platformModule );
idModule = IdModuleBuilder.of( platformModule.fileSystem, platformModule.jobScheduler )
.withIdGenerationFactoryProvider( any -> idFactory )
.build();
}
}
} }
Expand Up @@ -20,11 +20,12 @@
package org.neo4j.graphdb.factory.module; package org.neo4j.graphdb.factory.module;


import java.io.File; import java.io.File;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;


import org.neo4j.function.Predicates; import org.neo4j.function.Predicates;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.factory.module.id.IdModule;
import org.neo4j.graphdb.factory.module.id.IdModuleBuilder;
import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.io.pagecache.IOLimiter;
Expand Down Expand Up @@ -56,11 +57,6 @@
import org.neo4j.kernel.impl.locking.StatementLocksFactory; import org.neo4j.kernel.impl.locking.StatementLocksFactory;
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.proc.Procedures;
import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdReuseEligibility;
import org.neo4j.kernel.impl.store.id.configuration.CommunityIdTypeConfigurationProvider;
import org.neo4j.kernel.impl.store.id.configuration.IdTypeConfigurationProvider;
import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory; import org.neo4j.kernel.impl.transaction.TransactionHeaderInformationFactory;
import org.neo4j.kernel.impl.transaction.log.files.TransactionLogFiles; import org.neo4j.kernel.impl.transaction.log.files.TransactionLogFiles;
import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.kernel.impl.transaction.state.DataSourceManager;
Expand Down Expand Up @@ -102,14 +98,11 @@ public CommunityEditionModule( PlatformModule platformModule )
locksSupplier = () -> createLockManager( lockFactory, config, platformModule.clock ); locksSupplier = () -> createLockManager( lockFactory, config, platformModule.clock );
statementLocksFactoryProvider = locks -> createStatementLocksFactory( locks, config, logging ); statementLocksFactoryProvider = locks -> createStatementLocksFactory( locks, config, logging );


idTypeConfigurationProvider = createIdTypeConfigurationProvider( config );
eligibleForIdReuse = IdReuseEligibility.ALWAYS;
threadToTransactionBridge = dependencies.satisfyDependency( threadToTransactionBridge = dependencies.satisfyDependency(
new ThreadToStatementContextBridge( getGlobalAvailabilityGuard( platformModule.clock, logging, platformModule.config ) ) ); new ThreadToStatementContextBridge( getGlobalAvailabilityGuard( platformModule.clock, logging, platformModule.config ) ) );


createIdComponents( platformModule, dependencies, createIdGeneratorFactory( fileSystem, idTypeConfigurationProvider ) );
dependencies.satisfyDependency( idGeneratorFactoryProvider ); idModule = createIdModule( platformModule, fileSystem );
dependencies.satisfyDependency( idControllerFactory );


tokenHoldersSupplier = () -> new TokenHolders( tokenHoldersSupplier = () -> new TokenHolders(
new DelegatingTokenHolder( createPropertyKeyCreator( config, dataSourceManager ), TokenHolder.TYPE_PROPERTY_KEY ), new DelegatingTokenHolder( createPropertyKeyCreator( config, dataSourceManager ), TokenHolder.TYPE_PROPERTY_KEY ),
Expand All @@ -136,6 +129,11 @@ public CommunityEditionModule( PlatformModule platformModule )
publishEditionInfo( dependencies.resolveDependency( UsageData.class ), platformModule.databaseInfo, config ); publishEditionInfo( dependencies.resolveDependency( UsageData.class ), platformModule.databaseInfo, config );
} }


protected IdModule createIdModule( PlatformModule platformModule, FileSystemAbstraction fileSystem )
{
return IdModuleBuilder.of( fileSystem, platformModule.jobScheduler ).build();
}

protected Predicate<String> fileWatcherFileNameFilter() protected Predicate<String> fileWatcherFileNameFilter()
{ {
return communityFileWatcherFileNameFilter(); return communityFileWatcherFileNameFilter();
Expand All @@ -149,11 +147,6 @@ static Predicate<String> communityFileWatcherFileNameFilter()
); );
} }


protected IdTypeConfigurationProvider createIdTypeConfigurationProvider( Config config )
{
return new CommunityIdTypeConfigurationProvider();
}

protected ConstraintSemantics createSchemaRuleVerifier() protected ConstraintSemantics createSchemaRuleVerifier()
{ {
return new StandardConstraintSemantics(); return new StandardConstraintSemantics();
Expand Down Expand Up @@ -211,12 +204,6 @@ private KernelData createKernelData( FileSystemAbstraction fileSystem, PageCache
return life.add( new KernelData( fileSystem, pageCache, storeDir, config, dataSourceManager ) ); return life.add( new KernelData( fileSystem, pageCache, storeDir, config, dataSourceManager ) );
} }


protected Function<String,IdGeneratorFactory> createIdGeneratorFactory( FileSystemAbstraction fs,
IdTypeConfigurationProvider idTypeConfigurationProvider )
{
return databaseName -> new DefaultIdGeneratorFactory( fs, idTypeConfigurationProvider );
}

protected TransactionHeaderInformationFactory createHeaderInformationFactory() protected TransactionHeaderInformationFactory createHeaderInformationFactory()
{ {
return TransactionHeaderInformationFactory.DEFAULT; return TransactionHeaderInformationFactory.DEFAULT;
Expand Down
Expand Up @@ -21,8 +21,6 @@


import java.io.File; import java.io.File;
import java.time.Clock; import java.time.Clock;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
Expand All @@ -31,6 +29,7 @@
import org.neo4j.dmbs.database.DefaultDatabaseManager; import org.neo4j.dmbs.database.DefaultDatabaseManager;
import org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory; import org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.factory.module.id.IdModule;
import org.neo4j.helpers.Service; import org.neo4j.helpers.Service;
import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction;
Expand All @@ -56,17 +55,9 @@
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.proc.ProcedureConfig; import org.neo4j.kernel.impl.proc.ProcedureConfig;
import org.neo4j.kernel.impl.proc.Procedures; import org.neo4j.kernel.impl.proc.Procedures;
import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.BufferedIdController;
import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.DefaultIdController;
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.IdGeneratorFactory;
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.TransactionHeaderInformationFactory;
import org.neo4j.kernel.impl.transaction.stats.DatabaseTransactionStats; import org.neo4j.kernel.impl.transaction.stats.DatabaseTransactionStats;
import org.neo4j.kernel.impl.transaction.stats.TransactionCounters; import org.neo4j.kernel.impl.transaction.stats.TransactionCounters;
import org.neo4j.kernel.impl.util.Dependencies;
import org.neo4j.kernel.impl.util.DependencySatisfier; import org.neo4j.kernel.impl.util.DependencySatisfier;
import org.neo4j.kernel.impl.util.watcher.DefaultFileDeletionEventListener; import org.neo4j.kernel.impl.util.watcher.DefaultFileDeletionEventListener;
import org.neo4j.kernel.impl.util.watcher.DefaultFileSystemWatcherService; import org.neo4j.kernel.impl.util.watcher.DefaultFileSystemWatcherService;
Expand All @@ -76,7 +67,6 @@
import org.neo4j.scheduler.JobScheduler; import org.neo4j.scheduler.JobScheduler;
import org.neo4j.udc.UsageData; import org.neo4j.udc.UsageData;
import org.neo4j.udc.UsageDataKeys; import org.neo4j.udc.UsageDataKeys;
import org.neo4j.util.FeatureToggles;


import static org.neo4j.kernel.impl.proc.temporal.TemporalFunction.registerTemporalFunctions; import static org.neo4j.kernel.impl.proc.temporal.TemporalFunction.registerTemporalFunctions;


Expand All @@ -86,17 +76,7 @@
*/ */
public abstract class EditionModule public abstract class EditionModule
{ {
// This resided in RecordStorageEngine prior to 3.3 public IdModule idModule;
private static final boolean safeIdBuffering = FeatureToggles.flag(
EditionModule.class, "safeIdBuffering", true );

public Function<String, ? extends IdGeneratorFactory> idGeneratorFactoryProvider;

public IdTypeConfigurationProvider idTypeConfigurationProvider;

public Function<String, IdController> idControllerFactory;

public IdReuseEligibility eligibleForIdReuse;


public Supplier<TokenHolders> tokenHoldersSupplier; public Supplier<TokenHolders> tokenHoldersSupplier;


Expand Down Expand Up @@ -255,49 +235,6 @@ protected NetworkConnectionTracker createConnectionTracker()
return NetworkConnectionTracker.NO_OP; return NetworkConnectionTracker.NO_OP;
} }


protected void createIdComponents( PlatformModule platformModule, Dependencies dependencies,
Function<String,? extends IdGeneratorFactory> idGeneratorFactoryProvider )
{
Function<String,? extends IdGeneratorFactory> factoryProvider = idGeneratorFactoryProvider;
if ( safeIdBuffering )
{
Function<String,BufferingIdGeneratorFactory> bufferingIdGeneratorFactory = new Function<String,BufferingIdGeneratorFactory>()
{
private final Map<String,BufferingIdGeneratorFactory> idGenerators = new HashMap<>();

@Override
public BufferingIdGeneratorFactory apply( String databaseName )
{
return idGenerators.computeIfAbsent( databaseName,
s -> new BufferingIdGeneratorFactory( idGeneratorFactoryProvider.apply( databaseName ), eligibleForIdReuse,
idTypeConfigurationProvider ) );
}
};
idControllerFactory = databaseName -> createBufferedIdController( bufferingIdGeneratorFactory.apply( databaseName ), platformModule.jobScheduler );
factoryProvider = bufferingIdGeneratorFactory;
}
else
{
idControllerFactory = any -> createDefaultIdController();
}
this.idGeneratorFactoryProvider = factoryProvider;
}

private BufferedIdController createBufferedIdController( BufferingIdGeneratorFactory idGeneratorFactory, JobScheduler scheduler )
{
return new BufferedIdController( idGeneratorFactory, scheduler );
}

protected DefaultIdController createDefaultIdController()
{
return new DefaultIdController();
}

public void createDatabases( DatabaseManager databaseManager, Config config )
{
databaseManager.createDatabase( config.get( GraphDatabaseSettings.active_database ) );
}

public DatabaseTransactionStats createTransactionMonitor() public DatabaseTransactionStats createTransactionMonitor()
{ {
return databaseStatistics; return databaseStatistics;
Expand All @@ -322,4 +259,9 @@ public DatabaseAvailabilityGuard createDatabaseAvailabilityGuard( String databas
{ {
return (DatabaseAvailabilityGuard) getGlobalAvailabilityGuard( clock, logService, config ); return (DatabaseAvailabilityGuard) getGlobalAvailabilityGuard( clock, logService, config );
} }

public void createDatabases( DatabaseManager databaseManager, Config config )
{
databaseManager.createDatabase( config.get( GraphDatabaseSettings.active_database ) );
}
} }
Expand Up @@ -24,6 +24,7 @@


import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.factory.module.id.DatabaseIdContext;
import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector;
import org.neo4j.internal.kernel.api.TokenNameLookup; import org.neo4j.internal.kernel.api.TokenNameLookup;
import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction;
Expand Down Expand Up @@ -124,7 +125,9 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext
{ {
this.databaseName = databaseName; this.databaseName = databaseName;
this.config = platformModule.config; this.config = platformModule.config;
this.idGeneratorFactory = editionModule.idGeneratorFactoryProvider.apply( databaseName ); DatabaseIdContext idContext = editionModule.idModule.createIdContext( databaseName );
this.idGeneratorFactory = idContext.getIdGeneratorFactory();
this.idController = idContext.getIdController();
this.databaseLayout = platformModule.storeLayout.databaseLayout( databaseName ); this.databaseLayout = platformModule.storeLayout.databaseLayout( databaseName );
this.logService = platformModule.logging; this.logService = platformModule.logging;
this.scheduler = platformModule.jobScheduler; this.scheduler = platformModule.jobScheduler;
Expand Down Expand Up @@ -159,7 +162,6 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext
this.accessCapability = editionModule.accessCapability; this.accessCapability = editionModule.accessCapability;
this.storeCopyCheckPointMutex = new StoreCopyCheckPointMutex(); this.storeCopyCheckPointMutex = new StoreCopyCheckPointMutex();
this.recoveryCleanupWorkCollector = platformModule.recoveryCleanupWorkCollector; this.recoveryCleanupWorkCollector = platformModule.recoveryCleanupWorkCollector;
this.idController = editionModule.idControllerFactory.apply( databaseName );
this.databaseInfo = platformModule.databaseInfo; this.databaseInfo = platformModule.databaseInfo;
this.versionContextSupplier = platformModule.versionContextSupplier; this.versionContextSupplier = platformModule.versionContextSupplier;
this.collectionsFactorySupplier = platformModule.collectionsFactorySupplier; this.collectionsFactorySupplier = platformModule.collectionsFactorySupplier;
Expand Down
@@ -0,0 +1,45 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.neo4j.graphdb.factory.module.id;

import org.neo4j.kernel.impl.storageengine.impl.recordstorage.id.IdController;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;

public class DatabaseIdContext
{
private final IdGeneratorFactory idGeneratorFactory;
private final IdController idController;

DatabaseIdContext( IdGeneratorFactory idGeneratorFactory, IdController idController )
{
this.idGeneratorFactory = idGeneratorFactory;
this.idController = idController;
}

public IdGeneratorFactory getIdGeneratorFactory()
{
return idGeneratorFactory;
}

public IdController getIdController()
{
return idController;
}
}

0 comments on commit 3f9b55f

Please sign in to comment.