You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2016/06/15 10:33:06 UTC

svn commit: r1748542 - in /jackrabbit/oak/trunk: oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/ oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/ oak-run/src/main/java/org/apache/jackrabbit/oak/run/ oak-segment-tar/src/main/java/or...

Author: mduerig
Date: Wed Jun 15 10:33:05 2016
New Revision: 1748542

URL: http://svn.apache.org/viewvc?rev=1748542&view=rev
Log:
OAK-4472: Decouple SegmentReader from Revisions
Replace SegmentReader.getHeadState() with SegmentReader.getHeadState(Revisions)

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/SegmentTarCheckpoints.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/SegmentTarExplorerBackend.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/SegmentTarUtils.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackupRestore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentGraph.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/RevisionHistory.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarRevisionsTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/SegmentTarCheckpoints.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/SegmentTarCheckpoints.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/SegmentTarCheckpoints.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/checkpoint/SegmentTarCheckpoints.java Wed Jun 15 10:33:05 2016
@@ -46,7 +46,7 @@ class SegmentTarCheckpoints extends Chec
     @Override
     public List<CP> list() {
         List<CP> list = Lists.newArrayList();
-        NodeState ns = store.getReader().readHeadState().getChildNode("checkpoints");
+        NodeState ns = store.getHead().getChildNode("checkpoints");
         for (ChildNodeEntry cne : ns.getChildNodeEntries()) {
             NodeState cneNs = cne.getNodeState();
             list.add(new CP(cne.getName(),
@@ -57,7 +57,7 @@ class SegmentTarCheckpoints extends Chec
 
     @Override
     public long removeAll() {
-        SegmentNodeState head = store.getReader().readHeadState();
+        SegmentNodeState head = store.getHead();
         NodeBuilder builder = head.builder();
 
         NodeBuilder cps = builder.getChildNode("checkpoints");
@@ -72,7 +72,7 @@ class SegmentTarCheckpoints extends Chec
 
     @Override
     public long removeUnreferenced() {
-        SegmentNodeState head = store.getReader().readHeadState();
+        SegmentNodeState head = store.getHead();
 
         String ref = getReferenceCheckpoint(head.getChildNode("root"));
 
@@ -96,7 +96,7 @@ class SegmentTarCheckpoints extends Chec
 
     @Override
     public int remove(String cp) {
-        SegmentNodeState head = store.getReader().readHeadState();
+        SegmentNodeState head = store.getHead();
         NodeBuilder builder = head.builder();
 
         NodeBuilder cpn = builder.getChildNode("checkpoints")

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/SegmentTarExplorerBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/SegmentTarExplorerBackend.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/SegmentTarExplorerBackend.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/SegmentTarExplorerBackend.java Wed Jun 15 10:33:05 2016
@@ -170,7 +170,7 @@ class SegmentTarExplorerBackend implemen
 
     @Override
     public NodeState getHead() {
-        return store.getReader().readHeadState();
+        return store.getHead();
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/SegmentTarUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/SegmentTarUtils.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/SegmentTarUtils.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/SegmentTarUtils.java Wed Jun 15 10:33:05 2016
@@ -128,7 +128,7 @@ final class SegmentTarUtils {
                 fs = openReadOnlyFileStore(source);
             }
             closer.register(fs);
-            FileStoreBackup.backup(fs.getReader(), target);
+            FileStoreBackup.backup(fs.getReader(), fs.getRevisions(), target);
         } catch (Throwable e) {
             throw closer.rethrow(e);
         } finally {
@@ -485,7 +485,7 @@ final class SegmentTarUtils {
             if (hasrefs) {
                 System.out.println("SegmentNodeState references to " + f);
                 List<String> paths = new ArrayList<String>();
-                filterNodeStates(uuids, paths, store.getReader().readHeadState(), "/");
+                filterNodeStates(uuids, paths, store.getHead(), "/");
                 for (String p : paths) {
                     System.out.println("  " + p);
                 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java Wed Jun 15 10:33:05 2016
@@ -29,6 +29,7 @@ import javax.annotation.Nonnull;
 import com.google.common.base.Stopwatch;
 import com.google.common.base.Suppliers;
 import org.apache.jackrabbit.oak.segment.Compactor;
+import org.apache.jackrabbit.oak.segment.Revisions;
 import org.apache.jackrabbit.oak.segment.SegmentBufferWriter;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
@@ -50,6 +51,7 @@ public class FileStoreBackup {
             .getBoolean("oak.backup.UseFakeBlobStore");
 
     public static void backup(@Nonnull SegmentReader reader,
+                              @Nonnull Revisions revisions,
                               @Nonnull File destination)
             throws IOException {
         Stopwatch watch = Stopwatch.createStarted();
@@ -63,7 +65,7 @@ public class FileStoreBackup {
         }
         builder.withGCOptions(gcOptions);
         FileStore backup = builder.build();
-        SegmentNodeState current = reader.readHeadState();
+        SegmentNodeState current = reader.readHeadState(revisions);
         try {
             int gen = 0;
             gen = current.getRecordId().getSegment().getGcGeneration();
@@ -76,7 +78,7 @@ public class FileStoreBackup {
                     backup.getBlobStore(), Suppliers.ofInstance(false),
                     gcOptions);
             compactor.setContentEqualityCheck(true);
-            SegmentNodeState head = backup.getReader().readHeadState();
+            SegmentNodeState head = backup.getHead();
             SegmentNodeState after = compactor.compact(head, current, head);
             if (after != null) {
                 backup.getRevisions().setHead(head.getRecordId(),

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackupRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackupRestore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackupRestore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackupRestore.java Wed Jun 15 10:33:05 2016
@@ -80,7 +80,7 @@ public class FileStoreBackupRestore impl
                 @Override
                 public String call() throws Exception {
                     long t0 = nanoTime();
-                    FileStoreBackup.backup(reader, file);
+                    FileStoreBackup.backup(reader, revisions, file);
                     return "Backup completed in " + formatTime(nanoTime() - t0);
                 }
             });

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java Wed Jun 15 10:33:05 2016
@@ -57,9 +57,9 @@ public class FileStoreRestore {
         Stopwatch watch = Stopwatch.createStarted();
 
         FileStore store = fileStoreBuilder(destination).build();
-        SegmentNodeState current = store.getReader().readHeadState();
+        SegmentNodeState current = store.getHead();
         try {
-            SegmentNodeState head = restore.getReader().readHeadState();
+            SegmentNodeState head = restore.getHead();
             int gen = head.getRecordId().getSegment().getGcGeneration();
             SegmentBufferWriter bufferWriter = new SegmentBufferWriter(store,
                     store.getTracker(), store.getReader(), "r", gen);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CachingSegmentReader.java Wed Jun 15 10:33:05 2016
@@ -47,9 +47,6 @@ public class CachingSegmentReader implem
     @Nonnull
     private final Supplier<SegmentWriter> writer;
 
-    @Nonnull
-    private final Revisions revisions;
-
     @CheckForNull
     private final BlobStore blobStore;
 
@@ -64,18 +61,15 @@ public class CachingSegmentReader implem
      * @param writer          A {@code Supplier} for a the {@code SegmentWriter} used by the segment
      *                        builders returned from {@link NodeState#builder()} to write ahead changes.
      *                        {@code writer.get()} must not return {@code null}.
-     * @param revisions       {@code Revisions} instance of the underlying {@link SegmentStore}.
      * @param blobStore       {@code BlobStore} instance of the underlying {@link SegmentStore}, or
      *                        {@code null} if none.
      * @param stringCacheMB   the size of the string cache in MBs or {@code 0} for no cache.
      */
     public CachingSegmentReader(
             @Nonnull Supplier<SegmentWriter> writer,
-            @Nonnull Revisions revisions,
             @Nullable BlobStore blobStore,
             long stringCacheMB) {
         this.writer = checkNotNull(writer);
-        this.revisions = checkNotNull(revisions);
         this.blobStore = blobStore;
         stringCache = new StringCache(getLong(STRING_CACHE_MB, stringCacheMB) * 1024 * 1024);
     }
@@ -130,7 +124,7 @@ public class CachingSegmentReader implem
 
     @Nonnull
     @Override
-    public SegmentNodeState readHeadState() {
+    public SegmentNodeState readHeadState(@Nonnull Revisions revisions) {
         return readNode(revisions.getHead());
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentGraph.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentGraph.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentGraph.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentGraph.java Wed Jun 15 10:33:05 2016
@@ -160,7 +160,7 @@ public final class SegmentGraph {
         checkNotNull(epoch);
         PrintWriter writer = new PrintWriter(checkNotNull(out));
         try {
-            SegmentNodeState root = checkNotNull(fileStore).getReader().readHeadState();
+            SegmentNodeState root = checkNotNull(fileStore).getHead();
             Predicate<UUID> filter = pattern == null
                 ? Predicates.<UUID>alwaysTrue()
                 : createRegExpFilter(pattern, fileStore);
@@ -232,7 +232,7 @@ public final class SegmentGraph {
     public static Graph<UUID> parseSegmentGraph(
             @Nonnull ReadOnlyStore fileStore,
             @Nonnull Predicate<UUID> filter) throws IOException {
-        SegmentNodeState root = checkNotNull(fileStore).getReader().readHeadState();
+        SegmentNodeState root = checkNotNull(fileStore).getHead();
         HashSet<UUID> roots = newHashSet(root.getRecordId().asUUID());
         return parseSegmentGraph(fileStore, roots, filter, Functions.<UUID>identity());
     }
@@ -285,7 +285,7 @@ public final class SegmentGraph {
     @Nonnull
     public static Graph<String> parseGCGraph(@Nonnull final ReadOnlyStore fileStore)
             throws IOException {
-        SegmentNodeState root = checkNotNull(fileStore).getReader().readHeadState();
+        SegmentNodeState root = checkNotNull(fileStore).getHead();
         HashSet<UUID> roots = newHashSet(root.getRecordId().asUUID());
         return parseSegmentGraph(fileStore, roots, Predicates.<UUID>alwaysTrue(), new Function<UUID, String>() {
             @Override @Nullable

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java Wed Jun 15 10:33:05 2016
@@ -187,7 +187,7 @@ public class SegmentNodeStore implements
         this.reader = builder.reader;
         this.writer = builder.writer;
         this.blobStore = builder.blobStore;
-        this.head = new AtomicReference<SegmentNodeState>(reader.readHeadState());
+        this.head = new AtomicReference<SegmentNodeState>(reader.readHeadState(revisions));
         this.changeDispatcher = new ChangeDispatcher(getRoot());
     }
 
@@ -247,7 +247,7 @@ public class SegmentNodeStore implements
      * permit from the {@link #commitSemaphore}.
      */
     private void refreshHead() {
-        SegmentNodeState state = reader.readHeadState();
+        SegmentNodeState state = reader.readHeadState(revisions);
         if (!state.getRecordId().equals(head.get().getRecordId())) {
             head.set(state);
             changeDispatcher.contentChanged(state.getChildNode(ROOT), null);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentReader.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentReader.java Wed Jun 15 10:33:05 2016
@@ -63,11 +63,12 @@ public interface SegmentReader {
     SegmentNodeState readNode(@Nonnull RecordId id);
 
     /**
-     * Read the current head state
+     * Read the current head state based on the head of {@code revisions}
+     * @param revisions
      * @throws SegmentNotFoundException  see class comment for exception semantics
      */
     @Nonnull
-    SegmentNodeState readHeadState();
+    SegmentNodeState readHeadState(@Nonnull Revisions revisions);
 
     /**
      * Read the property identified by {@code id} and {@code template}

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Wed Jun 15 10:33:05 2016
@@ -254,11 +254,11 @@ public class FileStore implements Segmen
         // FIXME OAK-4451: Implement a proper template cache: inject caches
         // from the outside so we can get rid of the cache stat accessors
         if (builder.getCacheSize() < 0) {
-            this.segmentReader = new CachingSegmentReader(getWriter, revisions, blobStore, 0);
+            this.segmentReader = new CachingSegmentReader(getWriter, blobStore, 0);
         } else if (builder.getCacheSize() > 0) {
-            this.segmentReader = new CachingSegmentReader(getWriter, revisions, blobStore, (long) builder.getCacheSize());
+            this.segmentReader = new CachingSegmentReader(getWriter, blobStore, (long) builder.getCacheSize());
         } else {
-            this.segmentReader = new CachingSegmentReader(getWriter, revisions, blobStore, (long) DEFAULT_STRING_CACHE_MB);
+            this.segmentReader = new CachingSegmentReader(getWriter, blobStore, (long) DEFAULT_STRING_CACHE_MB);
         }
 
         Supplier<Integer> getGeneration = new Supplier<Integer>() {
@@ -608,7 +608,7 @@ public class FileStore implements Segmen
      * @return compaction gain estimate
      */
     CompactionGainEstimate estimateCompactionGain(Supplier<Boolean> stop) {
-        CompactionGainEstimate estimate = new CompactionGainEstimate(segmentReader.readHeadState(), count(), stop);
+        CompactionGainEstimate estimate = new CompactionGainEstimate(getHead(), count(), stop);
         fileStoreLock.readLock().lock();
         try {
             for (TarReader reader : readers) {
@@ -878,7 +878,7 @@ public class FileStore implements Segmen
         gcListener.info("TarMK GC #{}: compaction started, gc options={}", GC_COUNT, gcOptions);
         Stopwatch watch = Stopwatch.createStarted();
 
-        SegmentNodeState before = segmentReader.readHeadState();
+        SegmentNodeState before = getHead();
         long existing = before.getChildNode(SegmentNodeStore.CHECKPOINTS)
                 .getChildNodeCount(Long.MAX_VALUE);
         if (existing > 1) {
@@ -914,7 +914,7 @@ public class FileStore implements Segmen
                 gcListener.info("TarMK GC #{}: compaction detected concurrent commits while compacting. " +
                     "Compacting these commits. Cycle {} of {}",
                     GC_COUNT, cycles, gcOptions.getRetryCount());
-                SegmentNodeState head = segmentReader.readHeadState();
+                SegmentNodeState head = getHead();
                 after = compact(bufferWriter, head, cancel);
                 if (after == null) {
                     gcListener.info("TarMK GC #{}: compaction cancelled.", GC_COUNT);
@@ -1058,6 +1058,19 @@ public class FileStore implements Segmen
         return revisions;
     }
 
+    /**
+     * Convenience method for accessing the root node for the current head.
+     * This is equivalent to
+     * <pre>
+     * fileStore.getReader().readHeadState(fileStore.getRevisions())
+     * </pre>
+     * @return the current head node state
+     */
+    @Nonnull
+    public SegmentNodeState getHead() {
+        return segmentReader.readHeadState(revisions);
+    }
+
     @Override
     public void close() {
         // Flag the store as shutting / shut down

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/RevisionHistory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/RevisionHistory.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/RevisionHistory.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/RevisionHistory.java Wed Jun 15 10:33:05 2016
@@ -83,7 +83,7 @@ public class RevisionHistory {
                 @Nullable @Override
                 public HistoryElement apply(String revision) {
                     store.setRevision(revision);
-                    NodeState node = getNode(store.getReader().readHeadState(), path);
+                    NodeState node = getNode(store.getHead(), path);
                     return new HistoryElement(revision, node);
                 }
         });

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStore.java Wed Jun 15 10:33:05 2016
@@ -63,7 +63,7 @@ public class HttpStore implements Segmen
     };
     @Nonnull
     private final SegmentReader segmentReader = new CachingSegmentReader(
-            getWriter, revisions, null, DEFAULT_STRING_CACHE_MB);
+            getWriter, null, DEFAULT_STRING_CACHE_MB);
 
     private final SegmentIdFactory segmentIdFactory = new SegmentIdFactory() {
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/memory/MemoryStore.java Wed Jun 15 10:33:05 2016
@@ -79,7 +79,7 @@ public class MemoryStore implements Segm
                 return getWriter();
             }
         };
-        this.segmentReader = new CachingSegmentReader(getWriter, revisions, null, 16);
+        this.segmentReader = new CachingSegmentReader(getWriter, null, 16);
         this.segmentWriter = segmentWriterBuilder("sys").withWriterPool().build(this);
         revisions.bind(this);
         segmentWriter.flush();

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java Wed Jun 15 10:33:05 2016
@@ -67,17 +67,17 @@ public class FileStoreBackupTest {
         try {
             init(store);
             source.flush();
-            FileStoreBackup.backup(source.getReader(), destination);
+            FileStoreBackup.backup(source.getReader(), source.getRevisions(), destination);
             compare(source, destination);
 
             addTestContent(store);
             source.flush();
-            FileStoreBackup.backup(source.getReader(), destination);
+            FileStoreBackup.backup(source.getReader(), source.getRevisions(), destination);
             compare(source, destination);
 
             source.compact();
             FileStoreBackup.cleanup(source);
-            FileStoreBackup.backup(source.getReader(), destination);
+            FileStoreBackup.backup(source.getReader(), source.getRevisions(), destination);
             compare(source, destination);
         } finally {
             source.close();
@@ -91,7 +91,7 @@ public class FileStoreBackupTest {
                 .build();
         init(store);
         source.flush();
-        FileStoreBackup.backup(source.getReader(), destination);
+        FileStoreBackup.backup(source.getReader(), source.getRevisions(), destination);
         source.close();
 
         FileStoreRestore.restore(destination, src);
@@ -132,8 +132,7 @@ public class FileStoreBackupTest {
     private static void compare(FileStore store, File destination)
             throws IOException {
         FileStore backup = fileStoreBuilder(destination).build();
-        assertEquals(store.getReader().readHeadState(), backup.getReader()
-                .readHeadState());
+        assertEquals(store.getHead(), backup.getHead());
         backup.close();
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java Wed Jun 15 10:33:05 2016
@@ -611,7 +611,7 @@ public class CompactionAndCleanupIT {
     public void cleanupCyclicGraph() throws IOException, ExecutionException, InterruptedException {
         FileStore fileStore = fileStoreBuilder(getFileStoreFolder()).build();
         final SegmentWriter writer = fileStore.getWriter();
-        final SegmentNodeState oldHead = fileStore.getReader().readHeadState();
+        final SegmentNodeState oldHead = fileStore.getHead();
 
         final SegmentNodeState child = run(new Callable<SegmentNodeState>() {
             @Override
@@ -635,11 +635,11 @@ public class CompactionAndCleanupIT {
 
         fileStore = fileStoreBuilder(getFileStoreFolder()).build();
 
-        traverse(fileStore.getReader().readHeadState());
+        traverse(fileStore.getHead());
         fileStore.cleanup();
 
         // Traversal after cleanup might result in an SNFE
-        traverse(fileStore.getReader().readHeadState());
+        traverse(fileStore.getHead());
 
         fileStore.close();
     }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentGraphTest.java Wed Jun 15 10:33:05 2016
@@ -68,7 +68,7 @@ public class SegmentGraphTest {
     public void setup() throws IOException {
         FileStore store = fileStoreBuilder(getStoreFolder()).build();
         try {
-            SegmentNodeState root = store.getReader().readHeadState();
+            SegmentNodeState root = store.getHead();
             segments.add(getSegmentId(root));
 
             SegmentWriter w1 = segmentWriterBuilder("writer1").build(store);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java Wed Jun 15 10:33:05 2016
@@ -80,7 +80,7 @@ public class FileStoreIT {
         store.close();
 
         store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(memoryMapping).build();
-        SegmentNodeState base = store.getReader().readHeadState();
+        SegmentNodeState base = store.getHead();
         SegmentNodeBuilder builder = base.builder();
         byte[] data = new byte[10 * 1024 * 1024];
         new Random().nextBytes(data);
@@ -108,7 +108,7 @@ public class FileStoreIT {
         RandomAccessFile data0 = new RandomAccessFile(new File(getFileStoreFolder(), "data00000a.tar"), "r");
         long pos0 = data0.length();
 
-        SegmentNodeState base = store.getReader().readHeadState();
+        SegmentNodeState base = store.getHead();
         SegmentNodeBuilder builder = base.builder();
         builder.setProperty("step", "a");
         store.getRevisions().setHead(base.getRecordId(), builder.getNodeState().getRecordId());
@@ -116,14 +116,14 @@ public class FileStoreIT {
         long pos1 = data0.length();
         data0.close();
 
-        base = store.getReader().readHeadState();
+        base = store.getHead();
         builder = base.builder();
         builder.setProperty("step", "b");
         store.getRevisions().setHead(base.getRecordId(), builder.getNodeState().getRecordId());
         store.close();
 
         store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();
-        assertEquals("b", store.getReader().readHeadState().getString("step"));
+        assertEquals("b", store.getHead().getString("step"));
         store.close();
 
         RandomAccessFile file = new RandomAccessFile(
@@ -132,7 +132,7 @@ public class FileStoreIT {
         file.close();
 
         store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();
-        assertEquals("a", store.getReader().readHeadState().getString("step"));
+        assertEquals("a", store.getHead().getString("step"));
         store.close();
 
         file = new RandomAccessFile(
@@ -141,7 +141,7 @@ public class FileStoreIT {
         file.close();
 
         store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();
-        assertFalse(store.getReader().readHeadState().hasProperty("step"));
+        assertFalse(store.getHead().hasProperty("step"));
         store.close();
     }
 
@@ -207,7 +207,7 @@ public class FileStoreIT {
     public void nonBlockingROStore() throws IOException {
         FileStore store = fileStoreBuilder(getFileStoreFolder()).withMaxFileSize(1).withMemoryMapping(false).build();
         store.flush(); // first 1kB
-        SegmentNodeState base = store.getReader().readHeadState();
+        SegmentNodeState base = store.getHead();
         SegmentNodeBuilder builder = base.builder();
         builder.setProperty("step", "a");
         store.getRevisions().setHead(base.getRecordId(), builder.getNodeState().getRecordId());
@@ -229,7 +229,7 @@ public class FileStoreIT {
     public void setRevisionTest() throws IOException {
         try (FileStore store = fileStoreBuilder(getFileStoreFolder()).build()) {
             RecordId id1 = store.getRevisions().getHead();
-            SegmentNodeState base = store.getReader().readHeadState();
+            SegmentNodeState base = store.getHead();
             SegmentNodeBuilder builder = base.builder();
             builder.setProperty("step", "a");
             store.getRevisions().setHead(base.getRecordId(), builder.getNodeState().getRecordId());

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarRevisionsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarRevisionsTest.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarRevisionsTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarRevisionsTest.java Wed Jun 15 10:33:05 2016
@@ -144,7 +144,7 @@ public class TarRevisionsTest {
         SegmentNodeState rootB = addChild(reader.readNode(headId), "a");
         assertTrue(revisions.setHead(headId, rootA.getRecordId()));
         assertFalse(revisions.setHead(headId, rootB.getRecordId()));
-        assertEquals(rootA, reader.readHeadState());
+        assertEquals(rootA, reader.readHeadState(revisions));
     }
 
     @Test

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java?rev=1748542&r1=1748541&r2=1748542&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java Wed Jun 15 10:33:05 2016
@@ -74,7 +74,7 @@ public class SegmentTarFactory implement
 
             @Override
             public NodeState getSuperRoot() {
-                return fs.getReader().readHeadState();
+                return fs.getHead();
             }
         });
     }