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