diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java index 5c62d92ef414..6b09d90da35a 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java @@ -62,6 +62,8 @@ enum Type /** * @return The Write operations of the graph. + * @throws InvalidTransactionTypeKernelException when transaction cannot be upgraded to a write transaction. This + * can happen when there have been schema modifications. */ Write dataWrite() throws InvalidTransactionTypeKernelException; diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/StubPropertyCursor.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/StubPropertyCursor.java index ac2841b2f940..b145a0c3fa18 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/StubPropertyCursor.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/StubPropertyCursor.java @@ -84,7 +84,7 @@ public Value propertyValue() @Override public void writeTo( ValueWriter target ) { - + throw new UnsupportedOperationException( "not implemented" ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java index 685b8061a749..9bf90a16443c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java @@ -199,7 +199,7 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati this.userMetaData = new HashMap<>(); AllStoreHolder allStoreHolder = new AllStoreHolder( storageEngine, storageStatement, this, cursors, explicitIndexStore, - this::assertTransactionOpen ); + this::assertOpen ); this.operations = new Operations( allStoreHolder, @@ -462,6 +462,15 @@ private void assertTransactionOpen() } } + private void assertOpen() + { + Optional terminationReason = getReasonIfTerminated(); + if ( terminationReason.isPresent() ) + { + throw new TransactionTerminatedException( terminationReason.get() ); + } + } + private boolean hasChanges() { return hasTxStateWithChanges() || hasExplicitIndexChanges(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java index 808645804327..94c9c7bf0783 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java @@ -449,9 +449,9 @@ public Map getAllProperties() CursorFactory cursors = transaction.cursors(); Map properties = new HashMap<>(); - try ( NodeCursor nodes = cursors.allocateNodeCursor(); - PropertyCursor propertyCursor = cursors.allocatePropertyCursor(); - Statement ignore = actions.statement() ) + try ( Statement ignore = actions.statement(); + NodeCursor nodes = cursors.allocateNodeCursor(); + PropertyCursor propertyCursor = cursors.allocatePropertyCursor() ) { Token token = transaction.token(); transaction.dataRead().singleNode( nodeId, nodes ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java index b91ec3a23e62..c68b7d1633c9 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java @@ -332,8 +332,9 @@ public Node getNodeById( long id ) } KernelTransaction ktx = spi.currentTransaction(); - try ( NodeCursor nodeCursor = ktx.cursors().allocateNodeCursor(); - Statement ignore = spi.currentStatement() ) + try ( Statement ignore = spi.currentStatement(); + NodeCursor nodeCursor = ktx.cursors().allocateNodeCursor() + ) { ktx.dataRead().singleNode( id, nodeCursor ); if ( !nodeCursor.next() ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java index bef20e352f6d..055e0b314e49 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java @@ -302,7 +302,7 @@ ArrayValue array( PropertyCursor cursor, long reference, PageCursor page ) return PropertyUtil.readArrayFromBuffer( buffer ); } - public boolean nodeExists( long id ) + public boolean nodeExistsInStore( long id ) { return storeReadLayer.nodeExists( id ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java index b648e72210ed..4742f58798b4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NewKernel.java @@ -19,13 +19,10 @@ */ package org.neo4j.kernel.impl.newapi; -import java.util.function.Supplier; - import org.neo4j.internal.kernel.api.CursorFactory; import org.neo4j.internal.kernel.api.Kernel; import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.kernel.api.InwardKernel; -import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState; import org.neo4j.storageengine.api.StorageEngine; import org.neo4j.storageengine.api.StorageStatement; @@ -48,7 +45,6 @@ public NewKernel( StorageEngine engine, InwardKernel kernel ) this.engine = engine; this.kernel = kernel; this.isRunning = false; - this.cursors = new Cursors( ); } @Override @@ -80,5 +76,6 @@ public void stop() } statement.close(); isRunning = false; + this.cursors = null; } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java index d012033847db..14a219afca64 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java @@ -271,6 +271,9 @@ public void close() pageCursor.close(); pageCursor = null; } + read = null; + labelCursor = null; + reset(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeExplicitIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeExplicitIndexCursor.java index e4ebddf66380..ee55e234f547 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeExplicitIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeExplicitIndexCursor.java @@ -89,6 +89,7 @@ public void close() node = NO_ID; score = 0; expectedSize = 0; + read = null; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeLabelIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeLabelIndexCursor.java index 2d0c808af895..dfe5ae19fa86 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeLabelIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeLabelIndexCursor.java @@ -81,6 +81,7 @@ public void close() super.close(); node = NO_ID; labels = null; + read = null; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeValueIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeValueIndexCursor.java index 010723f5b28a..f7f9bcd35c3b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeValueIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeValueIndexCursor.java @@ -102,6 +102,7 @@ public void close() this.node = NO_ID; this.keys = null; this.values = null; + this.read = null; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java index 8d59f171549d..fe1e49d171d5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java @@ -367,7 +367,7 @@ public boolean nodeDelete( long node ) throws AutoIndexingKernelException } ktx.locks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, node ); - if ( allStoreHolder.nodeExists( node ) ) + if ( allStoreHolder.nodeExistsInStore( node ) ) { autoIndexing.nodes().entityRemoved( this, node ); ktx.txState().nodeDoDelete( node ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/PropertyCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/PropertyCursor.java index aed04b5e52c1..c0ccf908467b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/PropertyCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/PropertyCursor.java @@ -196,6 +196,7 @@ public void close() propertiesState = null; changedProperties = null; stateValue = null; + read = null; clear(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java index b0b2d06c7f38..35f1f9c46512 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java @@ -25,7 +25,6 @@ import org.neo4j.internal.kernel.api.CapableIndexReference; import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; -import org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor; import org.neo4j.internal.kernel.api.Scan; import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.io.pagecache.PageCursor; @@ -165,7 +164,7 @@ public final Scan nodeLabelS @Override public final void allNodesScan( org.neo4j.internal.kernel.api.NodeCursor cursor ) { - ((NodeCursor) cursor).scan(this); + ((NodeCursor) cursor).scan( this ); } @Override @@ -319,52 +318,52 @@ public final void nodeExplicitIndexQuery( org.neo4j.internal.kernel.api.NodeExplicitIndexCursor cursor, String index, String key, Object query ) throws KernelException { ((NodeExplicitIndexCursor) cursor).setRead( this ); - explicitIndex( (org.neo4j.kernel.impl.newapi.NodeExplicitIndexCursor) cursor, explicitNodeIndex( index ).query( + explicitIndex( (NodeExplicitIndexCursor) cursor, explicitNodeIndex( index ).query( key, query instanceof Value ? ((Value) query).asObject() : query ) ); } @Override public void relationshipExplicitIndexGet( - RelationshipExplicitIndexCursor cursor, + org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor cursor, String index, String key, Value value, long source, long target ) throws KernelException { - ((org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor).setRead( this ); + ((RelationshipExplicitIndexCursor) cursor).setRead( this ); explicitIndex( - (org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor, + (RelationshipExplicitIndexCursor) cursor, explicitRelationshipIndex( index ).get( key, value.asObject(), source, target ) ); } @Override public void relationshipExplicitIndexQuery( - RelationshipExplicitIndexCursor cursor, + org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor cursor, String index, Object query, long source, long target ) throws KernelException { - ((org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor).setRead( this ); + ((RelationshipExplicitIndexCursor) cursor).setRead( this ); explicitIndex( - (org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor, + (RelationshipExplicitIndexCursor) cursor, explicitRelationshipIndex( index ) .query( query instanceof Value ? ((Value) query).asObject() : query, source, target ) ); } @Override public void relationshipExplicitIndexQuery( - RelationshipExplicitIndexCursor cursor, + org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor cursor, String index, String key, Object query, long source, long target ) throws KernelException { - ((org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor).setRead( this ); + ((RelationshipExplicitIndexCursor) cursor).setRead( this ); explicitIndex( - (org.neo4j.kernel.impl.newapi.RelationshipExplicitIndexCursor) cursor, + (RelationshipExplicitIndexCursor) cursor, explicitRelationshipIndex( index ).query( key, query instanceof Value ? ((Value) query).asObject() : query, source, target ) ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipExplicitIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipExplicitIndexCursor.java index bccb44a739e0..9a8869b0c28b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipExplicitIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipExplicitIndexCursor.java @@ -115,6 +115,7 @@ public void close() relationship = NO_ID; score = 0; expectedSize = 0; + read = null; } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipGroupCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipGroupCursor.java index da4efafaffd5..c181281e89e2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipGroupCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipGroupCursor.java @@ -159,6 +159,7 @@ public void close() edgePage = null; } current = null; + read = null; setId( NO_ID ); clear(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java index 73acf404fb3b..cd7f831d1d9d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java @@ -111,6 +111,7 @@ public void close() pageCursor.close(); pageCursor = null; } + read = null; reset(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipTraversalCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipTraversalCursor.java index 8aa6500d0b35..dc6a7378c6cb 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipTraversalCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipTraversalCursor.java @@ -425,6 +425,7 @@ public void close() pageCursor.close(); pageCursor = null; } + read = null; reset(); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java index 773776b755ed..c08b2bd97a2d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/KernelTransactionTerminationTest.java @@ -343,8 +343,9 @@ private static class TestKernelTransaction extends KernelTransactionImplementati mock( Pool.class ), Clocks.fakeClock(), CpuClock.NOT_AVAILABLE, HeapAllocation.NOT_AVAILABLE, TransactionTracer.NULL, LockTracer.NONE, PageCursorTracerSupplier.NULL, - mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(), mock(Cursors.class), AutoIndexing.UNSUPPORTED, mock( - ExplicitIndexStore.class) ); + mock( StorageEngine.class, RETURNS_MOCKS ), new CanWrite(), mock( Cursors.class ), + AutoIndexing.UNSUPPORTED, mock( + ExplicitIndexStore.class ) ); this.monitor = monitor; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java index e5e4f5811d48..a6a5b267e84c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java @@ -190,7 +190,7 @@ public void shouldAcquireEntityWriteLockBeforeDeletingNode() // GIVEN when( nodeCursor.next() ).thenReturn( true ); when( nodeCursor.labels() ).thenReturn( LabelSet.NONE ); - when( allStoreHolder.nodeExists( 123 ) ).thenReturn( true ); + when( allStoreHolder.nodeExistsInStore( 123 ) ).thenReturn( true ); // WHEN operations.nodeDelete( 123 );