diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultCursors.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultCursors.java index 34355226e5353..0ef72706aa7b4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultCursors.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultCursors.java @@ -20,155 +20,308 @@ package org.neo4j.kernel.impl.newapi; import org.neo4j.internal.kernel.api.CursorFactory; -import org.neo4j.kernel.impl.util.InstanceCache; public class DefaultCursors implements CursorFactory { - private final InstanceCache nodeCursor; - private final InstanceCache relationshipScanCursor; - private final InstanceCache relationshipTraversalCursor; - private final InstanceCache propertyCursor; - private final InstanceCache relationshipGroupCursor; - private final InstanceCache nodeValueIndexCursor; - private final InstanceCache nodeLabelIndexCursor; - private final InstanceCache nodeExplicitIndexCursor; - private final InstanceCache relationshipExplicitIndexCursor; - - public DefaultCursors() - { - nodeCursor = new InstanceCache() - { - @Override - protected DefaultNodeCursor create() - { - return new DefaultNodeCursor( this ); - } - }; - - relationshipScanCursor = new InstanceCache() - { - @Override - protected DefaultRelationshipScanCursor create() - { - return new DefaultRelationshipScanCursor( this ); - } - }; - - relationshipTraversalCursor = new InstanceCache() - { - @Override - protected DefaultRelationshipTraversalCursor create() - { - return new DefaultRelationshipTraversalCursor( new DefaultRelationshipGroupCursor( cursor -> {} ), this ); - } - }; - - propertyCursor = new InstanceCache() - { - @Override - protected DefaultPropertyCursor create() - { - return new DefaultPropertyCursor( this ); - } - }; - - relationshipGroupCursor = new InstanceCache() - { - @Override - protected DefaultRelationshipGroupCursor create() - { - return new DefaultRelationshipGroupCursor( this ); - } - }; - - nodeValueIndexCursor = new InstanceCache() - { - @Override - protected DefaultNodeValueIndexCursor create() - { - return new DefaultNodeValueIndexCursor( this ); - } - }; - - nodeLabelIndexCursor = new InstanceCache() - { - @Override - protected DefaultNodeLabelIndexCursor create() - { - return new DefaultNodeLabelIndexCursor( this ); - } - }; - - nodeExplicitIndexCursor = new InstanceCache() - { - @Override - protected DefaultNodeExplicitIndexCursor create() - { - return new DefaultNodeExplicitIndexCursor( this ); - } - }; - - relationshipExplicitIndexCursor = new InstanceCache() - { - @Override - protected DefaultRelationshipExplicitIndexCursor create() - { - return new DefaultRelationshipExplicitIndexCursor( this ); - } - }; - } + private DefaultNodeCursor nodeCursor; + private DefaultRelationshipScanCursor relationshipScanCursor; + private DefaultRelationshipTraversalCursor relationshipTraversalCursor; + private DefaultPropertyCursor propertyCursor; + private DefaultRelationshipGroupCursor relationshipGroupCursor; + private DefaultNodeValueIndexCursor nodeValueIndexCursor; + private DefaultNodeLabelIndexCursor nodeLabelIndexCursor; + private DefaultNodeExplicitIndexCursor nodeExplicitIndexCursor; + private DefaultRelationshipExplicitIndexCursor relationshipExplicitIndexCursor; @Override public DefaultNodeCursor allocateNodeCursor() { - return nodeCursor.get(); + if ( nodeCursor == null ) + { + return new DefaultNodeCursor( this ); + } + + try + { + return nodeCursor; + } + finally + { + nodeCursor = null; + } + } + + public void accept( DefaultNodeCursor cursor ) + { + if ( nodeCursor != null ) + { + nodeCursor.release(); + } + nodeCursor = cursor; } @Override public DefaultRelationshipScanCursor allocateRelationshipScanCursor() { - return relationshipScanCursor.get( ); + if ( relationshipScanCursor == null ) + { + return new DefaultRelationshipScanCursor( this ); + } + + try + { + return relationshipScanCursor; + } + finally + { + relationshipScanCursor = null; + } + } + + public void accept( DefaultRelationshipScanCursor cursor ) + { + if ( relationshipScanCursor != null ) + { + relationshipScanCursor.release(); + } + relationshipScanCursor = cursor; } @Override public DefaultRelationshipTraversalCursor allocateRelationshipTraversalCursor() { - return relationshipTraversalCursor.get(); + if ( relationshipTraversalCursor == null ) + { + return new DefaultRelationshipTraversalCursor( new DefaultRelationshipGroupCursor( null ), this ); + } + + try + { + return relationshipTraversalCursor; + } + finally + { + relationshipTraversalCursor = null; + } + } + + public void accept( DefaultRelationshipTraversalCursor cursor ) + { + if ( relationshipTraversalCursor != null ) + { + relationshipTraversalCursor.release(); + } + relationshipTraversalCursor = cursor; } @Override public DefaultPropertyCursor allocatePropertyCursor() { - return propertyCursor.get(); + if ( propertyCursor == null ) + { + return new DefaultPropertyCursor( this ); + } + + try + { + return propertyCursor; + } + finally + { + propertyCursor = null; + } + } + + public void accept( DefaultPropertyCursor cursor ) + { + if ( propertyCursor != null ) + { + propertyCursor.release(); + } + propertyCursor = cursor; } @Override public DefaultRelationshipGroupCursor allocateRelationshipGroupCursor() { - return relationshipGroupCursor.get(); + if ( relationshipGroupCursor == null ) + { + return new DefaultRelationshipGroupCursor( this ); + } + + try + { + return relationshipGroupCursor; + } + finally + { + relationshipGroupCursor = null; + } + } + + public void accept( DefaultRelationshipGroupCursor cursor ) + { + if ( relationshipGroupCursor != null ) + { + relationshipGroupCursor.release(); + } + relationshipGroupCursor = cursor; } @Override public DefaultNodeValueIndexCursor allocateNodeValueIndexCursor() { - return nodeValueIndexCursor.get(); + if ( nodeValueIndexCursor == null ) + { + return new DefaultNodeValueIndexCursor( this ); + } + + try + { + return nodeValueIndexCursor; + } + finally + { + nodeValueIndexCursor = null; + } + } + + public void accept( DefaultNodeValueIndexCursor cursor ) + { + if ( nodeValueIndexCursor != null ) + { + nodeValueIndexCursor.release(); + } + nodeValueIndexCursor = cursor; } @Override public DefaultNodeLabelIndexCursor allocateNodeLabelIndexCursor() { - return nodeLabelIndexCursor.get(); + if ( nodeLabelIndexCursor == null ) + { + return new DefaultNodeLabelIndexCursor( this ); + } + + try + { + return nodeLabelIndexCursor; + } + finally + { + nodeLabelIndexCursor = null; + } + } + + public void accept( DefaultNodeLabelIndexCursor cursor ) + { + if ( nodeLabelIndexCursor != null ) + { + nodeLabelIndexCursor.release(); + } + nodeLabelIndexCursor = cursor; } @Override public DefaultNodeExplicitIndexCursor allocateNodeExplicitIndexCursor() { - return nodeExplicitIndexCursor.get(); + if ( nodeExplicitIndexCursor == null ) + { + return new DefaultNodeExplicitIndexCursor( this ); + } + + try + { + return nodeExplicitIndexCursor; + } + finally + { + nodeExplicitIndexCursor = null; + } + } + + public void accept( DefaultNodeExplicitIndexCursor cursor ) + { + if ( nodeExplicitIndexCursor != null ) + { + nodeExplicitIndexCursor.release(); + } + nodeExplicitIndexCursor = cursor; } @Override public DefaultRelationshipExplicitIndexCursor allocateRelationshipExplicitIndexCursor() { - return relationshipExplicitIndexCursor.get(); + if ( relationshipExplicitIndexCursor == null ) + { + return new DefaultRelationshipExplicitIndexCursor( this ); + } + + try + { + return relationshipExplicitIndexCursor; + } + finally + { + relationshipExplicitIndexCursor = null; + } + } + + public void accept( DefaultRelationshipExplicitIndexCursor cursor ) + { + if ( relationshipExplicitIndexCursor != null ) + { + relationshipExplicitIndexCursor.release(); + } + relationshipExplicitIndexCursor = cursor; + } + + public void release() + { + if ( nodeCursor != null ) + { + nodeCursor.release(); + nodeCursor = null; + } + if ( relationshipScanCursor != null ) + { + relationshipScanCursor.release(); + relationshipScanCursor = null; + } + if ( relationshipTraversalCursor != null ) + { + relationshipTraversalCursor.release(); + relationshipTraversalCursor = null; + } + if ( propertyCursor != null ) + { + propertyCursor.release(); + propertyCursor = null; + } + if ( relationshipGroupCursor != null ) + { + relationshipGroupCursor.release(); + relationshipGroupCursor = null; + } + if ( nodeValueIndexCursor != null ) + { + nodeValueIndexCursor.release(); + nodeValueIndexCursor = null; + } + if ( nodeLabelIndexCursor != null ) + { + nodeLabelIndexCursor.release(); + nodeLabelIndexCursor = null; + } + if ( nodeExplicitIndexCursor != null ) + { + nodeExplicitIndexCursor.release(); + nodeExplicitIndexCursor = null; + } + if ( relationshipExplicitIndexCursor != null ) + { + relationshipExplicitIndexCursor.release(); + relationshipExplicitIndexCursor = null; + } } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java index 59149060ae424..af820ee79c858 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeCursor.java @@ -20,7 +20,6 @@ package org.neo4j.kernel.impl.newapi; import java.util.Set; -import java.util.function.Consumer; import org.neo4j.collection.primitive.Primitive; import org.neo4j.collection.primitive.PrimitiveIntSet; @@ -48,9 +47,9 @@ class DefaultNodeCursor extends NodeRecord implements NodeCursor private HasChanges hasChanges = HasChanges.MAYBE; private Set addedNodes; - private final Consumer pool; + private final DefaultCursors pool; - DefaultNodeCursor( Consumer pool ) + DefaultNodeCursor( DefaultCursors pool ) { super( NO_ID ); this.pool = pool; @@ -246,21 +245,12 @@ public boolean shouldRetry() @Override public void close() { - read = null; - hasChanges = HasChanges.MAYBE; - addedNodes = emptySet(); - reset(); - - if ( labelCursor != null ) + if ( !isClosed() ) { - labelCursor.close(); - labelCursor = null; - } - - if ( pageCursor != null ) - { - pageCursor.close(); - pageCursor = null; + read = null; + hasChanges = HasChanges.MAYBE; + addedNodes = emptySet(); + reset(); pool.accept( this ); } @@ -269,7 +259,7 @@ public void close() @Override public boolean isClosed() { - return pageCursor == null; + return read == null; } /** @@ -337,4 +327,19 @@ public String toString() return "NodeCursor[id=" + getId() + ", open state with: highMark=" + highMark + ", next=" + next + ", underlying record=" + super.toString() + " ]"; } } + + void release() + { + if ( labelCursor != null ) + { + labelCursor.close(); + labelCursor = null; + } + + if ( pageCursor != null ) + { + pageCursor.close(); + pageCursor = null; + } + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeExplicitIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeExplicitIndexCursor.java index ada4080fed1ed..0ed0e0ed719dc 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeExplicitIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeExplicitIndexCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.newapi; -import java.util.function.Consumer; - import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.storageengine.api.schema.IndexProgressor.ExplicitClient; @@ -34,9 +32,9 @@ class DefaultNodeExplicitIndexCursor extends IndexCursor pool; + private final DefaultCursors pool; - DefaultNodeExplicitIndexCursor( Consumer pool ) + DefaultNodeExplicitIndexCursor( DefaultCursors pool ) { this.pool = pool; node = NO_ID; @@ -126,4 +124,9 @@ public String toString() ", underlying record=" + super.toString() + " ]"; } } + + public void release() + { + // nothing to do + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeLabelIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeLabelIndexCursor.java index c790ac9dfed9e..886256fdd3c5a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeLabelIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeLabelIndexCursor.java @@ -21,7 +21,6 @@ import java.util.HashSet; import java.util.Set; -import java.util.function.Consumer; import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongIterator; @@ -44,9 +43,9 @@ class DefaultNodeLabelIndexCursor extends IndexCursor removed; - private final Consumer pool; + private final DefaultCursors pool; - DefaultNodeLabelIndexCursor( Consumer pool ) + DefaultNodeLabelIndexCursor( DefaultCursors pool ) { this.pool = pool; node = NO_ID; @@ -180,4 +179,9 @@ private boolean isRemoved( long reference ) { return removed != null && removed.contains( reference ); } + + public void release() + { + // nothing to do + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java index 7d5e90ab89fa4..e1fd6b05207a7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultNodeValueIndexCursor.java @@ -20,7 +20,6 @@ package org.neo4j.kernel.impl.newapi; import java.util.Arrays; -import java.util.function.Consumer; import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongIterator; @@ -52,9 +51,9 @@ final class DefaultNodeValueIndexCursor extends IndexCursor private PrimitiveLongIterator added = emptyIterator(); private PrimitiveLongSet removed = emptySet(); private boolean needsValues; - private final Consumer pool; + private final DefaultCursors pool; - DefaultNodeValueIndexCursor( Consumer pool ) + DefaultNodeValueIndexCursor( DefaultCursors pool ) { this.pool = pool; node = NO_ID; @@ -312,4 +311,9 @@ private PrimitiveLongSet removed( TransactionState txState, PrimitiveLongReadabl longSet.addAll( changes.getRemoved().iterator() ); return longSet; } + + public void release() + { + // nothing to do + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java index ab571f3bb2a15..16ddfb5df8481 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultPropertyCursor.java @@ -21,7 +21,6 @@ import java.nio.ByteBuffer; import java.util.Iterator; -import java.util.function.Consumer; import java.util.regex.Pattern; import org.neo4j.internal.kernel.api.PropertyCursor; @@ -66,9 +65,9 @@ public class DefaultPropertyCursor extends PropertyRecord implements PropertyCur private Iterator txStateChangedProperties; private StorageProperty txStateValue; private AssertOpen assertOpen; - private final Consumer pool; + private final DefaultCursors pool; - public DefaultPropertyCursor( Consumer pool ) + public DefaultPropertyCursor( DefaultCursors pool ) { super( NO_ID ); this.pool = pool; @@ -233,26 +232,13 @@ public boolean shouldRetry() @Override public void close() { - propertiesState = null; - txStateChangedProperties = null; - txStateValue = null; - read = null; - clear(); - - if ( stringPage != null ) + if ( !isClosed() ) { - stringPage.close(); - stringPage = null; - } - if ( arrayPage != null ) - { - arrayPage.close(); - arrayPage = null; - } - if ( page != null ) - { - page.close(); - page = null; + propertiesState = null; + txStateChangedProperties = null; + txStateValue = null; + read = null; + clear(); pool.accept( this ); } @@ -558,7 +544,7 @@ public boolean valueLessThanOrEqualTo( double number ) @Override public boolean isClosed() { - return page == null; + return read == null; } @Override @@ -574,4 +560,23 @@ public String toString() ", underlying record=" + super.toString() + " ]"; } } + + public void release() + { + if ( stringPage != null ) + { + stringPage.close(); + stringPage = null; + } + if ( arrayPage != null ) + { + arrayPage.close(); + arrayPage = null; + } + if ( page != null ) + { + page.close(); + page = null; + } + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipExplicitIndexCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipExplicitIndexCursor.java index bd50bd78b1da6..4d7c96e237877 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipExplicitIndexCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipExplicitIndexCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.newapi; -import java.util.function.Consumer; - import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor; import org.neo4j.internal.kernel.api.RelationshipScanCursor; @@ -36,9 +34,9 @@ class DefaultRelationshipExplicitIndexCursor extends IndexCursor pool; + private final DefaultCursors pool; - DefaultRelationshipExplicitIndexCursor( Consumer pool ) + DefaultRelationshipExplicitIndexCursor( DefaultCursors pool ) { this.pool = pool; } @@ -157,4 +155,9 @@ public String toString() " ,underlying record=" + super.toString() + " ]"; } } + + public void release() + { + // nothing to do + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipGroupCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipGroupCursor.java index f825d24be3208..19ccebcff0f31 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipGroupCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipGroupCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.newapi; -import java.util.function.Consumer; - import org.neo4j.collection.primitive.Primitive; import org.neo4j.collection.primitive.PrimitiveIntIterator; import org.neo4j.collection.primitive.PrimitiveIntObjectMap; @@ -46,7 +44,7 @@ class DefaultRelationshipGroupCursor extends RelationshipGroupRecord implements { private Read read; private final RelationshipRecord edge = new RelationshipRecord( NO_ID ); - private final Consumer pool; + private final DefaultCursors pool; private BufferedGroup bufferedGroup; private PageCursor page; @@ -55,7 +53,7 @@ class DefaultRelationshipGroupCursor extends RelationshipGroupRecord implements private final PrimitiveIntSet txTypes = Primitive.intSet(); private PrimitiveIntIterator txTypeIterator; - DefaultRelationshipGroupCursor( Consumer pool ) + DefaultRelationshipGroupCursor( DefaultCursors pool ) { super( NO_ID ); this.pool = pool; @@ -243,23 +241,17 @@ public boolean shouldRetry() @Override public void close() { - bufferedGroup = null; - read = null; - setId( NO_ID ); - clear(); - - if ( edgePage != null ) + if ( !isClosed() ) { - edgePage.close(); - edgePage = null; - } + bufferedGroup = null; + read = null; + setId( NO_ID ); + clear(); - if ( page != null ) - { - page.close(); - page = null; - - pool.accept( this ); + if ( pool != null ) + { + pool.accept( this ); + } } } @@ -410,7 +402,7 @@ public long loopsReference() @Override public boolean isClosed() { - return page == null && bufferedGroup == null; + return read == null && bufferedGroup == null; } @Override @@ -470,6 +462,21 @@ private long encodeRelationshipReference( long relationshipId ) return isBuffered() ? encodeForFiltering( relationshipId ) : encodeForTxStateFiltering( relationshipId ); } + public void release() + { + if ( edgePage != null ) + { + edgePage.close(); + edgePage = null; + } + + if ( page != null ) + { + page.close(); + page = null; + } + } + static class BufferedGroup { final int label; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java index 637f62dce4e51..7e1f6928ac5a7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipScanCursor.java @@ -20,7 +20,6 @@ package org.neo4j.kernel.impl.newapi; import java.util.Set; -import java.util.function.Consumer; import org.neo4j.internal.kernel.api.RelationshipScanCursor; import org.neo4j.io.pagecache.PageCursor; @@ -36,9 +35,9 @@ class DefaultRelationshipScanCursor extends RelationshipCursor implements Relati private PageCursor pageCursor; private Set addedRelationships; - private final Consumer pool; + private final DefaultCursors pool; - DefaultRelationshipScanCursor( Consumer pool ) + DefaultRelationshipScanCursor( DefaultCursors pool ) { this.pool = pool; } @@ -149,13 +148,10 @@ public boolean shouldRetry() @Override public void close() { - read = null; - reset(); - - if ( pageCursor != null ) + if ( !isClosed() ) { - pageCursor.close(); - pageCursor = null; + read = null; + reset(); pool.accept( this ); } @@ -169,7 +165,7 @@ private void reset() @Override public boolean isClosed() { - return pageCursor == null; + return read == null; } @Override @@ -198,4 +194,13 @@ protected void collectAddedTxStateSnapshot() addedRelationships = read.txState().addedAndRemovedRelationships().getAddedSnapshot(); } } + + public void release() + { + if ( pageCursor != null ) + { + pageCursor.close(); + pageCursor = null; + } + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java index e746d74ecf141..f3704f02f340d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/DefaultRelationshipTraversalCursor.java @@ -19,8 +19,6 @@ */ package org.neo4j.kernel.impl.newapi; -import java.util.function.Consumer; - import org.neo4j.collection.primitive.PrimitiveLongCollections; import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.internal.kernel.api.NodeCursor; @@ -119,7 +117,7 @@ private static FilterState fromRelationshipDirection( RelationshipDirection dire private Record buffer; private PageCursor pageCursor; private final DefaultRelationshipGroupCursor group; - private final Consumer pool; + private final DefaultCursors pool; private GroupState groupState; private FilterState filterState; private boolean filterStore; @@ -127,7 +125,7 @@ private static FilterState fromRelationshipDirection( RelationshipDirection dire private PrimitiveLongIterator addedRelationships; - DefaultRelationshipTraversalCursor( DefaultRelationshipGroupCursor group, Consumer pool ) + DefaultRelationshipTraversalCursor( DefaultRelationshipGroupCursor group, DefaultCursors pool ) { this.group = group; this.pool = pool; @@ -485,13 +483,11 @@ public boolean shouldRetry() @Override public void close() { - read = null; - reset(); - - if ( pageCursor != null ) + if ( !isClosed() ) { - pageCursor.close(); - pageCursor = null; + read = null; + buffer = null; + reset(); pool.accept( this ); } @@ -530,7 +526,18 @@ private boolean hasTxStateFilter() @Override public boolean isClosed() { - return pageCursor == null && !hasBufferedData(); + return read == null && !hasBufferedData(); + } + + public void release() + { + if ( pageCursor != null ) + { + pageCursor.close(); + pageCursor = null; + } + + group.release(); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java index c6ff7686fb65a..21b4200a2c8dd 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java @@ -656,6 +656,8 @@ public void release() propertyCursor.close(); propertyCursor = null; } + + cursors.release(); } public Token token()