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);
}