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 al...@apache.org on 2014/08/29 12:11:08 UTC

svn commit: r1621278 - in /jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak: explorer/NodeStoreTree.java run/Main.java

Author: alexparvulescu
Date: Fri Aug 29 10:11:08 2014
New Revision: 1621278

URL: http://svn.apache.org/r1621278
Log:
OAK-2061 Oak run debug option to list content from a tar file

Modified:
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java
    jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java?rev=1621278&r1=1621277&r2=1621278&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java Fri Aug 29 10:11:08 2014
@@ -30,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.UUID;
 
 import javax.jcr.PropertyType;
@@ -60,7 +61,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import com.google.common.collect.Lists;
 import com.google.common.escape.Escapers;
 
-class NodeStoreTree extends JPanel implements TreeSelectionListener {
+public class NodeStoreTree extends JPanel implements TreeSelectionListener {
 
     private final FileStore store;
 
@@ -300,17 +301,19 @@ class NodeStoreTree extends JPanel imple
         log.setText(sb.toString());
     }
 
-    private static void filterNodeStates(Set<UUID> uuids, List<String> paths,
+    public static void filterNodeStates(Set<UUID> uuids, List<String> paths,
             SegmentNodeState state, String path) {
+        Set<String> localPaths = new TreeSet<String>();
         for (PropertyState ps : state.getProperties()) {
             if (ps instanceof SegmentPropertyState) {
                 SegmentPropertyState sps = (SegmentPropertyState) ps;
                 SegmentId id = sps.getRecordId().getSegmentId();
                 if (contains(id, uuids)) {
-                    paths.add(path + "@" + ps);
+                    localPaths.add(path + "@" + ps);
                 }
             }
         }
+        paths.addAll(localPaths);
         for (ChildNodeEntry ce : state.getChildNodeEntries()) {
             NodeState c = ce.getNodeState();
             if (c instanceof SegmentNodeState) {

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1621278&r1=1621277&r2=1621278&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java Fri Aug 29 10:11:08 2014
@@ -26,9 +26,11 @@ import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.URL;
 import java.sql.Timestamp;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -36,6 +38,7 @@ import java.util.Properties;
 import java.util.Queue;
 import java.util.Set;
 import java.util.UUID;
+import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -62,6 +65,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.console.Console;
 import org.apache.jackrabbit.oak.explorer.Explorer;
+import org.apache.jackrabbit.oak.explorer.NodeStoreTree;
 import org.apache.jackrabbit.oak.fixture.OakFixture;
 import org.apache.jackrabbit.oak.http.OakServlet;
 import org.apache.jackrabbit.oak.jcr.Jcr;
@@ -254,7 +258,7 @@ public class Main {
         final OptionSpec<String> host = parser.accepts("host", "master host").withRequiredArg().ofType(String.class).defaultsTo(defaultHost);
         final OptionSpec<Integer> port = parser.accepts("port", "master port").withRequiredArg().ofType(Integer.class).defaultsTo(defaultPort);
         final OptionSpec<Integer> interval = parser.accepts("interval", "interval between successive executions").withRequiredArg().ofType(Integer.class);
-        final OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp();
+        final OptionSpec<?> help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp();
         final OptionSpec<String> nonOption = parser.nonOptions(Mode.SYNCSLAVE + " <path to repository>");
 
         final OptionSet options = parser.parse(args);
@@ -503,121 +507,172 @@ public class Main {
             FileStore store = new FileStore(file, 256, false);
             try {
                 if (args.length == 1) {
-                    Map<SegmentId, List<SegmentId>> idmap = Maps.newHashMap();
-
-                    int dataCount = 0;
-                    long dataSize = 0;
-                    int bulkCount = 0;
-                    long bulkSize = 0;
-                    for (SegmentId id : store.getSegmentIds()) {
-                        if (id.isDataSegmentId()) {
-                            Segment segment = id.getSegment();
-                            dataCount++;
-                            dataSize += segment.size();
-                            idmap.put(id, segment.getReferencedIds());
-                        } else if (id.isBulkSegmentId()) {
-                            bulkCount++;
-                            bulkSize += id.getSegment().size();
-                            idmap.put(id, Collections.<SegmentId>emptyList());
-                        }
+                    debugFileStore(store);
+                } else {
+                    if (args[1].endsWith(".tar")) {
+                        debugTarFile(store, args);
+                    } else {
+                        debugSegment(store, args);
                     }
-                    System.out.println("Total size:");
-                    System.out.format(
-                            "%6dMB in %6d data segments%n",
-                            dataSize / (1024 * 1024), dataCount);
-                    System.out.format(
-                            "%6dMB in %6d bulk segments%n",
-                            bulkSize / (1024 * 1024), bulkCount);
-
-                    Set<SegmentId> garbage = newHashSet(idmap.keySet());
-                    Queue<SegmentId> queue = Queues.newArrayDeque();
-                    queue.add(store.getHead().getRecordId().getSegmentId());
-                    while (!queue.isEmpty()) {
-                        SegmentId id = queue.remove();
-                        if (garbage.remove(id)) {
-                            queue.addAll(idmap.get(id));
-                        }
+                }
+            } finally {
+                store.close();
+            }
+        }
+    }
+
+    private static void debugTarFile(FileStore store, String[] args) {
+        File root = new File(args[0]);
+        for (int i = 1; i < args.length; i++) {
+            String f = args[i];
+            if (!f.endsWith(".tar")) {
+                System.out.println("skipping " + f);
+                continue;
+            }
+            File tar = new File(root, f);
+            if (!tar.exists()) {
+                System.out.println("file doesn't exist, skipping " + f);
+                continue;
+            }
+            System.out.println("Debug file " + tar + "(" + tar.length() + ")");
+            Set<UUID> uuids = new HashSet<UUID>();
+            boolean hasrefs = false;
+            for (Entry<String, Set<UUID>> e : store.getTarReaderIndex()
+                    .entrySet()) {
+                if (e.getKey().endsWith(f)) {
+                    hasrefs = true;
+                    uuids = e.getValue();
+                }
+            }
+            if (hasrefs) {
+                System.out.println("SegmentNodeState references to " + f);
+                List<String> paths = new ArrayList<String>();
+                NodeStoreTree.filterNodeStates(uuids, paths, store.getHead(),
+                        "/");
+                for (String p : paths) {
+                    System.out.println("  " + p);
+                }
+            } else {
+                System.out.println("No references to " + f);
+            }
+        }
+    }
+
+    private static void debugSegment(FileStore store, String[] args) {
+        Pattern pattern = Pattern
+                .compile("([0-9a-f-]+)|(([0-9a-f-]+:[0-9a-f]+)(-([0-9a-f-]+:[0-9a-f]+))?)?(/.*)?");
+        for (int i = 1; i < args.length; i++) {
+            Matcher matcher = pattern.matcher(args[i]);
+            if (!matcher.matches()) {
+                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(
+                        uuid.getMostSignificantBits(),
+                        uuid.getLeastSignificantBits());
+                System.out.println(id.getSegment());
+            } else {
+                RecordId id1 = store.getHead().getRecordId();
+                RecordId id2 = null;
+                if (matcher.group(2) != null) {
+                    id1 = RecordId.fromString(store.getTracker(),
+                            matcher.group(3));
+                    if (matcher.group(4) != null) {
+                        id2 = RecordId.fromString(store.getTracker(),
+                                matcher.group(5));
                     }
-                    dataCount = 0;
-                    dataSize = 0;
-                    bulkCount = 0;
-                    bulkSize = 0;
-                    for (SegmentId id : garbage) {
-                        if (id.isDataSegmentId()) {
-                            dataCount++;
-                            dataSize += id.getSegment().size();
-                        } else if (id.isBulkSegmentId()) {
-                            bulkCount++;
-                            bulkSize += id.getSegment().size();
+                }
+                String path = "/";
+                if (matcher.group(6) != null) {
+                    path = matcher.group(6);
+                }
+
+                if (id2 == null) {
+                    NodeState node = new SegmentNodeState(id1);
+                    System.out.println("/ (" + id1 + ") -> " + node);
+                    for (String name : PathUtils.elements(path)) {
+                        node = node.getChildNode(name);
+                        RecordId nid = null;
+                        if (node instanceof SegmentNodeState) {
+                            nid = ((SegmentNodeState) node).getRecordId();
                         }
+                        System.out.println("  " + name + " (" + nid + ") -> "
+                                + node);
                     }
-                    System.out.println("Available for garbage collection:");
-                    System.out.format(
-                            "%6dMB in %6d data segments%n",
-                            dataSize / (1024 * 1024), dataCount);
-                    System.out.format(
-                            "%6dMB in %6d bulk segments%n",
-                            bulkSize / (1024 * 1024), bulkCount);
                 } else {
-                    Pattern pattern = Pattern.compile(
-                            "([0-9a-f-]+)|(([0-9a-f-]+:[0-9a-f]+)(-([0-9a-f-]+:[0-9a-f]+))?)?(/.*)?");
-                    for (int i = 1; i < args.length; i++) {
-                        Matcher matcher = pattern.matcher(args[i]);
-                        if (!matcher.matches()) {
-                            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(
-                                    uuid.getMostSignificantBits(),
-                                    uuid.getLeastSignificantBits());
-                            System.out.println(id.getSegment());
-                        } else {
-                            RecordId id1 = store.getHead().getRecordId();
-                            RecordId id2 = null;
-                            if (matcher.group(2) != null) {
-                                id1 = RecordId.fromString(
-                                        store.getTracker(), matcher.group(3));
-                                if (matcher.group(4) != null) {
-                                    id2 = RecordId.fromString(
-                                            store.getTracker(), matcher.group(5));
-                                }
-                            }
-                            String path = "/";
-                            if (matcher.group(6) != null) {
-                                path = matcher.group(6);
-                            }
-
-                            if (id2 == null) {
-                                NodeState node = new SegmentNodeState(id1);
-                                System.out.println("/ (" + id1 + ") -> " + node);
-                                for (String name : PathUtils.elements(path)) {
-                                    node = node.getChildNode(name);
-                                    RecordId nid = null;
-                                    if (node instanceof SegmentNodeState) {
-                                        nid = ((SegmentNodeState) node).getRecordId();
-                                    }
-                                    System.out.println(
-                                            "  " + name  + " (" + nid + ") -> " + node);
-                                }
-                            } else {
-                                NodeState node1 = new SegmentNodeState(id1);
-                                NodeState node2 = new SegmentNodeState(id2);
-                                for (String name : PathUtils.elements(path)) {
-                                    node1 = node1.getChildNode(name);
-                                    node2 = node2.getChildNode(name);
-                                }
-                                System.out.println(JsopBuilder.prettyPrint(
-                                        JsopDiff.diffToJsop(node1, node2)));
-                            }
-                        }
+                    NodeState node1 = new SegmentNodeState(id1);
+                    NodeState node2 = new SegmentNodeState(id2);
+                    for (String name : PathUtils.elements(path)) {
+                        node1 = node1.getChildNode(name);
+                        node2 = node2.getChildNode(name);
                     }
+                    System.out.println(JsopBuilder.prettyPrint(JsopDiff
+                            .diffToJsop(node1, node2)));
                 }
-            } finally {
-                store.close();
             }
         }
     }
 
+    private static void debugFileStore(FileStore store){
+
+        Map<SegmentId, List<SegmentId>> idmap = Maps.newHashMap();
+
+        int dataCount = 0;
+        long dataSize = 0;
+        int bulkCount = 0;
+        long bulkSize = 0;
+        for (SegmentId id : store.getSegmentIds()) {
+            if (id.isDataSegmentId()) {
+                Segment segment = id.getSegment();
+                dataCount++;
+                dataSize += segment.size();
+                idmap.put(id, segment.getReferencedIds());
+            } else if (id.isBulkSegmentId()) {
+                bulkCount++;
+                bulkSize += id.getSegment().size();
+                idmap.put(id, Collections.<SegmentId>emptyList());
+            }
+        }
+        System.out.println("Total size:");
+        System.out.format(
+                "%6dMB in %6d data segments%n",
+                dataSize / (1024 * 1024), dataCount);
+        System.out.format(
+                "%6dMB in %6d bulk segments%n",
+                bulkSize / (1024 * 1024), bulkCount);
+
+        Set<SegmentId> garbage = newHashSet(idmap.keySet());
+        Queue<SegmentId> queue = Queues.newArrayDeque();
+        queue.add(store.getHead().getRecordId().getSegmentId());
+        while (!queue.isEmpty()) {
+            SegmentId id = queue.remove();
+            if (garbage.remove(id)) {
+                queue.addAll(idmap.get(id));
+            }
+        }
+        dataCount = 0;
+        dataSize = 0;
+        bulkCount = 0;
+        bulkSize = 0;
+        for (SegmentId id : garbage) {
+            if (id.isDataSegmentId()) {
+                dataCount++;
+                dataSize += id.getSegment().size();
+            } else if (id.isBulkSegmentId()) {
+                bulkCount++;
+                bulkSize += id.getSegment().size();
+            }
+        }
+        System.out.println("Available for garbage collection:");
+        System.out.format(
+                "%6dMB in %6d data segments%n",
+                dataSize / (1024 * 1024), dataCount);
+        System.out.format(
+                "%6dMB in %6d bulk segments%n",
+                bulkSize / (1024 * 1024), bulkCount);
+    
+    }
+
     /**
      * Checks if the provided directory is a valid FileStore
      * 
@@ -713,7 +768,7 @@ public class Main {
         OptionSpec<String> dbName = parser.accepts("db", "MongoDB database").withRequiredArg();
         OptionSpec<Integer> clusterIds = parser.accepts("clusterIds", "Cluster Ids").withOptionalArg().ofType(Integer.class).withValuesSeparatedBy(',');
         OptionSpec<String> nonOption = parser.nonOptions();
-        OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp();
+        OptionSpec<?> help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp();
         OptionSet options = parser.parse(args);
 
         if (options.has(help)) {
@@ -853,6 +908,7 @@ public class Main {
 
             // 2 - Webdav Server on JCR repository
             final Repository jcrRepository = jcr.createRepository();
+            @SuppressWarnings("serial")
             ServletHolder webdav = new ServletHolder(new SimpleWebdavServlet() {
                 @Override
                 public Repository getRepository() {
@@ -864,6 +920,7 @@ public class Main {
             context.addServlet(webdav, path + "/webdav/*");
 
             // 3 - JCR Remoting Server
+            @SuppressWarnings("serial")
             ServletHolder jcrremote = new ServletHolder(new JcrRemotingServlet() {
                 @Override
                 protected Repository getRepository() {