Skip to content

Commit

Permalink
Revert "Merge pull request #12 from davidegrohmann/3.3-parallel-node-…
Browse files Browse the repository at this point in the history
…scan"

This reverts commit 0157505, reversing
changes made to 9608c17.
  • Loading branch information
MishaDemianenko committed May 25, 2017
1 parent 682fbbf commit c60ea27
Show file tree
Hide file tree
Showing 26 changed files with 238 additions and 1,125 deletions.
Expand Up @@ -38,6 +38,7 @@
import org.neo4j.storageengine.api.txstate.PropertyContainerState; import org.neo4j.storageengine.api.txstate.PropertyContainerState;
import org.neo4j.storageengine.api.txstate.ReadableDiffSets; import org.neo4j.storageengine.api.txstate.ReadableDiffSets;


import static java.util.Collections.emptyIterator;
import static org.neo4j.collection.primitive.Primitive.intSet; import static org.neo4j.collection.primitive.Primitive.intSet;


public class NodeStateImpl extends PropertyContainerStateImpl implements NodeState public class NodeStateImpl extends PropertyContainerStateImpl implements NodeState
Expand Down Expand Up @@ -118,18 +119,6 @@ public void clear()
} }
} }


@Override
public PrimitiveIntSet augmentLabels( PrimitiveIntSet labels )
{
ReadableDiffSets<Integer> labelDiffSets = labelDiffSets();
if ( !labelDiffSets.isEmpty() )
{
labelDiffSets.getRemoved().forEach( labels::remove );
labelDiffSets.getAdded().forEach( labels::add );
}
return labels;
}

@Override @Override
public int augmentDegree( Direction direction, int degree ) public int augmentDegree( Direction direction, int degree )
{ {
Expand Down Expand Up @@ -254,7 +243,116 @@ final NodeStateImpl createValue( Long id, TxState state )
@Override @Override
final NodeState defaultValue() final NodeState defaultValue()
{ {
return NodeState.EMPTY; return DEFAULT;
} }

private static final NodeState DEFAULT = new NodeState()
{
@Override
public Iterator<StorageProperty> addedProperties()
{
return emptyIterator();
}

@Override
public Iterator<StorageProperty> changedProperties()
{
return emptyIterator();
}

@Override
public Iterator<Integer> removedProperties()
{
return emptyIterator();
}

@Override
public Iterator<StorageProperty> addedAndChangedProperties()
{
return emptyIterator();
}

@Override
public Iterator<StorageProperty> augmentProperties( Iterator<StorageProperty> iterator )
{
return iterator;
}

@Override
public void accept( PropertyContainerState.Visitor visitor ) throws ConstraintValidationException
{
}

@Override
public ReadableDiffSets<Integer> labelDiffSets()
{
return ReadableDiffSets.Empty.instance();
}

@Override
public int augmentDegree( Direction direction, int degree )
{
return degree;
}

@Override
public int augmentDegree( Direction direction, int degree, int typeId )
{
return degree;
}

@Override
public void accept( NodeState.Visitor visitor )
{
}

@Override
public PrimitiveIntSet relationshipTypes()
{
return Primitive.intSet();
}

@Override
public long getId()
{
throw new UnsupportedOperationException( "id not defined" );
}

@Override
public boolean hasChanges()
{
return false;
}

@Override
public StorageProperty getChangedProperty( int propertyKeyId )
{
return null;
}

@Override
public StorageProperty getAddedProperty( int propertyKeyId )
{
return null;
}

@Override
public boolean isPropertyRemoved( int propertyKeyId )
{
return false;
}

@Override
public PrimitiveLongIterator getAddedRelationships( Direction direction )
{
return null;
}

@Override
public PrimitiveLongIterator getAddedRelationships( Direction direction, int[] relTypes )
{
return null;
}
};
} }
} }
Expand Up @@ -642,6 +642,18 @@ public RelationshipState getRelationshipState( long id )
return RELATIONSHIP_STATE.get( this, id ); return RELATIONSHIP_STATE.get( this, id );
} }


@Override
public PrimitiveIntSet augmentLabels( PrimitiveIntSet labels, NodeState nodeState )
{
ReadableDiffSets<Integer> labelDiffSets = nodeState.labelDiffSets();
if ( !labelDiffSets.isEmpty() )
{
labelDiffSets.getRemoved().forEach( labels::remove );
labelDiffSets.getAdded().forEach( labels::add );
}
return labels;
}

@Override @Override
public ReadableDiffSets<Long> nodesWithLabelChanged( int labelId ) public ReadableDiffSets<Long> nodesWithLabelChanged( int labelId )
{ {
Expand Down
Expand Up @@ -19,71 +19,31 @@
*/ */
package org.neo4j.kernel.impl.api.store; package org.neo4j.kernel.impl.api.store;


import java.util.Iterator; import org.neo4j.kernel.api.StatementConstants;

import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.NodeStore;
import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;


public class AllNodeProgression implements NodeProgression public class AllNodeProgression implements NodeProgression
{ {
private final NodeStore nodeStore; private final AllIdIterator allIdIterator;
private final ReadableTransactionState state;

private long start;
private boolean done;


AllNodeProgression( NodeStore nodeStore, ReadableTransactionState state ) AllNodeProgression( NodeStore nodeStore )
{ {
this.nodeStore = nodeStore; allIdIterator = new AllIdIterator( nodeStore );
this.state = state;
this.start = nodeStore.getNumberOfReservedLowIds();
} }


@Override @Override
public boolean nextBatch( Batch batch ) public long nextId()
{ {
while ( true ) if ( allIdIterator.hasNext() )
{ {
if ( done ) return allIdIterator.next();
{
batch.nothing();
return false;
}

long highId = nodeStore.getHighestPossibleIdInUse();
if ( start <= highId )
{
batch.init( start, highId );
start = highId + 1;
return true;
}

done = true;
} }
return StatementConstants.NO_SUCH_NODE;
} }


@Override @Override
public Iterator<Long> addedNodes() public TransactionStateAccessMode mode()
{
return state == null ? null : state.addedAndRemovedNodes().getAdded().iterator();
}

@Override
public boolean fetchFromTxState( long id )
{
return false;
}

@Override
public boolean fetchFromDisk( long id )
{
return state == null || !state.nodeIsDeletedInThisTx( id );
}

@Override
public NodeState nodeState( long id )
{ {
return state == null ? NodeState.EMPTY : state.getNodeState( id ); return TransactionStateAccessMode.APPEND;
} }
} }
Expand Up @@ -35,23 +35,26 @@
import org.neo4j.kernel.impl.util.IoPrimitiveUtils; import org.neo4j.kernel.impl.util.IoPrimitiveUtils;
import org.neo4j.storageengine.api.NodeItem; import org.neo4j.storageengine.api.NodeItem;
import org.neo4j.storageengine.api.txstate.NodeState; import org.neo4j.storageengine.api.txstate.NodeState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState;


import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet; import static org.neo4j.collection.primitive.PrimitiveIntCollections.asSet;
import static org.neo4j.kernel.impl.api.store.TransactionStateAccessMode.APPEND;
import static org.neo4j.kernel.impl.api.store.TransactionStateAccessMode.FETCH;
import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK; import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK;
import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK_SERVICE; import static org.neo4j.kernel.impl.locking.LockService.NO_LOCK_SERVICE;
import static org.neo4j.kernel.impl.store.record.RecordLoad.CHECK; import static org.neo4j.kernel.impl.store.record.RecordLoad.CHECK;
import static org.neo4j.kernel.impl.util.IoPrimitiveUtils.safeCastLongToInt; import static org.neo4j.kernel.impl.util.IoPrimitiveUtils.safeCastLongToInt;


public class NodeCursor implements NodeItem, Cursor<NodeItem>, Disposable public class NodeCursor implements NodeItem, Cursor<NodeItem>, Disposable
{ {
private final NodeProgression.Batch batch = new NodeProgression.Batch();
private final NodeRecord nodeRecord; private final NodeRecord nodeRecord;
private final Consumer<NodeCursor> instanceCache; private final Consumer<NodeCursor> instanceCache;
private final NodeStore nodeStore; private final NodeStore nodeStore;
private final LockService lockService; private final LockService lockService;
private final PageCursor pageCursor; private final PageCursor pageCursor;


private NodeProgression progression; private NodeProgression progression;
private ReadableTransactionState state;
private boolean fetched; private boolean fetched;
private long[] labels; private long[] labels;
private Iterator<Long> added; private Iterator<Long> added;
Expand All @@ -65,10 +68,13 @@ public class NodeCursor implements NodeItem, Cursor<NodeItem>, Disposable
this.lockService = lockService; this.lockService = lockService;
} }


public Cursor<NodeItem> init( NodeProgression progression ) public Cursor<NodeItem> init( NodeProgression progression, ReadableTransactionState state )
{ {
this.progression = progression; this.progression = progression;
this.added = progression.addedNodes(); this.state = state;
this.added = state != null && progression.mode() == APPEND
? state.addedAndRemovedNodes().getAdded().iterator()
: null;
return this; return this;
} }


Expand All @@ -81,16 +87,18 @@ public boolean next()
private boolean fetchNext() private boolean fetchNext()
{ {
labels = null; labels = null;
while ( progression != null && (batch.hasNext() || progression.nextBatch( batch ) ) ) long id;
while ( progression != null && (id = progression.nextId()) >= 0 )
{ {
long id = batch.next();
if ( progression.fetchFromTxState( id ) ) if ( state != null && progression.mode() == FETCH && state.nodeIsAddedInThisTx( id ) )
{ {
recordFromTxState( id ); recordFromTxState( id );
return true; return true;
} }


if ( progression.fetchFromDisk( id ) && nodeStore.readRecord( id, nodeRecord, CHECK, pageCursor ).inUse() ) if ( (state == null || !state.nodeIsDeletedInThisTx( id )) &&
nodeStore.readRecord( id, nodeRecord, CHECK, pageCursor ).inUse() )
{ {
return true; return true;
} }
Expand All @@ -117,8 +125,8 @@ public void close()
fetched = false; fetched = false;
labels = null; labels = null;
added = null; added = null;
state = null;
progression = null; progression = null;
batch.nothing();
instanceCache.accept( this ); instanceCache.accept( this );
} }


Expand All @@ -143,19 +151,19 @@ public NodeItem get()
public PrimitiveIntSet labels() public PrimitiveIntSet labels()
{ {
PrimitiveIntSet labels = asSet( loadedLabels(), IoPrimitiveUtils::safeCastLongToInt ); PrimitiveIntSet labels = asSet( loadedLabels(), IoPrimitiveUtils::safeCastLongToInt );
return progression.nodeState( id() ).augmentLabels( labels ); return state != null ? state.augmentLabels( labels, state.getNodeState( id() ) ) : labels;
} }


@Override @Override
public boolean hasLabel( int labelId ) public boolean hasLabel( int labelId )
{ {
NodeState nodeState = progression.nodeState( id() ); NodeState nodeState = state == null ? null : state.getNodeState( id() );
if ( nodeState.labelDiffSets().getRemoved().contains( labelId ) ) if ( state != null && nodeState.labelDiffSets().getRemoved().contains( labelId ) )
{ {
return false; return false;
} }


if ( nodeState.labelDiffSets().getAdded().contains( labelId ) ) if ( state != null && nodeState.labelDiffSets().getAdded().contains( labelId ) )
{ {
return true; return true;
} }
Expand Down Expand Up @@ -213,7 +221,7 @@ public long nextPropertyId()
@Override @Override
public Lock lock() public Lock lock()
{ {
return progression.fetchFromTxState( id() ) ? NO_LOCK : acquireLock(); return state != null && state.nodeIsAddedInThisTx( id() ) ? NO_LOCK : acquireLock();
} }


private Lock acquireLock() private Lock acquireLock()
Expand Down

0 comments on commit c60ea27

Please sign in to comment.