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 fr...@apache.org on 2016/06/07 11:38:13 UTC

svn commit: r1747196 - in /jackrabbit/oak/trunk: 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/org/apache/jackrabbit/oak/segment/ oak-segment-tar/src/main/ja...

Author: frm
Date: Tue Jun  7 11:38:13 2016
New Revision: 1747196

URL: http://svn.apache.org/viewvc?rev=1747196&view=rev
Log:
OAK-4102 - Break cyclic dependency of FileStore and SegmentTracker

Added:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java   (with props)
Modified:
    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/segment/RecordId.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.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/SegmentIdTable.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.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/TarReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.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/http/HttpStoreRevisions.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/segment/RecordTest.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/SegmentIdFactoryTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableBenchmark.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/TestUtils.java

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -175,7 +175,7 @@ class SegmentTarExplorerBackend implemen
 
     @Override
     public NodeState readNodeState(String recordId) {
-        return store.getReader().readNode(RecordId.fromString(store.getTracker(), recordId));
+        return store.getReader().readNode(RecordId.fromString(store, recordId));
     }
 
     @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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -309,12 +309,12 @@ final class SegmentTarUtils {
             if (tokens[0].equalsIgnoreCase("head")) {
                 idL = store.getRevisions().getHead();
             } else {
-                idL = fromString(store.getTracker(), tokens[0]);
+                idL = fromString(store, tokens[0]);
             }
             if (tokens[1].equalsIgnoreCase("head")) {
                 idR = store.getRevisions().getHead();
             } else {
-                idR = fromString(store.getTracker(), tokens[1]);
+                idR = fromString(store, tokens[1]);
             }
         } catch (IllegalArgumentException ex) {
             System.out.println("Error parsing revision interval '" + interval + "': " + ex.getMessage());
@@ -345,9 +345,9 @@ final class SegmentTarUtils {
                     return;
                 }
                 Iterator<String> revDiffsIt = revDiffs.iterator();
-                RecordId idLt = fromString(store.getTracker(), revDiffsIt.next());
+                RecordId idLt = fromString(store, revDiffsIt.next());
                 while (revDiffsIt.hasNext()) {
-                    RecordId idRt = fromString(store.getTracker(), revDiffsIt.next());
+                    RecordId idRt = fromString(store, revDiffsIt.next());
                     boolean good = diff(store, idLt, idRt, filter, pw);
                     idLt = idRt;
                     if (!good && !ignoreSNFEs) {
@@ -586,7 +586,7 @@ final class SegmentTarUtils {
                 System.err.println("Unknown argument: " + args[i]);
             } else if (matcher.group(1) != null) {
                 UUID uuid = UUID.fromString(matcher.group(1));
-                SegmentId id = store.getTracker().getSegmentId(
+                SegmentId id = store.newSegmentId(
                         uuid.getMostSignificantBits(),
                         uuid.getLeastSignificantBits());
                 System.out.println(id.getSegment());
@@ -594,10 +594,10 @@ final class SegmentTarUtils {
                 RecordId id1 = store.getRevisions().getHead();
                 RecordId id2 = null;
                 if (matcher.group(2) != null) {
-                    id1 = fromString(store.getTracker(),
+                    id1 = fromString(store,
                             matcher.group(3));
                     if (matcher.group(4) != null) {
-                        id2 = fromString(store.getTracker(),
+                        id2 = fromString(store,
                                 matcher.group(5));
                     }
                 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordId.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordId.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordId.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordId.java Tue Jun  7 11:38:13 2016
@@ -42,11 +42,11 @@ public final class RecordId implements C
 
     public static RecordId[] EMPTY_ARRAY = new RecordId[0];
 
-    public static RecordId fromString(SegmentTracker factory, String id) {
+    public static RecordId fromString(SegmentStore factory, String id) {
         Matcher matcher = PATTERN.matcher(id);
         if (matcher.matches()) {
             UUID uuid = UUID.fromString(matcher.group(1));
-            SegmentId segmentId = factory.getSegmentId(
+            SegmentId segmentId = factory.newSegmentId(
                     uuid.getMostSignificantBits(),
                     uuid.getLeastSignificantBits());
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java Tue Jun  7 11:38:13 2016
@@ -125,7 +125,7 @@ public class Segment {
     public static final int GC_GENERATION_OFFSET = 10;
 
     @Nonnull
-    private final SegmentTracker tracker;
+    private final SegmentStore store;
 
     @Nonnull
     private final SegmentReader reader;
@@ -189,11 +189,11 @@ public class Segment {
         return (address + boundary - 1) & ~(boundary - 1);
     }
 
-    public Segment(@Nonnull SegmentTracker tracker,
+    public Segment(@Nonnull SegmentStore store,
                    @Nonnull SegmentReader reader,
                    @Nonnull final SegmentId id,
                    @Nonnull final ByteBuffer data) {
-        this.tracker = checkNotNull(tracker);
+        this.store = checkNotNull(store);
         this.reader = checkNotNull(reader);
         this.id = checkNotNull(id);
 
@@ -237,13 +237,13 @@ public class Segment {
         }
     }
 
-    Segment(@Nonnull SegmentTracker tracker,
+    Segment(@Nonnull SegmentStore store,
             @Nonnull SegmentReader reader,
             @Nonnull byte[] buffer,
             @Nonnull String info) {
-        this.tracker = checkNotNull(tracker);
+        this.store = checkNotNull(store);
         this.reader = checkNotNull(reader);
-        this.id = tracker.newDataSegmentId();
+        this.id = store.newDataSegmentId();
         this.info = checkNotNull(info);
         if (DISABLE_TEMPLATE_CACHE) {
             templates = null;
@@ -370,7 +370,7 @@ public class Segment {
                     int refpos = data.position() + index * 16;
                     long msb = data.getLong(refpos);
                     long lsb = data.getLong(refpos + 8);
-                    refid = tracker.getSegmentId(msb, lsb);
+                    refid = store.newSegmentId(msb, lsb);
                     refids[index] = refid;
                 }
             }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java Tue Jun  7 11:38:13 2016
@@ -180,7 +180,7 @@ public class SegmentBufferWriter impleme
             ",\"sno\":" + tracker.getSegmentCount() +
             ",\"t\":" + currentTimeMillis() + "}";
         try {
-            segment = new Segment(tracker, reader, buffer, metaInfo);
+            segment = new Segment(store, reader, buffer, metaInfo);
             byte[] data = metaInfo.getBytes(UTF_8);
             RecordWriters.newValueWriter(data.length, data).write(this);
         } catch (IOException e) {

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -163,13 +163,13 @@ public final class SegmentGraph {
             SegmentNodeState root = checkNotNull(fileStore).getReader().readHeadState();
             Predicate<UUID> filter = pattern == null
                 ? Predicates.<UUID>alwaysTrue()
-                : createRegExpFilter(pattern, fileStore.getTracker());
+                : createRegExpFilter(pattern, fileStore);
             Graph<UUID> segmentGraph = parseSegmentGraph(fileStore, filter);
             Graph<UUID> headGraph = parseHeadGraph(fileStore.getReader(), root.getRecordId());
 
             writer.write("nodedef>name VARCHAR, label VARCHAR, type VARCHAR, wid VARCHAR, gc INT, t INT, size INT, head BOOLEAN\n");
             for (UUID segment : segmentGraph.vertices()) {
-                writeNode(segment, writer, headGraph.containsVertex(segment), epoch, fileStore.getTracker());
+                writeNode(segment, writer, headGraph.containsVertex(segment), epoch, fileStore);
             }
 
             writer.write("edgedef>node1 VARCHAR, node2 VARCHAR, head BOOLEAN\n");
@@ -192,20 +192,20 @@ public final class SegmentGraph {
      * Create a regular expression based inclusion filter for segment.
      *
      * @param pattern       regular expression specifying inclusion of nodes.
-     * @param tracker       the segment tracker of the store acting upon.
+     * @param store       the segment store acting upon.
      * @return
      */
     public static Predicate<UUID> createRegExpFilter(
             @Nonnull String pattern,
-            @Nonnull final SegmentTracker tracker) {
+            @Nonnull final SegmentStore store) {
         final Pattern regExp = compile(checkNotNull(pattern));
-        checkNotNull(tracker);
+        checkNotNull(store);
 
         return new Predicate<UUID>() {
             @Override
             public boolean apply(UUID segment) {
                 try {
-                    String info = getSegmentInfo(segment, tracker);
+                    String info = getSegmentInfo(segment, store);
                     if (info == null) {
                         info = "NULL";
                     }
@@ -290,7 +290,7 @@ public final class SegmentGraph {
         return parseSegmentGraph(fileStore, roots, Predicates.<UUID>alwaysTrue(), new Function<UUID, String>() {
             @Override @Nullable
             public String apply(UUID segmentId) {
-                Map<String, String> info = new SegmentInfo(segmentId, fileStore.getTracker()).getInfoMap();
+                Map<String, String> info = new SegmentInfo(segmentId, fileStore).getInfoMap();
                 String error = info.get("error");
                 if (error != null) {
                     return "Error";
@@ -446,8 +446,8 @@ public final class SegmentGraph {
         return graph;
     }
 
-    private static void writeNode(UUID node, PrintWriter writer, boolean inHead, Date epoch, SegmentTracker tracker) {
-        SegmentInfo segmentInfo = new SegmentInfo(node, tracker);
+    private static void writeNode(UUID node, PrintWriter writer, boolean inHead, Date epoch, SegmentStore store) {
+        SegmentInfo segmentInfo = new SegmentInfo(node, store);
         if (!segmentInfo.isData()) {
             writer.write(node + ",b,bulk,b,-1,-1," + inHead + "\n");
         } else {
@@ -491,19 +491,21 @@ public final class SegmentGraph {
         return Long.valueOf(string);
     }
 
-    private static String getSegmentInfo(UUID segment, SegmentTracker tracker) {
-        return new SegmentInfo(segment, tracker).getInfo();
+    private static String getSegmentInfo(UUID segment, SegmentStore store) {
+        return new SegmentInfo(segment, store).getInfo();
     }
 
     private static class SegmentInfo {
+
         private final UUID uuid;
-        private final SegmentTracker tracker;
+
+        private final SegmentStore store;
 
         private SegmentId id;
 
-        SegmentInfo(UUID uuid, SegmentTracker tracker) {
+        SegmentInfo(UUID uuid, SegmentStore store) {
             this.uuid = uuid;
-            this.tracker = tracker;
+            this.store = store;
         }
 
         boolean isData() {
@@ -512,8 +514,9 @@ public final class SegmentGraph {
 
         SegmentId getSegmentId() {
             if (id == null) {
-                id = tracker.getSegmentId(
-                    uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
+                long msb = uuid.getMostSignificantBits();
+                long lsb = uuid.getLeastSignificantBits();
+                id = store.newSegmentId(msb, lsb);
             }
             return id;
         }

Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java?rev=1747196&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java Tue Jun  7 11:38:13 2016
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A factory for {@link SegmentId} given their representation in MSB/LSB longs.
+ * <p>
+ * An instance of this class is used by the {@link SegmentTracker} to delegate
+ * the creation of {@link SegmentId}s to its caller, that usually is a {@link
+ * SegmentStore}. This way, the {@link SegmentStore} may attach additional,
+ * implementation-dependent information to the returned {@link SegmentId} in a
+ * way that is transparent to the implementation of the {@link SegmentTracker}.
+ */
+public interface SegmentIdFactory {
+
+    /**
+     * Creates a {@link SegmentId} represented by the given MSB/LSB pair.
+     *
+     * @param msb The most significant bits of the {@link SegmentId}.
+     * @param lsb The least significant bits of the {@link SegmentId}.
+     * @return An instance of {@link SegmentId}. The returned instance is never
+     * {@code null}.
+     */
+    @Nonnull
+    SegmentId newSegmentId(long msb, long lsb);
+
+}

Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java Tue Jun  7 11:38:13 2016
@@ -18,7 +18,6 @@
  */
 package org.apache.jackrabbit.oak.segment;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMapWithExpectedSize;
 import static java.util.Collections.nCopies;
@@ -63,9 +62,6 @@ public class SegmentIdTable {
     private final ArrayList<WeakReference<SegmentId>> references =
             newArrayList(nCopies(1024, (WeakReference<SegmentId>) null));
 
-    @Nonnull
-    private final SegmentStore store;
-
     private static final Logger LOG = LoggerFactory.getLogger(SegmentIdTable.class);
 
     
@@ -79,19 +75,19 @@ public class SegmentIdTable {
      */
     private int entryCount;
 
-    SegmentIdTable(@Nonnull SegmentStore store) {
-        this.store = checkNotNull(store);
-    }
-
     /**
-     * Get the segment id, and reference it in the weak references map.
-     * 
-     * @param msb
-     * @param lsb
+     * Get the segment id, and reference it in the weak references map. If the
+     * pair of MSB/LSB is not tracked by this table, a new instance of {@link
+     * SegmentId} is created using the provided {@link SegmentIdFactory} and
+     * tracked by this table.
+     *
+     * @param msb   The most significant bits of the {@link SegmentId}.
+     * @param lsb   The least significant bits of the {@link SegmentId}.
+     * @param maker A non-{@code null} instance of {@link SegmentIdFactory}.
      * @return the segment id
      */
     @Nonnull
-    synchronized SegmentId getSegmentId(long msb, long lsb) {
+    synchronized SegmentId getSegmentId(long msb, long lsb, SegmentIdFactory maker) {
         int index = getIndex(lsb);
         boolean shouldRefresh = false;
 
@@ -110,7 +106,7 @@ public class SegmentIdTable {
             reference = references.get(index);
         }
 
-        SegmentId id = new SegmentId(store, msb, lsb);
+        SegmentId id = maker.newSegmentId(msb, lsb);
         references.set(index, new WeakReference<SegmentId>(id));
         entryCount++;
         if (entryCount > references.size() * 0.75) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStore.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentStore.java Tue Jun  7 11:38:13 2016
@@ -54,4 +54,30 @@ public interface SegmentStore {
      */
     void writeSegment(SegmentId id, byte[] bytes, int offset, int length) throws IOException;
 
+    /**
+     * Create a {@link SegmentId} represented by the given MSB/LSB pair.
+     *
+     * @param msb The most significant bits of the {@link SegmentId}.
+     * @param lsb The least significant bits of the {@link SegmentId}.
+     * @return A non-{@code null} instance of {@link SegmentId}.
+     */
+    @Nonnull
+    SegmentId newSegmentId(long msb, long lsb);
+
+    /**
+     * Create a new {@link SegmentId} for a segment of type "bulk".
+     *
+     * @return A non-{@code null} instance of {@link SegmentId}.
+     */
+    @Nonnull
+    SegmentId newBulkSegmentId();
+
+    /**
+     * Create a new {@link SegmentId} for a segment of type "data".
+     *
+     * @return A non-{@code null} instance of {@link SegmentId}.
+     */
+    @Nonnull
+    SegmentId newDataSegmentId();
+
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java Tue Jun  7 11:38:13 2016
@@ -68,9 +68,9 @@ public class SegmentTracker {
     @Nonnull
     private final AtomicInteger segmentCounter = new AtomicInteger();
 
-    public SegmentTracker(@Nonnull SegmentStore store) {
+    public SegmentTracker() {
         for (int i = 0; i < tables.length; i++) {
-            tables[i] = new SegmentIdTable(store);
+            tables[i] = new SegmentIdTable();
         }
     }
 
@@ -96,42 +96,48 @@ public class SegmentTracker {
     }
 
     /**
-     * Get an existing {@code SegmentId} with the given {@code msb} and {@code lsb}
-     * or create a new one if no such id exists with this tracker.
-     * @param msb  most significant bits of the segment id
-     * @param lsb  least  significant bits of the segment id
+     * Get an existing {@code SegmentId} with the given {@code msb} and {@code
+     * lsb} or create a new one if no such id exists with this tracker.
+     *
+     * @param msb   most significant bits of the segment id
+     * @param lsb   least  significant bits of the segment id
+     * @param maker A non-{@code null} instance of {@link SegmentIdFactory}.
      * @return the segment id
      */
     @Nonnull
-    public SegmentId getSegmentId(long msb, long lsb) {
+    public SegmentId getSegmentId(long msb, long lsb, SegmentIdFactory maker) {
         int index = ((int) msb) & (tables.length - 1);
-        return tables[index].getSegmentId(msb, lsb);
+        return tables[index].getSegmentId(msb, lsb, maker);
     }
 
     /**
      * Create and track a new segment id for data segments.
+     *
+     * @param maker A non-{@code null} instance of {@link SegmentIdFactory}.
      * @return the segment id
      */
     @Nonnull
-    SegmentId newDataSegmentId() {
-        return newSegmentId(DATA);
+    public SegmentId newDataSegmentId(SegmentIdFactory maker) {
+        return newSegmentId(DATA, maker);
     }
 
     /**
      * Create and track a new segment id for bulk segments.
+     *
+     * @param maker A non-{@code null} instance of {@link SegmentIdFactory}.
      * @return the segment id
      */
     @Nonnull
-    SegmentId newBulkSegmentId() {
-        return newSegmentId(BULK);
+    public SegmentId newBulkSegmentId(SegmentIdFactory maker) {
+        return newSegmentId(BULK, maker);
     }
 
     @Nonnull
-    private SegmentId newSegmentId(long type) {
+    private SegmentId newSegmentId(long type, SegmentIdFactory maker) {
         segmentCounter.incrementAndGet();
         long msb = (random.nextLong() & MSB_MASK) | VERSION;
         long lsb = (random.nextLong() & LSB_MASK) | type;
-        return getSegmentId(msb, lsb);
+        return getSegmentId(msb, lsb, maker);
     }
 
     // FIXME OAK-4285: Align cleanup of segment id tables with the new cleanup strategy

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java Tue Jun  7 11:38:13 2016
@@ -96,9 +96,6 @@ public class SegmentWriter {
     private final BlobStore blobStore;
 
     @Nonnull
-    private final SegmentTracker tracker;
-
-    @Nonnull
     private final WriteOperationHandler writeOperationHandler;
 
     /**
@@ -108,20 +105,17 @@ public class SegmentWriter {
      * @param store      store to write to
      * @param reader     segment reader for the {@code store}
      * @param blobStore  the blog store or {@code null} for inlined blobs
-     * @param tracker    segment tracker for {@code store}
      * @param cacheManager  cache manager instance for the de-duplication caches used by this writer
      * @param writeOperationHandler  handler for write operations.
      */
     public SegmentWriter(@Nonnull SegmentStore store,
                          @Nonnull SegmentReader reader,
                          @Nullable BlobStore blobStore,
-                         @Nonnull SegmentTracker tracker,
                          @Nonnull WriterCacheManager cacheManager,
                          @Nonnull WriteOperationHandler writeOperationHandler) {
         this.store = checkNotNull(store);
         this.reader = checkNotNull(reader);
         this.blobStore = blobStore;
-        this.tracker = checkNotNull(tracker);
         this.cacheManager = checkNotNull(cacheManager);
         this.writeOperationHandler = checkNotNull(writeOperationHandler);
     }
@@ -595,7 +589,7 @@ public class SegmentWriter {
 
             // write as many full bulk segments as possible
             while (pos + Segment.MAX_SEGMENT_SIZE <= data.length) {
-                SegmentId bulkId = tracker.newBulkSegmentId();
+                SegmentId bulkId = store.newBulkSegmentId();
                 store.writeSegment(bulkId, data, pos, Segment.MAX_SEGMENT_SIZE);
                 for (int i = 0; i < Segment.MAX_SEGMENT_SIZE; i += BLOCK_SIZE) {
                     blockIds.add(new RecordId(bulkId, i));
@@ -724,7 +718,7 @@ public class SegmentWriter {
 
             // Write the data to bulk segments and collect the list of block ids
             while (n != 0) {
-                SegmentId bulkId = tracker.newBulkSegmentId();
+                SegmentId bulkId = store.newBulkSegmentId();
                 int len = Segment.align(n, 1 << Segment.RECORD_ALIGN_BITS);
                 LOG.debug("Writing bulk segment {} ({} bytes)", bulkId, n);
                 store.writeSegment(bulkId, data, 0, len);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java Tue Jun  7 11:38:13 2016
@@ -144,7 +144,7 @@ public final class SegmentWriterBuilder
     @Nonnull
     public SegmentWriter build(@Nonnull FileStore store) {
         return new SegmentWriter(checkNotNull(store), store.getReader(),
-                store.getBlobStore(), store.getTracker(), cacheManager, createWriter(store, pooled));
+                store.getBlobStore(), cacheManager, createWriter(store, pooled));
     }
 
     /**
@@ -153,7 +153,7 @@ public final class SegmentWriterBuilder
     @Nonnull
     public SegmentWriter build(@Nonnull MemoryStore store) {
         return new SegmentWriter(checkNotNull(store), store.getReader(),
-                store.getBlobStore(), store.getTracker(), cacheManager, createWriter(store, pooled));
+                store.getBlobStore(), cacheManager, createWriter(store, pooled));
     }
 
     /**
@@ -162,7 +162,7 @@ public final class SegmentWriterBuilder
     @Nonnull
     public SegmentWriter build(@Nonnull HttpStore store) {
         return new SegmentWriter(checkNotNull(store), store.getReader(),
-                store.getBlobStore(), store.getTracker(), cacheManager, createWriter(store, pooled));
+                store.getBlobStore(), cacheManager, createWriter(store, pooled));
     }
 
     @Nonnull

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -85,6 +85,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentCache;
 import org.apache.jackrabbit.oak.segment.SegmentGraph.SegmentGraphVisitor;
 import org.apache.jackrabbit.oak.segment.SegmentId;
+import org.apache.jackrabbit.oak.segment.SegmentIdFactory;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
@@ -216,8 +217,18 @@ public class FileStore implements Segmen
     @Nonnull
     private final SegmentCache segmentCache;
 
+    private final SegmentIdFactory segmentIdFactory = new SegmentIdFactory() {
+
+        @Override
+        @Nonnull
+        public SegmentId newSegmentId(long msb, long lsb) {
+            return new SegmentId(FileStore.this, msb, lsb);
+        }
+
+    };
+
     FileStore(FileStoreBuilder builder, boolean readOnly) throws IOException {
-        this.tracker = new SegmentTracker(this);
+        this.tracker = new SegmentTracker();
         this.revisions = builder.getRevisions();
         this.blobStore = builder.getBlobStore();
 
@@ -759,7 +770,7 @@ public class FileStore implements Segmen
 
         int minGeneration = getGcGeneration() - gcOptions.getRetainedGenerations() + 1;
         for (TarReader tarReader : tarReaders) {
-            tarReader.collectBlobReferences(tracker, collector, minGeneration);
+            tarReader.collectBlobReferences(this, collector, minGeneration);
         }
     }
 
@@ -926,8 +937,7 @@ public class FileStore implements Segmen
                                      Supplier<Boolean> cancel)
     throws IOException {
         if (gcOptions.isOffline()) {
-            SegmentWriter writer = new SegmentWriter(this, segmentReader,
-                    blobStore, tracker, Empty.INSTANCE, bufferWriter);
+            SegmentWriter writer = new SegmentWriter(this, segmentReader, blobStore, Empty.INSTANCE, bufferWriter);
             return new Compactor(segmentReader, writer, blobStore, cancel, gcOptions)
                     .compact(EMPTY_NODE, head, EMPTY_NODE);
         } else {
@@ -967,16 +977,16 @@ public class FileStore implements Segmen
             List<SegmentId> ids = newArrayList();
             if (tarWriter != null) {
                 for (UUID uuid : tarWriter.getUUIDs()) {
-                    ids.add(tracker.getSegmentId(
-                            uuid.getMostSignificantBits(),
-                            uuid.getLeastSignificantBits()));
+                    long msb = uuid.getMostSignificantBits();
+                    long lsb = uuid.getLeastSignificantBits();
+                    ids.add(newSegmentId(msb, lsb));
                 }
             }
             for (TarReader reader : readers) {
                 for (UUID uuid : reader.getUUIDs()) {
-                    ids.add(tracker.getSegmentId(
-                            uuid.getMostSignificantBits(),
-                            uuid.getLeastSignificantBits()));
+                    long msb = uuid.getMostSignificantBits();
+                    long lsb = uuid.getLeastSignificantBits();
+                    ids.add(newSegmentId(msb, lsb));
                 }
             }
             return ids;
@@ -1105,7 +1115,7 @@ public class FileStore implements Segmen
 
                             ByteBuffer buffer = reader.readEntry(msb, lsb);
                             if (buffer != null) {
-                                return new Segment(tracker, segmentReader, id, buffer);
+                                return new Segment(FileStore.this, segmentReader, id, buffer);
                             }
                         } catch (IOException e) {
                             log.warn("Failed to read from tar file {}", reader, e);
@@ -1118,7 +1128,7 @@ public class FileStore implements Segmen
                             try {
                                 ByteBuffer buffer = tarWriter.readEntry(msb, lsb);
                                 if (buffer != null) {
-                                    return new Segment(tracker, segmentReader, id, buffer);
+                                    return new Segment(FileStore.this, segmentReader, id, buffer);
                                 }
                             } catch (IOException e) {
                                 log.warn("Failed to read from tar file {}", tarWriter, e);
@@ -1141,7 +1151,7 @@ public class FileStore implements Segmen
 
                             ByteBuffer buffer = reader.readEntry(msb, lsb);
                             if (buffer != null) {
-                                return new Segment(tracker, segmentReader, id, buffer);
+                                return new Segment(FileStore.this, segmentReader, id, buffer);
                             }
                         } catch (IOException e) {
                             log.warn("Failed to read from tar file {}", reader, e);
@@ -1185,10 +1195,28 @@ public class FileStore implements Segmen
             } else {
                 data = ByteBuffer.wrap(buffer, offset, length);
             }
-            segmentCache.putSegment(new Segment(tracker, segmentReader, id, data));
+            segmentCache.putSegment(new Segment(this, segmentReader, id, data));
         }
     }
 
+    @Override
+    @Nonnull
+    public SegmentId newSegmentId(long msb, long lsb) {
+        return tracker.getSegmentId(msb, lsb, segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newBulkSegmentId() {
+        return tracker.newBulkSegmentId(segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newDataSegmentId() {
+        return tracker.newDataSegmentId(segmentIdFactory);
+    }
+
     /**
      * Switch to a new tar writer.
      * This method may only be called when holding the write lock of {@link #fileStoreLock}
@@ -1255,7 +1283,7 @@ public class FileStore implements Segmen
     private void setRevision(String rootRevision) {
         fileStoreLock.writeLock().lock();
         try {
-            revisions.setHeadId(RecordId.fromString(tracker, rootRevision));
+            revisions.setHeadId(RecordId.fromString(this, rootRevision));
         } finally {
             fileStoreLock.writeLock().unlock();
         }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java Tue Jun  7 11:38:13 2016
@@ -58,7 +58,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.apache.jackrabbit.oak.segment.SegmentGraph.SegmentGraphVisitor;
 import org.apache.jackrabbit.oak.segment.SegmentId;
-import org.apache.jackrabbit.oak.segment.SegmentTracker;
+import org.apache.jackrabbit.oak.segment.SegmentStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -734,16 +734,16 @@ class TarReader implements Closeable {
     /**
      * Collect the references of those blobs that are reachable from any segment with a
      * generation at or above {@code minGeneration}.
-     * @param tracker
+     * @param store
      * @param collector
      * @param minGeneration
      */
-    void collectBlobReferences(SegmentTracker tracker, ReferenceCollector collector, int minGeneration) {
+    void collectBlobReferences(SegmentStore store, ReferenceCollector collector, int minGeneration) {
         for (TarEntry entry : getEntries()) {
             if (entry.generation() >= minGeneration) {
                 // FIXME OAK-4201: Add an index of binary references in a tar file
                 // Fetch the blob references from the tar index instead reading them from the segment
-                SegmentId id = tracker.getSegmentId(entry.msb(), entry.lsb());
+                SegmentId id = store.newSegmentId(entry.msb(), entry.lsb());
                 id.getSegment().collectBlobReferences(collector);
             }
         }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java Tue Jun  7 11:38:13 2016
@@ -131,7 +131,7 @@ public class TarRevisions implements Rev
                 while (persistedId == null && entries.hasNext()) {
                     String entry = entries.next();
                     try {
-                        RecordId id = RecordId.fromString(tracker, entry);
+                        RecordId id = RecordId.fromString(store, entry);
                         if (store.containsSegment(id.getSegmentId())) {
                             persistedId = id;
                         } else {

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.Revisions;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
+import org.apache.jackrabbit.oak.segment.SegmentIdFactory;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
@@ -48,7 +49,7 @@ import org.apache.jackrabbit.oak.spi.blo
 public class HttpStore implements SegmentStore {
 
     @Nonnull
-    private final SegmentTracker tracker = new SegmentTracker(this);
+    private final SegmentTracker tracker = new SegmentTracker();
 
     @Nonnull
     private final HttpStoreRevisions revisions = new HttpStoreRevisions(this);
@@ -64,6 +65,16 @@ public class HttpStore implements Segmen
     private final SegmentReader segmentReader = new CachingSegmentReader(
             getWriter, revisions, null, DEFAULT_STRING_CACHE_MB);
 
+    private final SegmentIdFactory segmentIdFactory = new SegmentIdFactory() {
+
+        @Override
+        @Nonnull
+        public SegmentId newSegmentId(long msb, long lsb) {
+            return new SegmentId(HttpStore.this, msb, lsb);
+        }
+
+    };
+
     @Nonnull
     private final SegmentWriter segmentWriter = segmentWriterBuilder("sys")
             .withWriterPool().build(this);
@@ -99,6 +110,24 @@ public class HttpStore implements Segmen
         return revisions;
     }
 
+    @Override
+    @Nonnull
+    public SegmentId newSegmentId(long msb, long lsb) {
+        return tracker.getSegmentId(msb, lsb, segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newBulkSegmentId() {
+        return tracker.newBulkSegmentId(segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newDataSegmentId() {
+        return tracker.newDataSegmentId(segmentIdFactory);
+    }
+
     /**
      * Builds a simple URLConnection. This method can be extended to add
      * authorization headers if needed.
@@ -129,7 +158,7 @@ public class HttpStore implements Segmen
             InputStream stream = connection.getInputStream();
             try {
                 byte[] data = ByteStreams.toByteArray(stream);
-                return new Segment(tracker, segmentReader, id, ByteBuffer.wrap(data));
+                return new Segment(this, segmentReader, id, ByteBuffer.wrap(data));
             } finally {
                 stream.close();
             }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStoreRevisions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStoreRevisions.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStoreRevisions.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/http/HttpStoreRevisions.java Tue Jun  7 11:38:13 2016
@@ -52,7 +52,7 @@ public class HttpStoreRevisions implemen
                 InputStream stream = connection.getInputStream();
                 BufferedReader reader = new BufferedReader(new InputStreamReader(stream, UTF_8))
             ) {
-                return RecordId.fromString(store.getTracker(), reader.readLine());
+                return RecordId.fromString(store, reader.readLine());
             }
         } catch (IllegalArgumentException | MalformedURLException e) {
             throw new IllegalStateException(e);

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.Revisions;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
+import org.apache.jackrabbit.oak.segment.SegmentIdFactory;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
@@ -46,7 +47,7 @@ import org.apache.jackrabbit.oak.spi.blo
 public class MemoryStore implements SegmentStore {
 
     @Nonnull
-    private final SegmentTracker tracker = new SegmentTracker(this);
+    private final SegmentTracker tracker = new SegmentTracker();
 
     @Nonnull
     private final MemoryStoreRevisions revisions;
@@ -57,6 +58,16 @@ public class MemoryStore implements Segm
     @Nonnull
     private final SegmentWriter segmentWriter;
 
+    private final SegmentIdFactory segmentIdFactory = new SegmentIdFactory() {
+
+        @Override
+        @Nonnull
+        public SegmentId newSegmentId(long msb, long lsb) {
+            return new SegmentId(MemoryStore.this, msb, lsb);
+        }
+
+    };
+
     private final ConcurrentMap<SegmentId, Segment> segments =
             Maps.newConcurrentMap();
 
@@ -109,12 +120,30 @@ public class MemoryStore implements Segm
     }
 
     @Override
+    @Nonnull
+    public SegmentId newSegmentId(long msb, long lsb) {
+        return tracker.getSegmentId(msb, lsb, segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newBulkSegmentId() {
+        return tracker.newBulkSegmentId(segmentIdFactory);
+    }
+
+    @Override
+    @Nonnull
+    public SegmentId newDataSegmentId() {
+        return tracker.newDataSegmentId(segmentIdFactory);
+    }
+
+    @Override
     public void writeSegment(
             SegmentId id, byte[] data, int offset, int length) throws IOException {
         ByteBuffer buffer = ByteBuffer.allocate(length);
         buffer.put(data, offset, length);
         buffer.rewind();
-        Segment segment = new Segment(tracker, segmentReader, id, buffer);
+        Segment segment = new Segment(this, segmentReader, id, buffer);
         if (segments.putIfAbsent(id, segment) != null) {
             throw new IOException("Segment override: " + id);
         }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java Tue Jun  7 11:38:13 2016
@@ -149,10 +149,9 @@ public class RecordTest {
 
     @Test
     public void testListWithLotsOfReferences() throws IOException { // OAK-1184
-        SegmentTracker factory = store.getTracker();
         List<RecordId> list = newArrayList();
         for (int i = 0; i < 1000; i++) {
-            list.add(new RecordId(factory.newBulkSegmentId(), 0));
+            list.add(new RecordId(store.newBulkSegmentId(), 0));
         }
         writer.writeList(list);
     }

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=1747196&r1=1747195&r2=1747196&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 Tue Jun  7 11:38:13 2016
@@ -146,7 +146,7 @@ public class SegmentGraphTest {
     public void testSegmentGraphWithFilter() throws IOException {
         ReadOnlyStore store = fileStoreBuilder(getStoreFolder()).buildReadOnly();
         try {
-            Predicate<UUID> filter = createRegExpFilter(".*(writer2|writer3).*", store.getTracker());
+            Predicate<UUID> filter = createRegExpFilter(".*(writer2|writer3).*", store);
             Graph<UUID> segmentGraph = parseSegmentGraph(store, filter);
             assertEquals(filteredSegments, newHashSet(segmentGraph.vertices()));
             Map<UUID, Set<UUID>> map = newHashMap();

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdFactoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdFactoryTest.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdFactoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdFactoryTest.java Tue Jun  7 11:38:13 2016
@@ -39,25 +39,25 @@ public class SegmentIdFactoryTest {
 
     @Test
     public void segmentIdType() {
-        assertTrue(tracker.newDataSegmentId().isDataSegmentId());
-        assertTrue(tracker.newBulkSegmentId().isBulkSegmentId());
+        assertTrue(store.newDataSegmentId().isDataSegmentId());
+        assertTrue(store.newBulkSegmentId().isBulkSegmentId());
 
-        assertFalse(tracker.newDataSegmentId().isBulkSegmentId());
-        assertFalse(tracker.newBulkSegmentId().isDataSegmentId());
+        assertFalse(store.newDataSegmentId().isBulkSegmentId());
+        assertFalse(store.newBulkSegmentId().isDataSegmentId());
     }
 
     @Test
     public void internedSegmentIds() {
-        assertTrue(tracker.getSegmentId(0, 0) == tracker.getSegmentId(0, 0));
-        assertTrue(tracker.getSegmentId(1, 2) == tracker.getSegmentId(1, 2));
-        assertTrue(tracker.getSegmentId(1, 2) != tracker.getSegmentId(3, 4));
+        assertTrue(store.newSegmentId(0, 0) == store.newSegmentId(0, 0));
+        assertTrue(store.newSegmentId(1, 2) == store.newSegmentId(1, 2));
+        assertTrue(store.newSegmentId(1, 2) != store.newSegmentId(3, 4));
     }
 
     @Test
     public void referencedSegmentIds() throws InterruptedException {
-        SegmentId a = tracker.newDataSegmentId();
-        SegmentId b = tracker.newBulkSegmentId();
-        SegmentId c = tracker.newDataSegmentId();
+        SegmentId a = store.newDataSegmentId();
+        SegmentId b = store.newBulkSegmentId();
+        SegmentId c = store.newDataSegmentId();
 
         Set<SegmentId> ids = tracker.getReferencedSegmentIds();
         assertTrue(ids.contains(a));
@@ -65,7 +65,7 @@ public class SegmentIdFactoryTest {
         assertTrue(ids.contains(c));
 
         // the returned set is a snapshot in time, not continuously updated
-        assertFalse(ids.contains(tracker.newBulkSegmentId()));
+        assertFalse(ids.contains(store.newBulkSegmentId()));
     }
 
     /**
@@ -75,8 +75,8 @@ public class SegmentIdFactoryTest {
      */
     // @Test
     public void garbageCollection() {
-        SegmentId a = tracker.newDataSegmentId();
-        SegmentId b = tracker.newBulkSegmentId();
+        SegmentId a = store.newDataSegmentId();
+        SegmentId b = store.newBulkSegmentId();
 
         // generate lots of garbage copies of an UUID to get the
         // garbage collector to reclaim also the original instance
@@ -102,9 +102,9 @@ public class SegmentIdFactoryTest {
         byte[] buffer = new byte[segment.size()];
         segment.readBytes(Segment.MAX_SEGMENT_SIZE - segment.size(), buffer, 0, segment.size());
 
-        SegmentId id = tracker.newDataSegmentId();
+        SegmentId id = store.newDataSegmentId();
         ByteBuffer data = ByteBuffer.wrap(buffer);
-        Segment s = new Segment(store.getTracker(), store.getReader(), id, data);
+        Segment s = new Segment(store, store.getReader(), id, data);
         s.getRefId(1);
     }
 
@@ -113,9 +113,9 @@ public class SegmentIdFactoryTest {
      */
     @Test(expected = IllegalStateException.class)
     public void bulkAIOOBE() {
-        SegmentId id = tracker.newBulkSegmentId();
+        SegmentId id = store.newBulkSegmentId();
         ByteBuffer data = ByteBuffer.allocate(4);
-        Segment s = new Segment(store.getTracker(), store.getReader(), id, data);
+        Segment s = new Segment(store, store.getReader(), id, data);
         s.getRefId(1);
     }
 

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableBenchmark.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableBenchmark.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableBenchmark.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableBenchmark.java Tue Jun  7 11:38:13 2016
@@ -25,6 +25,18 @@ import java.util.Random;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 
 public class SegmentIdTableBenchmark {
+
+    private static SegmentIdFactory newSegmentIdMaker(final SegmentStore store) {
+        return new SegmentIdFactory() {
+
+            @Override
+            public SegmentId newSegmentId(long msb, long lsb) {
+                return new SegmentId(store, msb, lsb);
+            }
+
+        };
+    }
+
     public static void main(String... args) throws IOException {
         test();
         test();
@@ -47,10 +59,11 @@ public class SegmentIdTableBenchmark {
         
         time = System.currentTimeMillis();
         MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        SegmentIdFactory maker = newSegmentIdMaker(store);
+        final SegmentIdTable tbl = new SegmentIdTable();
         for (int i = 0; i < repeat; i++) {
             for (int j = 0; j < count; j++) {
-                tbl.getSegmentId(j, array[j]);
+                tbl.getSegmentId(j, array[j], maker);
             }
         }
         time = System.currentTimeMillis() - time;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableTest.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentIdTableTest.java Tue Jun  7 11:38:13 2016
@@ -40,17 +40,32 @@ import org.junit.Test;
 
 public class SegmentIdTableTest {
 
+    private static SegmentIdFactory newSegmentIdMaker(final SegmentStore store) {
+        return new SegmentIdFactory() {
+
+            @Override
+            public SegmentId newSegmentId(long msb, long lsb) {
+                return new SegmentId(store, msb, lsb);
+            }
+
+        };
+    }
+
+    private static SegmentIdFactory newSegmentIdMaker() throws IOException {
+        return newSegmentIdMaker(new MemoryStore());
+    }
+
     /**
      * OAK-2752
      */
     @Test
     public void endlessSearchLoop() throws IOException {
-        MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        final SegmentIdFactory maker = newSegmentIdMaker();
+        final SegmentIdTable tbl = new SegmentIdTable();
 
         List<SegmentId> refs = new ArrayList<SegmentId>();
         for (int i = 0; i < 1024; i++) {
-            refs.add(tbl.getSegmentId(i, i % 64));
+            refs.add(tbl.getSegmentId(i, i % 64, maker));
         }
 
         Callable<SegmentId> c = new Callable<SegmentId>() {
@@ -58,7 +73,7 @@ public class SegmentIdTableTest {
             @Override
             public SegmentId call() throws Exception {
                 // (2,1) doesn't exist
-                return tbl.getSegmentId(2, 1);
+                return tbl.getSegmentId(2, 1, maker);
             }
         };
         Future<SegmentId> f = Executors.newSingleThreadExecutor().submit(c);
@@ -75,13 +90,13 @@ public class SegmentIdTableTest {
     
     @Test
     public void randomized() throws IOException {
-        MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        SegmentIdFactory maker = newSegmentIdMaker();
+        final SegmentIdTable tbl = new SegmentIdTable();
 
         List<SegmentId> refs = new ArrayList<SegmentId>();
         Random r = new Random(1);
         for (int i = 0; i < 16 * 1024; i++) {
-            refs.add(tbl.getSegmentId(r.nextLong(), r.nextLong()));
+            refs.add(tbl.getSegmentId(r.nextLong(), r.nextLong(), maker));
         }
         assertEquals(16 * 1024, tbl.getEntryCount());
         assertEquals(16 * 2048, tbl.getMapSize());
@@ -89,7 +104,7 @@ public class SegmentIdTableTest {
         
         r = new Random(1);
         for (int i = 0; i < 16 * 1024; i++) {
-            refs.add(tbl.getSegmentId(r.nextLong(), r.nextLong()));
+            refs.add(tbl.getSegmentId(r.nextLong(), r.nextLong(), maker));
             assertEquals(16 * 1024, tbl.getEntryCount());
             assertEquals(16 * 2048, tbl.getMapSize());
             assertEquals(5, tbl.getMapRebuildCount());
@@ -98,13 +113,13 @@ public class SegmentIdTableTest {
     
     @Test
     public void clearTable() throws IOException {
-        MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        SegmentIdFactory maker = newSegmentIdMaker();
+        final SegmentIdTable tbl = new SegmentIdTable();
 
         List<SegmentId> refs = new ArrayList<SegmentId>();
         int originalCount = 8;
         for (int i = 0; i < originalCount; i++) {
-            refs.add(tbl.getSegmentId(i, i % 2));
+            refs.add(tbl.getSegmentId(i, i % 2, maker));
         }
         assertEquals(originalCount, tbl.getEntryCount());
         assertEquals(0, tbl.getMapRebuildCount());
@@ -120,9 +135,9 @@ public class SegmentIdTableTest {
 
         for (SegmentId id : refs) {
             if (id.getMostSignificantBits() >= 4) {
-                SegmentId id2 = tbl.getSegmentId(
-                        id.getMostSignificantBits(),
-                        id.getLeastSignificantBits());
+                long msb = id.getMostSignificantBits();
+                long lsb = id.getLeastSignificantBits();
+                SegmentId id2 = tbl.getSegmentId(msb, lsb, maker);
                 List<SegmentId> list = tbl.getRawSegmentIdList();
                 if (list.size() != new HashSet<SegmentId>(list).size()) {
                     Collections.sort(list);
@@ -135,14 +150,14 @@ public class SegmentIdTableTest {
     
     @Test
     public void justHashCollisions() throws IOException {
-        MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        SegmentIdFactory maker = newSegmentIdMaker();
+        final SegmentIdTable tbl = new SegmentIdTable();
 
         List<SegmentId> refs = new ArrayList<SegmentId>();
         int originalCount = 1024;
         for (int i = 0; i < originalCount; i++) {
             // modulo 128 to ensure we have conflicts
-            refs.add(tbl.getSegmentId(i, i % 128));
+            refs.add(tbl.getSegmentId(i, i % 128, maker));
         }
         assertEquals(originalCount, tbl.getEntryCount());
         assertEquals(1, tbl.getMapRebuildCount());
@@ -159,14 +174,14 @@ public class SegmentIdTableTest {
     
     @Test
     public void gc() throws IOException {
-        MemoryStore store = new MemoryStore();
-        final SegmentIdTable tbl = new SegmentIdTable(store);
+        SegmentIdFactory maker = newSegmentIdMaker();
+        final SegmentIdTable tbl = new SegmentIdTable();
 
         List<SegmentId> refs = new ArrayList<SegmentId>();
         int originalCount = 1024;
         for (int i = 0; i < originalCount; i++) {
             // modulo 128 to ensure we have conflicts
-            refs.add(tbl.getSegmentId(i, i % 128));
+            refs.add(tbl.getSegmentId(i, i % 128, maker));
         }
         assertEquals(originalCount, tbl.getEntryCount());
         assertEquals(1, tbl.getMapRebuildCount());
@@ -182,7 +197,9 @@ public class SegmentIdTableTest {
             System.gc();
             
             for (SegmentId id : refs) {
-                SegmentId id2 = tbl.getSegmentId(id.getMostSignificantBits(), id.getLeastSignificantBits());
+                long msb = id.getMostSignificantBits();
+                long lsb = id.getLeastSignificantBits();
+                SegmentId id2 = tbl.getSegmentId(msb, lsb, maker);
                 assertTrue(id2 == id);
             }
             // because we found each entry, we expect the refresh count is the same
@@ -192,7 +209,7 @@ public class SegmentIdTableTest {
             // it is supposed to detect that entries were removed,
             // and force a refresh, which would get rid of the unreferenced ids
             for (int i = 0; i < 10; i++) {
-                tbl.getSegmentId(i, i);
+                tbl.getSegmentId(i, i, maker);
             }
 
             if (tbl.getEntryCount() < originalCount) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentParserTest.java Tue Jun  7 11:38:13 2016
@@ -400,7 +400,7 @@ public class SegmentParserTest {
 
     @Test
     public void emptyList() {
-        RecordId listId = newRecordId(store.getTracker(), new Random());
+        RecordId listId = newRecordId(store, new Random());
         ListInfo listInfo = new TestParser(store.getReader(), "emptyList").parseList(null, listId, 0);
         assertEquals(listId, listInfo.listId);
         assertEquals(0, listInfo.count);

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/TestUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/TestUtils.java?rev=1747196&r1=1747195&r2=1747196&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/TestUtils.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/TestUtils.java Tue Jun  7 11:38:13 2016
@@ -33,8 +33,8 @@ import javax.annotation.Nonnull;
 public final class TestUtils {
     private TestUtils() {}
 
-    public static RecordId newRecordId(SegmentTracker factory, Random random) {
-        SegmentId id = factory.newDataSegmentId();
+    public static RecordId newRecordId(SegmentStore store, Random random) {
+        SegmentId id = store.newDataSegmentId();
         RecordId r = new RecordId(id, newValidOffset(random));
         return r;
     }
@@ -57,22 +57,22 @@ public final class TestUtils {
      * Create a random map of record ids.
      *
      * @param rnd
-     * @param tracker
+     * @param store
      * @param segmentCount  number of segments
      * @param entriesPerSegment  number of records per segment
      * @return  map of record ids
      */
-    public static Map<RecordId, RecordId> randomRecordIdMap(Random rnd, SegmentTracker tracker,
+    public static Map<RecordId, RecordId> randomRecordIdMap(Random rnd, SegmentStore store,
             int segmentCount, int entriesPerSegment) {
         Map<RecordId, RecordId> map = newHashMap();
         for (int i = 0; i < segmentCount; i++) {
-            SegmentId id = tracker.newDataSegmentId();
+            SegmentId id = store.newDataSegmentId();
             int offset = MAX_SEGMENT_SIZE;
             for (int j = 0; j < entriesPerSegment; j++) {
                 offset = newValidOffset(rnd, (entriesPerSegment - j) << RECORD_ALIGN_BITS, offset);
                 RecordId before = new RecordId(id, offset);
                 RecordId after = new RecordId(
-                        tracker.newDataSegmentId(),
+                        store.newDataSegmentId(),
                         newValidOffset(rnd, 0, MAX_SEGMENT_SIZE));
                 map.put(before, after);
             }