Skip to content

Commit

Permalink
Update token holder function to be a factory instead.
Browse files Browse the repository at this point in the history
Fix a problem where because of old DataSourceManager usage
tokens from different databases get merged into the wrong transaction
logs.

Add tests that check that multiple databases does not intersect in terms
of facades, data and transaction logs.
  • Loading branch information
MishaDemianenko committed Sep 3, 2018
1 parent c4449ec commit b3b3cbf
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 16 deletions.
Expand Up @@ -262,7 +262,7 @@ public NeoStoreDataSource( DatabaseCreationContext context )
this.accessCapability = context.getAccessCapability();
this.recoveryCleanupWorkCollector = context.getRecoveryCleanupWorkCollector();

readOnly = context.getConfig().get( GraphDatabaseSettings.read_only );
this.readOnly = context.getConfig().get( GraphDatabaseSettings.read_only );
this.idController = context.getIdController();
this.databaseInfo = context.getDatabaseInfo();
this.versionContextSupplier = context.getVersionContextSupplier();
Expand Down
Expand Up @@ -20,12 +20,15 @@
package org.neo4j.graphdb.factory.module;

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

import org.neo4j.function.Predicates;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.factory.module.id.IdContextFactory;
import org.neo4j.graphdb.factory.module.id.IdContextFactoryBuilder;
import org.neo4j.internal.kernel.api.Kernel;
import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.IOLimiter;
Expand Down Expand Up @@ -103,10 +106,7 @@ public CommunityEditionModule( PlatformModule platformModule )

idContextFactory = createIdContextFactory( platformModule, fileSystem );

tokenHoldersSupplier = () -> new TokenHolders(
new DelegatingTokenHolder( createPropertyKeyCreator( config, dataSourceManager ), TokenHolder.TYPE_PROPERTY_KEY ),
new DelegatingTokenHolder( createLabelIdCreator( config, dataSourceManager ), TokenHolder.TYPE_LABEL ),
new DelegatingTokenHolder( createRelationshipTypeCreator( config, dataSourceManager ), TokenHolder.TYPE_RELATIONSHIP_TYPE ) );
tokenHoldersProvider = createTokenHolderProvider( platformModule );

File kernelContextDirectory = platformModule.storeLayout.storeDirectory();
dependencies.satisfyDependency( createKernelData( fileSystem, pageCache, kernelContextDirectory, config, life, dataSourceManager ) );
Expand All @@ -128,6 +128,16 @@ public CommunityEditionModule( PlatformModule platformModule )
publishEditionInfo( dependencies.resolveDependency( UsageData.class ), platformModule.databaseInfo, config );
}

protected Function<String,TokenHolders> createTokenHolderProvider( PlatformModule platform )
{
Config config = platform.config;
DataSourceManager dataSourceManager = platform.dataSourceManager;
return ignored -> new TokenHolders(
new DelegatingTokenHolder( createPropertyKeyCreator( config, dataSourceManager ), TokenHolder.TYPE_PROPERTY_KEY ),
new DelegatingTokenHolder( createLabelIdCreator( config, dataSourceManager ), TokenHolder.TYPE_LABEL ),
new DelegatingTokenHolder( createRelationshipTypeCreator( config, dataSourceManager ), TokenHolder.TYPE_RELATIONSHIP_TYPE ) );
}

protected IdContextFactory createIdContextFactory( PlatformModule platformModule, FileSystemAbstraction fileSystem )
{
return IdContextFactoryBuilder.of( fileSystem, platformModule.jobScheduler ).build();
Expand Down Expand Up @@ -161,39 +171,39 @@ protected SchemaWriteGuard createSchemaWriteGuard()
return SchemaWriteGuard.ALLOW_ALL_WRITES;
}

private TokenCreator createRelationshipTypeCreator( Config config, DataSourceManager dataSourceManager )
protected static TokenCreator createRelationshipTypeCreator( Config config, Supplier<Kernel> kernelSupplier )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTokenCreator();
}
else
{
return new DefaultRelationshipTypeCreator( dataSourceManager );
return new DefaultRelationshipTypeCreator( kernelSupplier );
}
}

private TokenCreator createPropertyKeyCreator( Config config, DataSourceManager dataSourceManager )
protected static TokenCreator createPropertyKeyCreator( Config config, Supplier<Kernel> kernelSupplier )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTokenCreator();
}
else
{
return new DefaultPropertyTokenCreator( dataSourceManager );
return new DefaultPropertyTokenCreator( kernelSupplier );
}
}

private TokenCreator createLabelIdCreator( Config config, DataSourceManager dataSourceManager )
protected static TokenCreator createLabelIdCreator( Config config, Supplier<Kernel> kernelSupplier )
{
if ( config.get( GraphDatabaseSettings.read_only ) )
{
return new ReadOnlyTokenCreator();
}
else
{
return new DefaultLabelIdCreator( dataSourceManager );
return new DefaultLabelIdCreator( kernelSupplier );
}
}

Expand Down
Expand Up @@ -78,7 +78,7 @@ public abstract class EditionModule
{
public IdContextFactory idContextFactory;

public Supplier<TokenHolders> tokenHoldersSupplier;
public Function<String, TokenHolders> tokenHoldersProvider;

public Supplier<Locks> locksSupplier;

Expand Down
Expand Up @@ -132,7 +132,7 @@ public class ModularDatabaseCreationContext implements DatabaseCreationContext
this.logService = platformModule.logging;
this.scheduler = platformModule.jobScheduler;
this.globalDependencies = platformModule.dependencies;
this.tokenHolders = editionModule.tokenHoldersSupplier.get();
this.tokenHolders = editionModule.tokenHoldersProvider.apply( databaseName );
this.tokenNameLookup = new NonTransactionalTokenNameLookup( tokenHolders );
this.locks = editionModule.locksSupplier.get();
this.statementLocksFactory = editionModule.statementLocksFactoryProvider.apply( locks );
Expand Down
Expand Up @@ -309,7 +309,7 @@ public EnterpriseCoreEditionModule( final PlatformModule platformModule,
.withFactoryWrapper( generator -> new FreeIdFilteredIdGeneratorFactory( generator, coreStateMachinesModule.freeIdCondition ) ).build();

// TODO: this is broken, coreStateMachinesModule.tokenHolders should be supplier, somehow...
this.tokenHoldersSupplier = () -> coreStateMachinesModule.tokenHolders;
this.tokenHoldersProvider = databaseName -> coreStateMachinesModule.tokenHolders;
this.locksSupplier = coreStateMachinesModule.locksSupplier;
this.commitProcessFactory = coreStateMachinesModule.commitProcessFactory;
this.accessCapability = new LeaderCanWrite( consensusModule.raftMachine() );
Expand Down
Expand Up @@ -182,7 +182,7 @@ public EnterpriseReadReplicaEditionModule( final PlatformModule platformModule,
.withFileSystem( fileSystem )
.build();

tokenHoldersSupplier = () -> new TokenHolders(
tokenHoldersProvider = databaseName -> new TokenHolders(
new DelegatingTokenHolder( new ReadOnlyTokenCreator(), TokenHolder.TYPE_PROPERTY_KEY ),
new DelegatingTokenHolder( new ReadOnlyTokenCreator(), TokenHolder.TYPE_LABEL ),
new DelegatingTokenHolder( new ReadOnlyTokenCreator(), TokenHolder.TYPE_RELATIONSHIP_TYPE ) );
Expand Down
Expand Up @@ -518,7 +518,7 @@ public void elected( String role, InstanceId instanceId, URI electedMember )

// HA will only support a single token holder
tokenHolders = new TokenHolders( propertyKeyTokenHolder, labelTokenHolder, relationshipTypeTokenHolder );
tokenHoldersSupplier = () -> tokenHolders;
tokenHoldersProvider = ignored -> tokenHolders;

dependencies.satisfyDependency(
createKernelData( config, platformModule.dataSourceManager, members, fs, platformModule.pageCache,
Expand Down

0 comments on commit b3b3cbf

Please sign in to comment.