You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2015/12/15 12:24:17 UTC
svn commit: r1720117 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java
test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
Author: mduerig
Date: Tue Dec 15 11:24:17 2015
New Revision: 1720117
URL: http://svn.apache.org/viewvc?rev=1720117&view=rev
Log:
OAK-3774: Tool for detecting references to pre compacted segments
Add weights to edges
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java?rev=1720117&r1=1720116&r2=1720117&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraph.java Tue Dec 15 11:24:17 2015
@@ -41,6 +41,8 @@ import javax.annotation.Nullable;
import com.google.common.base.Function;
import com.google.common.base.Functions;
+import com.google.common.collect.HashMultiset;
+import com.google.common.collect.Multiset;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.json.JsonObject;
import org.apache.jackrabbit.oak.commons.json.JsopTokenizer;
@@ -74,23 +76,53 @@ public final class SegmentGraph {
*/
public static class Graph<T> {
/** The vertices of this graph */
- public final Set<T> vertices = newHashSet();
+ private final Set<T> vertices = newHashSet();
/** The edges of this graph */
- public final Map<T, Set<T>> edges = newHashMap();
+ private final Map<T, Multiset<T>> edges = newHashMap();
private void addVertex(T vertex) {
vertices.add(vertex);
}
private void addEdge(T from, T to) {
- Set<T> tos = edges.get(from);
+ Multiset<T> tos = edges.get(from);
if (tos == null) {
- tos = newHashSet();
+ tos = HashMultiset.create();
edges.put(from, tos);
}
tos.add(to);
}
+
+ /**
+ * @return the vertices of this graph
+ */
+ public Iterable<T> vertices() {
+ return vertices;
+ }
+
+ /**
+ * @param vertex
+ * @return {@code true} iff this graph contains {@code vertex}
+ */
+ public boolean containsVertex(T vertex) {
+ return vertices.contains(vertex);
+ }
+
+ /**
+ * @return the edges of this graph
+ */
+ public Set<Entry<T, Multiset<T>>> edges() {
+ return edges.entrySet();
+ }
+
+ /**
+ * @param from
+ * @return the edges from {@code from} or {@code null} if none.
+ */
+ public Multiset<T> getEdge(T from) {
+ return edges.get(from);
+ }
}
/**
@@ -122,16 +154,16 @@ public final class SegmentGraph {
Graph<UUID> headGraph = parseHeadGraph(root.getRecordId());
writer.write("nodedef>name VARCHAR, label VARCHAR, type VARCHAR, wid VARCHAR, gc INT, t INT, head BOOLEAN\n");
- for (UUID segment : segmentGraph.vertices) {
- writeNode(segment, writer, headGraph.vertices.contains(segment), epoch, fileStore.getTracker());
+ for (UUID segment : segmentGraph.vertices()) {
+ writeNode(segment, writer, headGraph.containsVertex(segment), epoch, fileStore.getTracker());
}
writer.write("edgedef>node1 VARCHAR, node2 VARCHAR, head BOOLEAN\n");
- for (Entry<UUID, Set<UUID>> edge : segmentGraph.edges.entrySet()) {
+ for (Entry<UUID, Multiset<UUID>> edge : segmentGraph.edges()) {
UUID from = edge.getKey();
for (UUID to : edge.getValue()) {
if (!from.equals(to)) {
- Set<UUID> he = headGraph.edges.get(from);
+ Multiset<UUID> he = headGraph.getEdge(from);
boolean inHead = he != null && he.contains(to);
writer.write(from + "," + to + "," + inHead + "\n");
}
@@ -175,16 +207,17 @@ public final class SegmentGraph {
Graph<String> gcGraph = parseGCGraph(checkNotNull(fileStore));
writer.write("nodedef>name VARCHAR\n");
- for (String gen : gcGraph.vertices) {
+ for (String gen : gcGraph.vertices()) {
writer.write(gen + "\n");
}
- writer.write("edgedef>node1 VARCHAR, node2 VARCHAR\n");
- for (Entry<String, Set<String>> edge : gcGraph.edges.entrySet()) {
+ writer.write("edgedef>node1 VARCHAR, node2 VARCHAR, weight INT\n");
+ for (Entry<String, Multiset<String>> edge : gcGraph.edges()) {
String from = edge.getKey();
- for (String to : edge.getValue()) {
+ Multiset<String> tos = edge.getValue();
+ for (String to : tos.elementSet()) {
if (!from.equals(to) && !to.isEmpty()) {
- writer.write(from + "," + to + "\n");
+ writer.write(from + "," + to + "," + tos.count(to) + "\n");
}
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java?rev=1720117&r1=1720116&r2=1720117&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentGraphTest.java Tue Dec 15 11:24:17 2015
@@ -31,12 +31,14 @@ import static org.junit.Assert.assertEqu
import java.io.File;
import java.io.IOException;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
import javax.annotation.Nonnull;
+import com.google.common.collect.Multiset;
import org.apache.jackrabbit.oak.plugins.segment.SegmentGraph.Graph;
import org.apache.jackrabbit.oak.plugins.segment.compaction.CompactionStrategy;
import org.apache.jackrabbit.oak.plugins.segment.compaction.CompactionStrategy.CleanupType;
@@ -142,8 +144,8 @@ public class SegmentGraphTest {
ReadOnlyStore store = new ReadOnlyStore(storeDir);
try {
Graph<UUID> segmentGraph = parseSegmentGraph(store);
- assertEquals(segments, segmentGraph.vertices);
- assertEquals(references, segmentGraph.edges);
+ assertEquals(segments, newHashSet(segmentGraph.vertices()));
+ assertEquals(references, toMap(segmentGraph.edges()));
} finally {
store.close();
}
@@ -154,10 +156,18 @@ public class SegmentGraphTest {
ReadOnlyStore store = new ReadOnlyStore(storeDir);
try {
Graph<String> gcGraph = SegmentGraph.parseGCGraph(store);
- assertEquals(gcGenerations, gcGraph.vertices);
- assertEquals(gcReferences, gcGraph.edges);
+ assertEquals(gcGenerations, newHashSet(gcGraph.vertices()));
+ assertEquals(gcReferences, toMap(gcGraph.edges()));
} finally {
store.close();
}
}
+
+ private static <T> Map<T, Set<T>> toMap(Set<Entry<T, Multiset<T>>> entries) {
+ Map<T, Set<T>> map = newHashMap();
+ for (Entry<T, Multiset<T>> entry : entries) {
+ map.put(entry.getKey(), entry.getValue().elementSet());
+ }
+ return map;
+ }
}