diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Revisions.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Revisions.java index 02256a7a11..db3819a5d8 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Revisions.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Revisions.java @@ -47,6 +47,14 @@ public interface Revisions { */ @Nonnull RecordId getHead(); + + /** + * Returns the persisted to disk record id of the head state. + * The returned id is a valid id for a {@code SegmentNodeState}. + * @return id of the head state + */ + @Nonnull + RecordId getPersistedHead(); /** * Atomically set the record id of the current head state to the diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyRevisions.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyRevisions.java index 80967c4d43..4e6b513b47 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyRevisions.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyRevisions.java @@ -91,6 +91,12 @@ public class ReadOnlyRevisions implements Revisions, Closeable { checkBound(); return head.get(); } + + @Nonnull + @Override + public RecordId getPersistedHead() { + return getHead(); + } @Override public boolean setHead(@Nonnull RecordId expected, @Nonnull RecordId head, @Nonnull Option... options) { diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java index 6bebe3cde0..bb4c3a55a7 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java @@ -228,6 +228,13 @@ public class TarRevisions implements Revisions, Closeable { checkBound(); return head.get(); } + + @Nonnull + @Override + public RecordId getPersistedHead() { + checkBound(); + return persistedHead.get(); + } /** * This implementation blocks if a concurrent call to diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java index 47e63336df..70fe53a3ef 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStoreRevisions.java @@ -61,6 +61,12 @@ public class MemoryStoreRevisions implements Revisions { return head; } + @Nonnull + @Override + public RecordId getPersistedHead() { + return getHead(); + } + @Override public synchronized boolean setHead( @Nonnull RecordId expected, @Nonnull RecordId head, diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReader.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReader.java index a6f5a18506..a75787f5cd 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReader.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReader.java @@ -29,7 +29,7 @@ class DefaultStandbyHeadReader implements StandbyHeadReader { @Override public String readHeadRecordId() { - return store.getHead().getRecordId().toString(); + return store.getRevisions().getPersistedHead().toString(); } } diff --git oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java index 1362ed22e9..0d8eacc69d 100644 --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanIT.java @@ -157,6 +157,7 @@ public class MBeanIT extends TestBase { StandbyClientSync clientSync = newStandbyClientSync(clientFileStore.fileStore(), serverPort.getPort()) ) { serverSync.start(); + serverFileStore.fileStore().flush(); clientSync.start(); clientSync.run(); diff --git oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReaderTest.java oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReaderTest.java index b626f5bfb8..954a1e2c8e 100644 --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReaderTest.java +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/server/DefaultStandbyHeadReaderTest.java @@ -39,8 +39,9 @@ public class DefaultStandbyHeadReaderTest { @Test public void shouldReturnHeadSegmentId() throws Exception { try (FileStore store = newFileStore()) { + store.flush(); DefaultStandbyHeadReader reader = new DefaultStandbyHeadReader(store); - assertEquals(store.getHead().getRecordId().toString(), reader.readHeadRecordId()); + assertEquals(store.getRevisions().getPersistedHead().toString(), reader.readHeadRecordId()); } }