Skip to content

Commit

Permalink
Use locks from interpreted runtime
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Mar 7, 2018
1 parent 340d58b commit 796ac91
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 22 deletions.
Expand Up @@ -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}
Expand Down Expand Up @@ -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:
Expand Down
Expand Up @@ -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}
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)
}
Expand Down Expand Up @@ -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],
Expand Down
Expand Up @@ -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 );
}
Expand Up @@ -560,89 +560,138 @@ 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();
}

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 );
}

}

0 comments on commit 796ac91

Please sign in to comment.