diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java index 055e0b314e498..af2eb5e7db901 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java @@ -265,6 +265,8 @@ void relationship( RelationshipRecord record, long reference, PageCursor pageCur @Override void property( PropertyRecord record, long reference, PageCursor pageCursor ) { + //We need to load forcefully here since otherwise we can have inconsistent reads + //for properties across blocks, see org.neo4j.graphdb.ConsistentPropertyReadsIT properties.loadRecordByCursor( reference, record, RecordLoad.FORCE, pageCursor ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java index 5326ce21dc1a1..05daa3b9cff90 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/NodeCursor.java @@ -76,6 +76,7 @@ void single( long reference, Read read ) pageCursor = read.nodePage( reference ); } this.next = reference; + //This marks the cursor as a "single cursor" this.highMark = NO_ID; this.read = read; this.labelCursor = read.labelCursor(); @@ -229,14 +230,15 @@ else if ( hasChanges && txs.nodeIsDeletedInThisTx( next ) ) } if ( next > highMark ) { - if ( highMark == NO_ID ) + if ( isSingle() ) { - //we are using single + //we are a "single cursor" next = NO_ID; return inUse(); } else { + //we are a "scan cursor" //Check if there is a new high mark highMark = read.nodeHighMark(); if ( next > highMark ) @@ -288,4 +290,9 @@ private void reset() next = NO_ID; setId( NO_ID ); } + + private boolean isSingle() + { + return highMark == NO_ID; + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/StoreStatement.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/StoreStatement.java index 21ba7e241cbe0..9515564d36d39 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/StoreStatement.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/StoreStatement.java @@ -465,6 +465,8 @@ private static ByteBuffer readDynamic( AbstractDynamicStore store, long referenc DynamicRecord record = store.newRecord(); do { + //We need to load forcefully here since otherwise we can have inconsistent reads + //for properties across blocks, see org.neo4j.graphdb.ConsistentPropertyReadsIT store.getRecordByCursor( reference, record, RecordLoad.FORCE, page ); reference = record.getNextBlock(); byte[] data = record.getData();