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
{
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
public StatementLocks locks()
public org.neo4j.internal.kernel.api.Locks locks()
{
return statementLocks;
return operations.locks();
}

public StatementLocks statementLocks()
{
return statementLocks;
}

@Override
Expand Down
Expand Up @@ -27,7 +27,7 @@
* Component used by {@link KernelStatement} to acquire {@link #pessimistic() pessimistic} and
* {@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.
Expand Down
Expand Up @@ -383,7 +383,7 @@ public Iterator<ConstraintDescriptor> constraintsGetAll()
return Iterators.map( constraintDescriptor ->
{
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;
}, constraints );
}
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.neo4j.internal.kernel.api.IndexOrder;
import org.neo4j.internal.kernel.api.IndexQuery;
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.SchemaRead;
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 ) )
{
autoIndexing.nodes().entityRemoved( this, node );
Expand Down Expand Up @@ -325,7 +326,7 @@ private void validateNoExistingNodeWithExactValues( IndexBackedConstraintDescrip
int labelId = indexDescriptor.schema().getLabelId();

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

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

Expand All @@ -511,7 +512,7 @@ public Value graphSetProperty( int propertyKey, Value value )
@Override
public Value graphRemoveProperty( int propertyKey )
{
ktx.locks().optimistic()
ktx.statementLocks().optimistic()
.acquireExclusive( ktx.lockTracer(), ResourceTypes.GRAPH_PROPS, ResourceTypes.graphPropertyResource() );
ktx.assertOpen();
Value existingValue = readGraphProperty( propertyKey );
Expand Down Expand Up @@ -713,26 +714,26 @@ private void acquireExclusiveNodeLock( long 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 )
{
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 )
{
ktx.locks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL, labelId );
ktx.statementLocks().optimistic().acquireShared( ktx.lockTracer(), ResourceTypes.LABEL, labelId );
}

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 )
Expand Down Expand Up @@ -779,6 +780,11 @@ public SchemaRead schemaRead()
return allStoreHolder;
}

public Locks locks()
{
return allStoreHolder;
}

public Read dataRead()
{
return allStoreHolder;
Expand Down
Expand Up @@ -46,6 +46,7 @@
import org.neo4j.kernel.api.txstate.TransactionState;
import org.neo4j.kernel.api.txstate.TxStateHolder;
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.record.DynamicRecord;
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.ExplicitIndexRead,
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;
final KernelTransactionImplementation ktx;
Expand Down Expand Up @@ -555,8 +557,92 @@ public boolean 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 )
{
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() );
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.isOpen() ).thenReturn( true );
when( transaction.lockTracer() ).thenReturn( LockTracer.NONE );
Expand Down

0 comments on commit 340d58b

Please sign in to comment.