Skip to content

Commit

Permalink
Use transaction provided availability guard to check database availab…
Browse files Browse the repository at this point in the history
…ility

instead of using global availability guard in ThreadToStatementContextBridge.
  • Loading branch information
MishaDemianenko committed Aug 24, 2018
1 parent cba5a00 commit f48a4f3
Show file tree
Hide file tree
Showing 15 changed files with 59 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ private static TransactionStateMachineV1SPI createTxSpi( Supplier<TransactionIdS
QueryExecutionEngine queryExecutionEngine = mock( QueryExecutionEngine.class );

DependencyResolver dependencyResolver = mock( DependencyResolver.class );
ThreadToStatementContextBridge bridge = new ThreadToStatementContextBridge( databaseAvailabilityGuard );
ThreadToStatementContextBridge bridge = new ThreadToStatementContextBridge();
when( dependencyResolver.resolveDependency( ThreadToStatementContextBridge.class ) ).thenReturn( bridge );
when( dependencyResolver.resolveDependency( QueryExecutionEngine.class ) ).thenReturn( queryExecutionEngine );
when( dependencyResolver.provideDependency( TransactionIdStore.class ) ).thenReturn( txIdStore );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.query.ExecutingQuery;
import org.neo4j.kernel.api.txstate.TxStateHolder;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.ClockContext;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.coreapi.InternalTransaction;
Expand Down Expand Up @@ -795,6 +796,12 @@ public void setMetaData( Map<String,Object> metaData )
internal.setMetaData( metaData );
}

@Override
public DatabaseAvailabilityGuard getAvailabilityGuard()
{
return internal.getAvailabilityGuard();
}

@Override
public void assertOpen()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.neo4j.internal.kernel.api.security.AuthSubject;
import org.neo4j.internal.kernel.api.security.LoginContext;
import org.neo4j.internal.kernel.api.security.SecurityContext;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.ClockContext;
import org.neo4j.storageengine.api.schema.IndexDescriptor;

Expand Down Expand Up @@ -177,6 +178,11 @@ interface CloseListener
*/
void setMetaData( Map<String, Object> metaData );

/**
* @return database availability guard of database this transaction was started against.
*/
DatabaseAvailabilityGuard getAvailabilityGuard();

@FunctionalInterface
interface Revertable extends AutoCloseable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,6 @@ public void shutdown()
}
}

private enum Availability
{
AVAILABLE,
UNAVAILABLE,
SHUTDOWN
}

/**
* Check if the database is available for transactions to use.
*
Expand Down Expand Up @@ -266,6 +259,13 @@ public String describeWhoIsBlocking()
return "No blocking components";
}

private enum Availability
{
AVAILABLE,
UNAVAILABLE,
SHUTDOWN
}

private static class LoggingAvailabilityListener implements AvailabilityListener
{
private final Log log;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState;
import org.neo4j.kernel.api.txstate.TransactionState;
import org.neo4j.kernel.api.txstate.TxStateHolder;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.index.IndexingProvidersService;
import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator;
import org.neo4j.kernel.impl.api.state.TxState;
Expand Down Expand Up @@ -142,6 +143,7 @@ public class KernelTransactionImplementation implements KernelTransaction, TxSta
private final TransactionMonitor transactionMonitor;
private final PageCursorTracerSupplier cursorTracerSupplier;
private final VersionContextSupplier versionContextSupplier;
private final DatabaseAvailabilityGuard databaseAvailabilityGuard;
private final StorageReader storageReader;
private final ClockContext clocks;
private final AccessCapability accessCapability;
Expand Down Expand Up @@ -193,7 +195,8 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati
TransactionTracer transactionTracer, LockTracer lockTracer, PageCursorTracerSupplier cursorTracerSupplier, StorageEngine storageEngine,
AccessCapability accessCapability, AutoIndexing autoIndexing, ExplicitIndexStore explicitIndexStore, VersionContextSupplier versionContextSupplier,
CollectionsFactorySupplier collectionsFactorySupplier, ConstraintSemantics constraintSemantics, SchemaState schemaState,
IndexingProvidersService indexProviders, TokenHolders tokenHolders, Dependencies dataSourceDependencies )
IndexingProvidersService indexProviders, TokenHolders tokenHolders, Dependencies dataSourceDependencies,
DatabaseAvailabilityGuard databaseAvailabilityGuard )
{
this.schemaWriteGuard = schemaWriteGuard;
this.hooks = hooks;
Expand All @@ -209,6 +212,7 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati
this.transactionTracer = transactionTracer;
this.cursorTracerSupplier = cursorTracerSupplier;
this.versionContextSupplier = versionContextSupplier;
this.databaseAvailabilityGuard = databaseAvailabilityGuard;
this.currentStatement = new KernelStatement( this, this, storageReader,
lockTracer, statementOperations, this.clocks,
versionContextSupplier );
Expand Down Expand Up @@ -390,6 +394,12 @@ public void setMetaData( Map<String, Object> data )
this.userMetaData = data;
}

@Override
public DatabaseAvailabilityGuard getAvailabilityGuard()
{
return databaseAvailabilityGuard;
}

public Map<String, Object> getMetaData()
{
return userMetaData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ public KernelTransactionImplementation newInstance()
tracers.pageCursorTracerSupplier, storageEngine, accessCapability,
autoIndexing,
explicitIndexStore, versionContextSupplier, collectionsFactorySupplier, constraintSemantics,
schemaState, indexProviders, tokenHolders, dataSourceDependencies );
schemaState, indexProviders, tokenHolders, dataSourceDependencies, databaseAvailabilityGuard );
this.transactions.add( tx );
return tx;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;

/**
* This is meant to serve as the bridge that tie transactions to threads.
Expand All @@ -36,12 +35,6 @@
public class ThreadToStatementContextBridge implements Supplier<Statement>
{
private final ThreadLocal<KernelTransaction> threadToTransactionMap = new ThreadLocal<>();
private final DatabaseAvailabilityGuard databaseAvailabilityGuard;

public ThreadToStatementContextBridge( DatabaseAvailabilityGuard databaseAvailabilityGuard )
{
this.databaseAvailabilityGuard = databaseAvailabilityGuard;
}

public boolean hasTransaction()
{
Expand Down Expand Up @@ -91,7 +84,7 @@ public KernelTransaction getKernelTransactionBoundToThisThread( boolean strict )

private void assertInUnterminatedTransaction( KernelTransaction transaction )
{
if ( databaseAvailabilityGuard.isShutdown() )
if ( transaction.getAvailabilityGuard().isShutdown() )
{
throw new DatabaseShutdownException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.neo4j.io.pagecache.tracing.cursor.PageCursorTracerSupplier;
import org.neo4j.io.pagecache.tracing.cursor.context.EmptyVersionContextSupplier;
import org.neo4j.kernel.api.explicitindex.AutoIndexing;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.KernelTransactionImplementation;
import org.neo4j.kernel.impl.api.SchemaState;
import org.neo4j.kernel.impl.api.SchemaWriteGuard;
Expand Down Expand Up @@ -99,7 +100,7 @@ static Instances kernelTransactionWithInternals( LoginContext loginContext )
PageCursorTracerSupplier.NULL,
storageEngine, new CanWrite(), AutoIndexing.UNSUPPORTED,
mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(),
mock( SchemaState.class), mock( IndexingService.class ), mockedTokenHolders(), new Dependencies() );
mock( SchemaState.class), mock( IndexingService.class ), mockedTokenHolders(), new Dependencies(), mock( DatabaseAvailabilityGuard.class ) );

StatementLocks statementLocks = new SimpleStatementLocks( new NoOpClient() );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.ClockContext;
import org.neo4j.storageengine.api.schema.IndexDescriptor;

Expand Down Expand Up @@ -282,6 +283,12 @@ public void setMetaData( Map<String,Object> metaData )
throw new UnsupportedOperationException( "not implemented" );
}

@Override
public DatabaseAvailabilityGuard getAvailabilityGuard()
{
throw new UnsupportedOperationException( "not implemented" );
}

@Override
public void assertOpen()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.explicitindex.AutoIndexing;
import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.index.IndexingService;
import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator;
import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics;
Expand Down Expand Up @@ -352,7 +353,7 @@ private static class TestKernelTransaction extends KernelTransactionImplementat
mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(),
AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ),
EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(), mock( SchemaState.class),
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies() );
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies(), mock( DatabaseAvailabilityGuard.class ) );

this.monitor = monitor;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.neo4j.io.pagecache.tracing.cursor.context.EmptyVersionContextSupplier;
import org.neo4j.kernel.api.explicitindex.AutoIndexing;
import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.index.IndexingService;
import org.neo4j.kernel.impl.constraints.StandardConstraintSemantics;
Expand Down Expand Up @@ -100,6 +101,7 @@ public class KernelTransactionTestBase
protected final TransactionHeaderInformation headerInformation = mock( TransactionHeaderInformation.class );
protected final TransactionHeaderInformationFactory headerInformationFactory = mock( TransactionHeaderInformationFactory.class );
protected final SchemaWriteGuard schemaWriteGuard = mock( SchemaWriteGuard.class );
protected final DatabaseAvailabilityGuard availabilityGuard = mock( DatabaseAvailabilityGuard.class );
protected final FakeClock clock = Clocks.fakeClock();
protected final Pool<KernelTransactionImplementation> txPool = mock( Pool.class );
protected final StatementOperationParts statementOperations = mock( StatementOperationParts.class );
Expand Down Expand Up @@ -170,7 +172,7 @@ public KernelTransactionImplementation newNotInitializedTransaction()
new CanWrite(), AutoIndexing.UNSUPPORTED,
mock( ExplicitIndexStore.class ), EmptyVersionContextSupplier.EMPTY, () -> collectionsFactory,
new StandardConstraintSemantics(), mock( SchemaState.class),
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies() );
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies(), availabilityGuard );
}

public class CapturingCommitProcess implements TransactionCommitProcess
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,8 @@ public PlatformModule( File providedStoreDir, Config config, DatabaseInfo databa

dependencies.satisfyDependency( dataSourceManager );

databaseAvailabilityGuard = dependencies.satisfyDependency( createAvailabilityGuard() );
threadToTransactionBridge = dependencies.satisfyDependency( new ThreadToStatementContextBridge( databaseAvailabilityGuard ) );
databaseAvailabilityGuard = createAvailabilityGuard();
threadToTransactionBridge = dependencies.satisfyDependency( new ThreadToStatementContextBridge() );

kernelExtensionFactories = externalDependencies.kernelExtensions();
engineProviders = externalDependencies.executionEngines();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.server.rest.transactional;

import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.KernelStatement;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;

Expand All @@ -44,7 +43,6 @@ static class FakeBridge extends ThreadToStatementContextBridge

FakeBridge()
{
super( mock( DatabaseAvailabilityGuard.class ) );
when( tx.acquireStatement() ).thenReturn( statement );
when( statement.hasTxStateWithChanges() ).thenReturn( false );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.ClockContext;
import org.neo4j.storageengine.api.schema.IndexDescriptor;

Expand Down Expand Up @@ -278,6 +279,12 @@ public void setMetaData( Map<String,Object> metaData )
{
}

@Override
public DatabaseAvailabilityGuard getAvailabilityGuard()
{
return null;
}

@Override
public ClockContext clocks()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.neo4j.kernel.api.query.ExecutingQuery;
import org.neo4j.kernel.api.query.QuerySnapshot;
import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState;
import org.neo4j.kernel.availability.DatabaseAvailabilityGuard;
import org.neo4j.kernel.impl.api.KernelTransactionImplementation;
import org.neo4j.kernel.impl.api.SchemaState;
import org.neo4j.kernel.impl.api.SchemaWriteGuard;
Expand Down Expand Up @@ -228,7 +229,7 @@ public TransactionExecutionStatistic transactionStatistic()
mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(),
AutoIndexing.UNSUPPORTED, mock( ExplicitIndexStore.class ),
EmptyVersionContextSupplier.EMPTY, ON_HEAP, new StandardConstraintSemantics(), mock( SchemaState.class),
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies() )
mock( IndexingService.class ), mockedTokenHolders(), new Dependencies(), mock( DatabaseAvailabilityGuard.class ) )
{
@Override
public Statistics getStatistics()
Expand Down

0 comments on commit f48a4f3

Please sign in to comment.