@Override public KernelStatement acquireStatement() { assertTransactionOpen(); currentStatement.acquire(); return currentStatement; }
@Override public void setMetaData( Map<String,Object> data ) { statement.assertOpen(); statement.getTransaction().setMetaData( data ); }
private void closeCurrentStatementIfAny() { currentStatement.forceClose(); }
@Override public void close() { // Check referenceCount > 0 since we allow multiple close calls, // i.e. ignore closing already closed statements if ( referenceCount > 0 && (--referenceCount == 0) ) { cleanupResources(); } recordOpenCloseMethods(); }
public static TransactionStateChecker create( TransitionalPeriodTransactionMessContainer container ) { KernelTransaction topLevelTransactionBoundToThisThread = container.getBridge().getKernelTransactionBoundToThisThread( true ); KernelStatement kernelStatement = (KernelStatement) topLevelTransactionBoundToThisThread.acquireStatement(); return new TransactionStateChecker( kernelStatement, nodeId -> kernelStatement.hasTxStateWithChanges() && kernelStatement.txState().nodeIsDeletedInThisTx( nodeId ), relId -> kernelStatement.hasTxStateWithChanges() && kernelStatement.txState().relationshipIsDeletedInThisTx( relId ) ); }
@Test public void shouldReleaseStorageReaderWhenForceClosed() { // given StorageReader storeStatement = mock( StorageReader.class ); KernelStatement statement = new KernelStatement( mock( KernelTransactionImplementation.class ), null, storeStatement, LockTracer.NONE, mock( StatementOperationParts.class ), new ClockContext(), EmptyVersionContextSupplier.EMPTY ); statement.acquire(); // when try { statement.forceClose(); } catch ( KernelStatement.StatementNotClosedException ignored ) { // ignore } // then verify( storeStatement ).release(); }
@Test public void reportQueryWaitingTimeToTransactionStatisticWhenFinishQueryExecution() { KernelTransactionImplementation transaction = mock( KernelTransactionImplementation.class ); TxStateHolder txStateHolder = mock( TxStateHolder.class ); StorageReader storeStatement = mock( StorageReader.class ); KernelTransactionImplementation.Statistics statistics = new KernelTransactionImplementation.Statistics( transaction, new AtomicReference<>( CpuClock.NOT_AVAILABLE ), new AtomicReference<>( HeapAllocation.NOT_AVAILABLE ) ); when( transaction.getStatistics() ).thenReturn( statistics ); when( transaction.executingQueries() ).thenReturn( ExecutingQueryList.EMPTY ); KernelStatement statement = new KernelStatement( transaction, txStateHolder, storeStatement, LockTracer.NONE, mock( StatementOperationParts.class ), new ClockContext(), EmptyVersionContextSupplier.EMPTY ); statement.acquire(); ExecutingQuery query = getQueryWithWaitingTime(); ExecutingQuery query2 = getQueryWithWaitingTime(); ExecutingQuery query3 = getQueryWithWaitingTime(); statement.stopQueryExecution( query ); statement.stopQueryExecution( query2 ); statement.stopQueryExecution( query3 ); assertEquals( 3, statistics.getWaitingTimeNanos( 1 ) ); }
@Override public ExecutingQuery startQueryExecution( KernelStatement statement, ClientConnectionInfo clientConnection, String queryText, MapValue queryParameters ) { long queryId = lastQueryId.incrementAndGet(); Thread thread = Thread.currentThread(); long threadId = thread.getId(); String threadName = thread.getName(); ExecutingQuery executingQuery = new ExecutingQuery( queryId, clientConnection, statement.username(), queryText, queryParameters, statement.getTransaction().getMetaData(), () -> statement.locks().activeLockCount(), statement.getPageCursorTracer(), threadId, threadName, clock, cpuClockRef.get(), heapAllocationRef.get() ); registerExecutingQuery( statement, executingQuery ); return executingQuery; }
@Test( expected = NotInTransactionException.class ) public void assertStatementIsNotOpenWhileAcquireIsNotInvoked() { KernelTransactionImplementation transaction = mock( KernelTransactionImplementation.class ); TxStateHolder txStateHolder = mock( TxStateHolder.class ); StorageReader storeStatement = mock( StorageReader.class ); KernelStatement statement = new KernelStatement( transaction, txStateHolder, storeStatement, LockTracer.NONE, mock( StatementOperationParts.class ), new ClockContext(), EmptyVersionContextSupplier.EMPTY ); statement.assertOpen(); }
@Test public void shouldReleaseStoreStatementWhenForceClosingStatements() { // given KernelTransactionImplementation transaction = mock( KernelTransactionImplementation.class ); StorageReader storageReader = mock( StorageReader.class ); KernelStatement statement = getKernelStatement( transaction, storageReader ); statement.acquire(); // when try { statement.forceClose(); } catch ( KernelStatement.StatementNotClosedException ignored ) { //ignored } // then verify( storageReader ).release(); }
@Override public ExecutingQuery startQueryExecution( ClientConnectionInfo descriptor, String queryText, MapValue queryParameters ) { statement.assertOpen(); return queryRegistrationOperations().startQueryExecution( statement, descriptor, queryText, queryParameters ); }
private KernelStatement getKernelStatement( KernelTransactionImplementation transaction, StorageReader storageReader ) { return new KernelStatement( transaction, null, storageReader, LockTracer.NONE, mock( StatementOperationParts.class ), new ClockContext(), EmptyVersionContextSupplier.EMPTY ); } }
@Test public void shouldReleaseStoreStatementOnlyWhenReferenceCountDownToZero() { // given KernelTransactionImplementation transaction = mock( KernelTransactionImplementation.class ); StorageReader storageReader = mock( StorageReader.class ); KernelStatement statement = getKernelStatement( transaction, storageReader ); statement.acquire(); verify( storageReader ).acquire(); statement.acquire(); // when statement.close(); verifyNoMoreInteractions( storageReader ); // then statement.close(); verify( storageReader ).release(); }
private static VersionContext getCursorContext( TransactionalContext context ) { return ((KernelStatement) context.statement()).getVersionContext(); }
@Override public void unregisterExecutingQuery( KernelStatement statement, ExecutingQuery executingQuery ) { statement.stopQueryExecution( executingQuery ); } }
final void forceClose() { if ( referenceCount > 0 ) { int leakedStatements = referenceCount; referenceCount = 0; cleanupResources(); if ( TRACK_STATEMENTS && transaction.isSuccess() ) { String message = getStatementNotClosedMessage( leakedStatements ); throw new StatementNotClosedException( message, statementOpenCloseCalls ); } } pageCursorTracer.reportEvents(); }
FakeBridge() { super( mock( AvailabilityGuard.class ) ); when( tx.acquireStatement() ).thenReturn( statement ); when( statement.hasTxStateWithChanges() ).thenReturn( false ); }
@Parameterized.Parameters( name = "{2}" ) public static Collection<Object[]> parameters() { Consumer<KernelTransaction> readTxInitializer = tx -> { }; Consumer<KernelTransaction> writeTxInitializer = tx -> { try ( KernelStatement statement = (KernelStatement) tx.acquireStatement() ) { statement.txState().nodeDoCreate( 42 ); } }; return Arrays.asList( new Object[]{readTxInitializer, false, "readOperationsInNewTransaction"}, new Object[]{writeTxInitializer, true, "write"} ); }
@Override public void run() { ThreadLocalRandom localRandom = ThreadLocalRandom.current(); while ( !canceled ) { PageCursorCounters pageCursorCounters; try ( Transaction transaction = db.beginTx(); KernelStatement kernelStatement = getKernelStatement( (GraphDatabaseAPI) db ) ) { pageCursorCounters = kernelStatement.getPageCursorTracer(); Node node = db.createNode(); node.setProperty( "name", RandomStringUtils.random( localRandom.nextInt( 100 ) ) ); node.setProperty( "surname", RandomStringUtils.random( localRandom.nextInt( 100 ) ) ); node.setProperty( "age", localRandom.nextInt( 100 ) ); transaction.success(); storeCounters( pageCursorCounters ); } } }
@Override public ExecutingQuery startQueryExecution( KernelStatement statement, ClientConnectionInfo clientConnection, String queryText, MapValue queryParameters ) { long queryId = lastQueryId.incrementAndGet(); Thread thread = Thread.currentThread(); long threadId = thread.getId(); String threadName = thread.getName(); ExecutingQuery executingQuery = new ExecutingQuery( queryId, clientConnection, statement.username(), queryText, queryParameters, statement.getTransaction().getMetaData(), () -> statement.locks().activeLockCount(), statement.getPageCursorTracer(), threadId, threadName, clock, cpuClockRef.get(), heapAllocationRef.get() ); registerExecutingQuery( statement, executingQuery ); return executingQuery; }