diff --git a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/ExecutionEngine.scala b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/ExecutionEngine.scala index 1d817b7a7b40..8a0a2923d30a 100644 --- a/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/ExecutionEngine.scala +++ b/community/cypher/cypher/src/main/scala/org/neo4j/cypher/internal/ExecutionEngine.scala @@ -35,7 +35,6 @@ import org.neo4j.internal.kernel.api.security.AccessMode import org.neo4j.kernel.api.ReadOperations import org.neo4j.kernel.api.query.SchemaIndexUsage import org.neo4j.kernel.configuration.Config -import org.neo4j.kernel.impl.locking.ResourceTypes import org.neo4j.kernel.impl.query.{QueryExecutionMonitor, TransactionalContext} import org.neo4j.kernel.monitoring.{Monitors => KernelMonitors} import org.neo4j.kernel.{GraphDatabaseQueryService, api} @@ -237,11 +236,11 @@ class ExecutionEngine(val queryService: GraphDatabaseQueryService, } private def releasePlanLabels(tc: TransactionalContextWrapper, labelIds: Seq[Long]) = { - tc.readOperations.releaseShared(ResourceTypes.LABEL, labelIds.toArray[Long]:_*) + tc.kernelTransaction.locks().releaseSharedLabelLock(labelIds.toArray[Long]:_*) } private def lockPlanLabels(tc: TransactionalContextWrapper, labelIds: Seq[Long]) = { - tc.readOperations.acquireShared(ResourceTypes.LABEL, labelIds.toArray[Long]:_*) + tc.kernelTransaction.locks().acquireSharedLabelLock(labelIds.toArray[Long]:_*) } private def extractPlanLabels(plan: (ExecutionPlan, Map[String, Any], Seq[String]), version: CypherVersion, tc: diff --git a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala index 5056eaba42cc..0a19cec65238 100644 --- a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala +++ b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala @@ -59,7 +59,6 @@ import org.neo4j.kernel.impl.api.operations.KeyReadOperations import org.neo4j.kernel.impl.api.store.RelationshipIterator import org.neo4j.kernel.impl.core.{EmbeddedProxySPI, ThreadToStatementContextBridge} import org.neo4j.kernel.impl.coreapi.PropertyContainerLocker -import org.neo4j.kernel.impl.locking.ResourceTypes import org.neo4j.kernel.impl.query.Neo4jTransactionalContext import org.neo4j.kernel.impl.util.ValueUtils.{fromNodeProxy, fromRelationshipProxy} import org.neo4j.kernel.impl.util.{DefaultValueMapper, NodeProxyWrappingNodeValue, RelationshipProxyWrappingValue} @@ -638,10 +637,10 @@ sealed class TransactionBoundQueryContext(val transactionalContext: Transactiona .hasTxStateWithChanges && transactionalContext.stateView.txState().nodeIsDeletedInThisTx(id) override def acquireExclusiveLock(obj: Long): Unit = - transactionalContext.statement.readOperations().acquireExclusive(ResourceTypes.NODE, obj) + transactionalContext.kernelTransaction.locks().acquireExclusiveNodeLock(obj) override def releaseExclusiveLock(obj: Long): Unit = - transactionalContext.statement.readOperations().releaseExclusive(ResourceTypes.NODE, obj) + transactionalContext.kernelTransaction.locks().releaseExclusiveNodeLock(obj) override def exists(id: Long): Boolean = reads().nodeExists(id) @@ -770,10 +769,10 @@ sealed class TransactionBoundQueryContext(val transactionalContext: Transactiona .relationshipIsDeletedInThisTx(id) override def acquireExclusiveLock(obj: Long): Unit = - transactionalContext.statement.readOperations().acquireExclusive(ResourceTypes.RELATIONSHIP, obj) + transactionalContext.kernelTransaction.locks().acquireExclusiveRelationshipLock(obj) override def releaseExclusiveLock(obj: Long): Unit = - transactionalContext.statement.readOperations().acquireExclusive(ResourceTypes.RELATIONSHIP, obj) + transactionalContext.kernelTransaction.locks().acquireExclusiveRelationshipLock(obj) override def exists(id: Long): Boolean = reads().relationshipExists(id) } @@ -922,11 +921,11 @@ sealed class TransactionBoundQueryContext(val transactionalContext: Transactiona } override def lockNodes(nodeIds: Long*) = - nodeIds.sorted.foreach(transactionalContext.statement.readOperations().acquireExclusive(ResourceTypes.NODE, _)) + nodeIds.sorted.foreach(transactionalContext.kernelTransaction.locks().acquireExclusiveNodeLock(_)) override def lockRelationships(relIds: Long*) = relIds.sorted - .foreach(transactionalContext.statement.readOperations().acquireExclusive(ResourceTypes.RELATIONSHIP, _)) + .foreach(transactionalContext.kernelTransaction.locks().acquireExclusiveRelationshipLock(_)) override def singleShortestPath(left: Long, right: Long, depth: Int, expander: Expander, pathPredicate: KernelPredicate[Path], diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Locks.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Locks.java index 782374118cc2..d3370fe5dc92 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Locks.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Locks.java @@ -30,21 +30,29 @@ public interface Locks void acquireExclusiveExplicitIndexLock( long... ids ); + void acquireExclusiveLabelLock( long... ids ); + void releaseExclusiveNodeLock( long... ids ); void releaseExclusiveRelationshipLock( long... ids ); void releaseExclusiveExplicitIndexLock( long... ids ); + void releaseExclusiveLabelLock( long... ids ); + void acquireSharedNodeLock( long... ids ); void acquireSharedRelationshipLock( long... ids ); void acquireSharedExplicitIndexLock( long... ids ); + void acquireSharedLabelLock( long... ids ); + void releaseSharedNodeLock( long... ids ); void releaseSharedRelationshipLock( long... ids ); void releaseSharedExplicitIndexLock( long... ids ); + + void releaseSharedLabelLock( long... ids ); } 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 47ebef6e1ceb..ca730927ce9c 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 @@ -560,84 +560,112 @@ public boolean hasTxStateWithChanges() @Override public void acquireExclusiveNodeLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, ids ); + acquireExclusiveLock( ResourceTypes.NODE, ids ); ktx.assertOpen(); } @Override public void acquireExclusiveRelationshipLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, ids ); + acquireExclusiveLock( ResourceTypes.RELATIONSHIP, ids ); ktx.assertOpen(); } @Override public void acquireExclusiveExplicitIndexLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.EXPLICIT_INDEX, ids ); + acquireExclusiveLock( ResourceTypes.EXPLICIT_INDEX, ids ); + ktx.assertOpen(); + } + + @Override + public void acquireExclusiveLabelLock( long... ids ) + { + acquireExclusiveLock( ResourceTypes.LABEL, ids ); ktx.assertOpen(); } @Override public void releaseExclusiveNodeLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.NODE, ids ); + releaseExclusiveLock( ResourceTypes.NODE, ids ); ktx.assertOpen(); } @Override public void releaseExclusiveRelationshipLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.RELATIONSHIP, ids ); + releaseExclusiveLock( ResourceTypes.RELATIONSHIP, ids ); ktx.assertOpen(); } @Override public void releaseExclusiveExplicitIndexLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.EXPLICIT_INDEX, ids ); + releaseExclusiveLock( ResourceTypes.EXPLICIT_INDEX, ids ); + ktx.assertOpen(); + } + + @Override + public void releaseExclusiveLabelLock( long... ids ) + { + releaseExclusiveLock( ResourceTypes.LABEL, ids ); ktx.assertOpen(); } @Override public void acquireSharedNodeLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.NODE, ids ); + acquireSharedLock( ResourceTypes.NODE, ids ); ktx.assertOpen(); } @Override public void acquireSharedRelationshipLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, ids ); + acquireSharedLock( ResourceTypes.RELATIONSHIP, ids ); ktx.assertOpen(); } @Override public void acquireSharedExplicitIndexLock( long... ids ) { - ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.EXPLICIT_INDEX, ids ); + acquireSharedLock( ResourceTypes.EXPLICIT_INDEX, ids ); + ktx.assertOpen(); + } + + @Override + public void acquireSharedLabelLock( long... ids ) + { + acquireSharedLock( ResourceTypes.LABEL, ids ); ktx.assertOpen(); } @Override public void releaseSharedNodeLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.NODE, ids ); + releaseSharedLock( ResourceTypes.NODE, ids ); ktx.assertOpen(); } @Override public void releaseSharedRelationshipLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.RELATIONSHIP, ids ); + releaseSharedLock( ResourceTypes.RELATIONSHIP, ids ); ktx.assertOpen(); } @Override public void releaseSharedExplicitIndexLock( long... ids ) { - ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.EXPLICIT_INDEX, ids ); + releaseSharedLock( ResourceTypes.EXPLICIT_INDEX, ids ); + ktx.assertOpen(); + } + + @Override + public void releaseSharedLabelLock( long... ids ) + { + releaseSharedLock( ResourceTypes.LABEL, ids ); ktx.assertOpen(); } @@ -645,4 +673,25 @@ void sharedOptimisticLock( ResourceType resource, long resourceId ) { ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), resource, resourceId ); } + + private void acquireExclusiveLock( ResourceTypes types, long... ids ) + { + ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), types, ids ); + } + + private void releaseExclusiveLock( ResourceTypes types, long... ids ) + { + ktx.statementLocks().pessimistic().releaseExclusive( types, ids ); + } + + private void acquireSharedLock( ResourceTypes types, long... ids ) + { + ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), types, ids ); + } + + private void releaseSharedLock( ResourceTypes types, long... ids ) + { + ktx.statementLocks().pessimistic().releaseShared( types, ids ); + } + }