From dca922c3a152ecef442ab75be378774d00fa0456 Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Mon, 25 Sep 2017 17:21:15 +0200 Subject: [PATCH] Reuse pagecursor in relationship scan --- .../org/neo4j/kernel/impl/newapi/Read.java | 55 +++++++++++++++---- .../impl/newapi/RelationshipScanCursor.java | 14 ++++- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java index f4e6c5bd91a0e..a0938bd087952 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java @@ -33,6 +33,7 @@ import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.RecordCursor; import org.neo4j.kernel.impl.store.RecordStore; +import org.neo4j.kernel.impl.store.RelationshipStore; import org.neo4j.kernel.impl.store.record.AbstractBaseRecord; import org.neo4j.kernel.impl.store.record.DynamicRecord; import org.neo4j.kernel.impl.store.record.NodeRecord; @@ -52,11 +53,13 @@ public class Read implements org.neo4j.internal.kernel.api.Read { private final NeoStores stores; private NodeStore nodeStore; + private RelationshipStore relationshipStore; public Read( NeoStores stores ) { this.stores = stores; this.nodeStore = stores.getNodeStore(); + this.relationshipStore = stores.getRelationshipStore(); } @Override @@ -91,7 +94,7 @@ public void allNodesScan( org.neo4j.internal.kernel.api.NodeCursor cursor ) { try { - PageCursor pageCursor = stores.getNodeStore().openPageCursor( 0 ); + PageCursor pageCursor = nodeStore.openPageCursor( 0 ); ((NodeCursor) cursor).scan( pageCursor ); } catch ( IOException e ) @@ -112,7 +115,7 @@ public void singleNode( long reference, org.neo4j.internal.kernel.api.NodeCursor { try { - PageCursor pageCursor = stores.getNodeStore().openPageCursor( reference ); + PageCursor pageCursor = nodeStore.openPageCursor( reference ); ((NodeCursor) cursor).single( reference, pageCursor ); } catch ( IOException e ) @@ -124,13 +127,31 @@ public void singleNode( long reference, org.neo4j.internal.kernel.api.NodeCursor @Override public void singleRelationship( long reference, org.neo4j.internal.kernel.api.RelationshipScanCursor cursor ) { - ((RelationshipScanCursor) cursor).single( reference ); + try + { + PageCursor pageCursor = relationshipStore.openPageCursor( reference ); + ((RelationshipScanCursor) cursor).single( reference, pageCursor ); + } + catch ( IOException e ) + { + //TODO + throw new RuntimeException( e ); + } } @Override public void allRelationshipsScan( org.neo4j.internal.kernel.api.RelationshipScanCursor cursor ) { - ((RelationshipScanCursor) cursor).scan( -1/*include all labels*/ ); + try + { + PageCursor pageCursor = relationshipStore.openPageCursor( 0L ); + ((RelationshipScanCursor) cursor).scan( -1/*include all labels*/, pageCursor ); + } + catch ( IOException e ) + { + //TODO + throw new RuntimeException( e ); + } } @Override @@ -142,7 +163,16 @@ public Scan allRelationshi @Override public void relationshipLabelScan( int label, org.neo4j.internal.kernel.api.RelationshipScanCursor cursor ) { - ((RelationshipScanCursor) cursor).scan( label ); + try + { + PageCursor pageCursor = relationshipStore.openPageCursor( 0L ); + ((RelationshipScanCursor) cursor).scan( label, pageCursor ); + } + catch ( IOException e ) + { + //TODO + throw new RuntimeException( e ); + } } @Override @@ -246,7 +276,7 @@ public void futureRelationshipPropertyReferenceRead( long reference ) RecordCursor labelCursor() { - return newCursor( stores.getNodeStore().getDynamicLabelStore() ); + return newCursor( nodeStore.getDynamicLabelStore() ); } private static RecordCursor newCursor( RecordStore store ) @@ -259,9 +289,14 @@ void node( NodeRecord record, long reference, PageCursor pageCursor ) nodeStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor ); } - void relationship( RelationshipRecord record, long reference ) + void relationship( RelationshipRecord record, long reference, PageCursor pageCursor ) + { + relationshipStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor ); + } + + void relationship( RelationshipRecord record, long reference) { - stores.getRelationshipStore().getRecord( reference, record, RecordLoad.CHECK ); + relationshipStore.getRecord( reference, record, RecordLoad.CHECK ); } void property( PropertyRecord record, long reference ) @@ -276,12 +311,12 @@ void group( RelationshipGroupRecord record, long reference ) long nodeHighMark() { - return stores.getNodeStore().getHighestPossibleIdInUse(); + return nodeStore.getHighestPossibleIdInUse(); } long relationshipHighMark() { - return stores.getRelationshipStore().getHighestPossibleIdInUse(); + return relationshipStore.getHighestPossibleIdInUse(); } TextValue string( PropertyCursor cursor, long reference ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java index e1a733b4eb4f1..2c2e741cf3fda 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/RelationshipScanCursor.java @@ -26,29 +26,32 @@ class RelationshipScanCursor extends RelationshipCursor implements org.neo4j.int private int label; private long next; private long highMark; + private PageCursor pageCursor; RelationshipScanCursor( Read read ) { super( read ); } - void scan( int label ) + void scan( int label, PageCursor pageCursor ) { if ( getId() != NO_ID ) { close(); } + this.pageCursor = pageCursor; next = 0; this.label = label; highMark = read.relationshipHighMark(); } - void single( long reference ) + void single( long reference, PageCursor pageCursor ) { if ( getId() != NO_ID ) { close(); } + this.pageCursor = pageCursor; next = reference; label = -1; highMark = NO_ID; @@ -66,7 +69,7 @@ public boolean next() } do { - read.relationship( this, next++ ); + read.relationship( this, next++, pageCursor ); if ( next > highMark ) { if ( highMark == NO_ID ) @@ -100,6 +103,11 @@ public boolean shouldRetry() @Override public void close() { + if ( pageCursor != null ) + { + pageCursor.close(); + pageCursor = null; + } setId( next = NO_ID ); } }