Skip to content

Commit

Permalink
Implement public locking methods
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Mar 7, 2018
1 parent efaed60 commit 340d58b
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 16 deletions.
Expand Up @@ -24,4 +24,27 @@
*/ */
public interface Locks public interface Locks
{ {
void acquireExclusiveNodeLock( long... ids );

void acquireExclusiveRelationshipLock( long... ids );

void acquireExclusiveExplicitIndexLock( long... ids );

void releaseExclusiveNodeLock( long... ids );

void releaseExclusiveRelationshipLock( long... ids );

void releaseExclusiveExplicitIndexLock( long... ids );

void acquireSharedNodeLock( long... ids );

void acquireSharedRelationshipLock( long... ids );

void acquireSharedExplicitIndexLock( long... ids );

void releaseSharedNodeLock( long... ids );

void releaseSharedRelationshipLock( long... ids );

void releaseSharedExplicitIndexLock( long... ids );
} }
Expand Up @@ -791,9 +791,14 @@ public SchemaWrite schemaWrite()
} }


@Override @Override
public StatementLocks locks() public org.neo4j.internal.kernel.api.Locks locks()
{ {
return statementLocks; return operations.locks();
}

public StatementLocks statementLocks()
{
return statementLocks;
} }


@Override @Override
Expand Down
Expand Up @@ -27,7 +27,7 @@
* Component used by {@link KernelStatement} to acquire {@link #pessimistic() pessimistic} and * Component used by {@link KernelStatement} to acquire {@link #pessimistic() pessimistic} and
* {@link #optimistic() optimistic} locks. * {@link #optimistic() optimistic} locks.
*/ */
public interface StatementLocks extends AutoCloseable, org.neo4j.internal.kernel.api.Locks public interface StatementLocks extends AutoCloseable
{ {
/** /**
* Get {@link Locks.Client} responsible for pessimistic locks. Such locks will be grabbed right away. * Get {@link Locks.Client} responsible for pessimistic locks. Such locks will be grabbed right away.
Expand Down
Expand Up @@ -383,7 +383,7 @@ public Iterator<ConstraintDescriptor> constraintsGetAll()
return Iterators.map( constraintDescriptor -> return Iterators.map( constraintDescriptor ->
{ {
SchemaDescriptor schema = constraintDescriptor.schema(); SchemaDescriptor schema = constraintDescriptor.schema();
ktx.locks().pessimistic().acquireShared( ktx.lockTracer(), schema.keyType(), schema.keyId() ); ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), schema.keyType(), schema.keyId() );
return constraintDescriptor; return constraintDescriptor;
}, constraints ); }, constraints );
} }
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexOrder;
import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.Procedures; import org.neo4j.internal.kernel.api.Procedures;
import org.neo4j.internal.kernel.api.Locks;
import org.neo4j.internal.kernel.api.Read; import org.neo4j.internal.kernel.api.Read;
import org.neo4j.internal.kernel.api.SchemaRead; import org.neo4j.internal.kernel.api.SchemaRead;
import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.Token;
Expand Down Expand Up @@ -144,7 +145,7 @@ public boolean nodeDelete( long node ) throws AutoIndexingKernelException
} }
} }


ktx.locks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, node ); ktx.statementLocks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, node );
if ( allStoreHolder.nodeExistsInStore( node ) ) if ( allStoreHolder.nodeExistsInStore( node ) )
{ {
autoIndexing.nodes().entityRemoved( this, node ); autoIndexing.nodes().entityRemoved( this, node );
Expand Down Expand Up @@ -325,7 +326,7 @@ private void validateNoExistingNodeWithExactValues( IndexBackedConstraintDescrip
int labelId = indexDescriptor.schema().getLabelId(); int labelId = indexDescriptor.schema().getLabelId();


//Take a big fat lock, and check for existing node in index //Take a big fat lock, and check for existing node in index
ktx.locks().optimistic().acquireExclusive( ktx.statementLocks().optimistic().acquireExclusive(
ktx.lockTracer(), INDEX_ENTRY, ktx.lockTracer(), INDEX_ENTRY,
indexEntryResourceId( labelId, propertyValues ) indexEntryResourceId( labelId, propertyValues )
); );
Expand Down Expand Up @@ -383,7 +384,7 @@ public Value nodeSetProperty( long node, int propertyKey, Value value )
ktx.assertOpen(); ktx.assertOpen();


singleNode( node ); singleNode( node );
ktx.locks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL, ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL,
nodeCursor.labels().all() ); nodeCursor.labels().all() );
Iterator<ConstraintDescriptor> constraints = Iterators.filter( hasProperty( propertyKey ), Iterator<ConstraintDescriptor> constraints = Iterators.filter( hasProperty( propertyKey ),
allStoreHolder.constraintsGetAll() ); allStoreHolder.constraintsGetAll() );
Expand Down Expand Up @@ -496,7 +497,7 @@ public Value relationshipRemoveProperty( long relationship, int propertyKey )
@Override @Override
public Value graphSetProperty( int propertyKey, Value value ) public Value graphSetProperty( int propertyKey, Value value )
{ {
ktx.locks().optimistic() ktx.statementLocks().optimistic()
.acquireExclusive( ktx.lockTracer(), ResourceTypes.GRAPH_PROPS, ResourceTypes.graphPropertyResource() ); .acquireExclusive( ktx.lockTracer(), ResourceTypes.GRAPH_PROPS, ResourceTypes.graphPropertyResource() );
ktx.assertOpen(); ktx.assertOpen();


Expand All @@ -511,7 +512,7 @@ public Value graphSetProperty( int propertyKey, Value value )
@Override @Override
public Value graphRemoveProperty( int propertyKey ) public Value graphRemoveProperty( int propertyKey )
{ {
ktx.locks().optimistic() ktx.statementLocks().optimistic()
.acquireExclusive( ktx.lockTracer(), ResourceTypes.GRAPH_PROPS, ResourceTypes.graphPropertyResource() ); .acquireExclusive( ktx.lockTracer(), ResourceTypes.GRAPH_PROPS, ResourceTypes.graphPropertyResource() );
ktx.assertOpen(); ktx.assertOpen();
Value existingValue = readGraphProperty( propertyKey ); Value existingValue = readGraphProperty( propertyKey );
Expand Down Expand Up @@ -713,26 +714,26 @@ private void acquireExclusiveNodeLock( long node )
{ {
if ( !ktx.hasTxStateWithChanges() || !ktx.txState().nodeIsAddedInThisTx( node ) ) if ( !ktx.hasTxStateWithChanges() || !ktx.txState().nodeIsAddedInThisTx( node ) )
{ {
ktx.locks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, node ); ktx.statementLocks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, node );
} }
} }


private void acquireExclusiveRelationshipLock( long relationshipId ) private void acquireExclusiveRelationshipLock( long relationshipId )
{ {
if ( !ktx.hasTxStateWithChanges() || !ktx.txState().relationshipIsAddedInThisTx( relationshipId ) ) if ( !ktx.hasTxStateWithChanges() || !ktx.txState().relationshipIsAddedInThisTx( relationshipId ) )
{ {
ktx.locks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, relationshipId ); ktx.statementLocks().optimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, relationshipId );
} }
} }


private void acquireSharedLabelLock( int labelId ) private void acquireSharedLabelLock( int labelId )
{ {
ktx.locks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL, labelId ); ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL, labelId );
} }


private void sharedRelationshipTypeLock( long typeId ) private void sharedRelationshipTypeLock( long typeId )
{ {
ktx.locks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.RELATIONSHIP_TYPE, typeId ); ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.RELATIONSHIP_TYPE, typeId );
} }


private void lockRelationshipNodes( long startNodeId, long endNodeId ) private void lockRelationshipNodes( long startNodeId, long endNodeId )
Expand Down Expand Up @@ -779,6 +780,11 @@ public SchemaRead schemaRead()
return allStoreHolder; return allStoreHolder;
} }


public Locks locks()
{
return allStoreHolder;
}

public Read dataRead() public Read dataRead()
{ {
return allStoreHolder; return allStoreHolder;
Expand Down
Expand Up @@ -46,6 +46,7 @@
import org.neo4j.kernel.api.txstate.TransactionState; import org.neo4j.kernel.api.txstate.TransactionState;
import org.neo4j.kernel.api.txstate.TxStateHolder; import org.neo4j.kernel.api.txstate.TxStateHolder;
import org.neo4j.kernel.impl.api.KernelTransactionImplementation; import org.neo4j.kernel.impl.api.KernelTransactionImplementation;
import org.neo4j.kernel.impl.locking.ResourceTypes;
import org.neo4j.kernel.impl.store.RecordCursor; import org.neo4j.kernel.impl.store.RecordCursor;
import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord;
import org.neo4j.kernel.impl.store.record.NodeRecord; import org.neo4j.kernel.impl.store.record.NodeRecord;
Expand Down Expand Up @@ -73,7 +74,8 @@ abstract class Read implements TxStateHolder,
org.neo4j.internal.kernel.api.Read, org.neo4j.internal.kernel.api.Read,
org.neo4j.internal.kernel.api.ExplicitIndexRead, org.neo4j.internal.kernel.api.ExplicitIndexRead,
org.neo4j.internal.kernel.api.SchemaRead, org.neo4j.internal.kernel.api.SchemaRead,
org.neo4j.internal.kernel.api.Procedures org.neo4j.internal.kernel.api.Procedures,
org.neo4j.internal.kernel.api.Locks
{ {
private final DefaultCursors cursors; private final DefaultCursors cursors;
final KernelTransactionImplementation ktx; final KernelTransactionImplementation ktx;
Expand Down Expand Up @@ -555,8 +557,92 @@ public boolean hasTxStateWithChanges()
return ktx.hasTxStateWithChanges(); return ktx.hasTxStateWithChanges();
} }


@Override
public void acquireExclusiveNodeLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.NODE, ids );
ktx.assertOpen();
}

@Override
public void acquireExclusiveRelationshipLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, ids );
ktx.assertOpen();
}

@Override
public void acquireExclusiveExplicitIndexLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireExclusive( ktx.lockTracer(), ResourceTypes.EXPLICIT_INDEX, ids );
ktx.assertOpen();
}

@Override
public void releaseExclusiveNodeLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.NODE, ids );
ktx.assertOpen();
}

@Override
public void releaseExclusiveRelationshipLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.RELATIONSHIP, ids );
ktx.assertOpen();
}

@Override
public void releaseExclusiveExplicitIndexLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseExclusive( ResourceTypes.EXPLICIT_INDEX, ids );
ktx.assertOpen();
}

@Override
public void acquireSharedNodeLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.NODE, ids );
ktx.assertOpen();
}

@Override
public void acquireSharedRelationshipLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.RELATIONSHIP, ids );
ktx.assertOpen();
}

@Override
public void acquireSharedExplicitIndexLock( long... ids )
{
ktx.statementLocks().pessimistic().acquireShared( ktx.lockTracer(), ResourceTypes.EXPLICIT_INDEX, ids );
ktx.assertOpen();
}

@Override
public void releaseSharedNodeLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.NODE, ids );
ktx.assertOpen();
}

@Override
public void releaseSharedRelationshipLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.RELATIONSHIP, ids );
ktx.assertOpen();
}

@Override
public void releaseSharedExplicitIndexLock( long... ids )
{
ktx.statementLocks().pessimistic().releaseShared( ResourceTypes.EXPLICIT_INDEX, ids );
ktx.assertOpen();
}

void sharedOptimisticLock( ResourceType resource, long resourceId ) void sharedOptimisticLock( ResourceType resource, long resourceId )
{ {
ktx.locks().optimistic().acquireShared( ktx.lockTracer(), resource, resourceId ); ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), resource, resourceId );
} }
} }
Expand Up @@ -93,7 +93,7 @@ public void setUp() throws InvalidTransactionTypeKernelException
{ {
txState = Mockito.spy( new TxState() ); txState = Mockito.spy( new TxState() );
when( transaction.getReasonIfTerminated() ).thenReturn( Optional.empty() ); when( transaction.getReasonIfTerminated() ).thenReturn( Optional.empty() );
when( transaction.locks() ).thenReturn( new SimpleStatementLocks( locks ) ); when( transaction.statementLocks() ).thenReturn( new SimpleStatementLocks( locks ) );
when( transaction.dataWrite() ).thenReturn( write ); when( transaction.dataWrite() ).thenReturn( write );
when( transaction.isOpen() ).thenReturn( true ); when( transaction.isOpen() ).thenReturn( true );
when( transaction.lockTracer() ).thenReturn( LockTracer.NONE ); when( transaction.lockTracer() ).thenReturn( LockTracer.NONE );
Expand Down

0 comments on commit 340d58b

Please sign in to comment.