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/12/14 13:03:25 UTC

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

Author: alexparvulescu
Date: Sun Dec 14 12:03:25 2014
New Revision: 1645446

URL: http://svn.apache.org/r1645446
Log:
OAK-2334 Inspect any revision with SegmentMK explorer

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

Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java?rev=1645446&r1=1645445&r2=1645446&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/explorer/Explorer.java Sun Dec 14 12:03:25 2014
@@ -41,7 +41,10 @@ import javax.swing.JTextArea;
 import javax.swing.UIManager;
 import javax.swing.UIManager.LookAndFeelInfo;
 
-import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore.ReadOnlyStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.JournalReader;
+
+import com.google.common.collect.Lists;
 
 /**
  * NodeStore explorer
@@ -64,7 +67,7 @@ public class Explorer {
         }
 
         final String path = args[0];
-        final FileStore store = new FileStore(new File(path), 256);
+        final ReadOnlyStore store = new ReadOnlyStore(new File(path));
         final boolean skipSizeCheck = args.length == 2
                 && skip.equalsIgnoreCase(args[1]);
 
@@ -90,8 +93,8 @@ public class Explorer {
         }
     }
 
-    private void createAndShowGUI(final String path, final FileStore store, boolean skipSizeCheck) {
-        final JFrame frame = new JFrame("Explore " + path);
+    private void createAndShowGUI(final String path, final ReadOnlyStore store, boolean skipSizeCheck) {
+        final JFrame frame = new JFrame("Explore " + path + " @head");
         frame.addWindowListener(new java.awt.event.WindowAdapter() {
             @Override
             public void windowClosing(java.awt.event.WindowEvent windowEvent) {
@@ -123,22 +126,50 @@ public class Explorer {
         JMenuBar menuBar = new JMenuBar();
         menuBar.setMargin(new Insets(2, 2, 2, 2));
 
-        JMenuItem menuCompaction = new JMenuItem("Tar Compaction");
-        menuCompaction.setMnemonic(KeyEvent.VK_C);
+        JMenuItem menuCompaction = new JMenuItem("Time Machine");
+        menuCompaction.setMnemonic(KeyEvent.VK_T);
         menuCompaction.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent ev) {
-                int run = JOptionPane.showConfirmDialog(frame,
-                        "Run compaction on the tar files", "Tar Compaction",
-                        JOptionPane.WARNING_MESSAGE, JOptionPane.YES_NO_OPTION);
-                if (run == JOptionPane.YES_OPTION) {
-                    treePanel.compact();
+                List<String> revs = new ArrayList<String>();
+
+                File journal = new File(path, "journal.log");
+                if (!journal.exists()) {
+                    return;
+                }
+
+                JournalReader journalReader = null;
+                try {
+                    journalReader = new JournalReader(journal);
+                    try {
+                        revs = Lists.newArrayList(journalReader.iterator());
+                    } finally {
+                        journalReader.close();
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    return;
+                } finally {
+                    try {
+                        if (journalReader != null) {
+                            journalReader.close();
+                        }
+                    } catch (IOException e) {
+                    }
+                }
+
+                String s = (String) JOptionPane.showInputDialog(frame,
+                        "Revert to a specified revision", "Time Machine",
+                        JOptionPane.PLAIN_MESSAGE, null, revs.toArray(),
+                        revs.get(0));
+                if (s != null && treePanel.revert(s)) {
+                    frame.setTitle("Explore " + path + " @" + s);
                 }
             }
         });
 
         JMenuItem menuRefs = new JMenuItem("Tar File Info");
-        menuRefs.setMnemonic(KeyEvent.VK_R);
+        menuRefs.setMnemonic(KeyEvent.VK_I);
         menuRefs.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent ev) {
@@ -161,7 +192,7 @@ public class Explorer {
         });
 
         JMenuItem menuSCR = new JMenuItem("Segment Content Refs");
-        menuSCR.setMnemonic(KeyEvent.VK_S);
+        menuSCR.setMnemonic(KeyEvent.VK_R);
         menuSCR.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent ev) {

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=1645446&r1=1645445&r2=1645446&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 Sun Dec 14 12:03:25 2014
@@ -60,14 +60,16 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.segment.SegmentId;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStateHelper;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentPropertyState;
 import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+import org.apache.jackrabbit.oak.plugins.segment.file.FileStore.ReadOnlyStore;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 public class NodeStoreTree extends JPanel implements TreeSelectionListener {
 
-    private final FileStore store;
+    private final ReadOnlyStore store;
 
     private DefaultTreeModel treeModel;
     private final JTree tree;
@@ -79,7 +81,7 @@ public class NodeStoreTree extends JPane
     // TODO make this configurable
     private final boolean cacheNodeState = false;
 
-    public NodeStoreTree(FileStore store, JTextArea log, boolean skipSizeCheck) {
+    public NodeStoreTree(ReadOnlyStore store, JTextArea log, boolean skipSizeCheck) {
         super(new GridLayout(1, 0));
         this.store = store;
         this.log = log;
@@ -577,39 +579,35 @@ public class NodeStoreTree extends JPane
         log.setText(sb.toString());
     }
 
-    public void compact() {
-        sizeCache = new HashMap<RecordIdKey, Long[]>();
-        treeModel = null;
-
-        StringBuilder sb = new StringBuilder();
+    public boolean revert(String revision) {
+        return safeRevert(revision, false);
+    }
 
-        long s = System.currentTimeMillis();
-        store.compact();
+    private boolean safeRevert(String revision, boolean rollback) {
+        String head = store.getHead().getRecordId().toString();
+        store.setRevision(revision);
         try {
-            store.flush();
-        } catch (IOException e) {
-            sb.append("IOException " + e.getMessage());
-            e.printStackTrace();
-        }
-        s = System.currentTimeMillis() - s;
-
-        sb.append("Compacted tar segments in " + s + " ms.");
-        sb.append(newline);
-
-        sb.append("File Index");
-        sb.append(newline);
-
-        List<String> files = newArrayList(store.getTarReaderIndex().keySet());
-        Collections.sort(files);
-
-        for (String path : files) {
-            sb.append(path);
+            refreshModel();
+            if (!rollback) {
+                log.setText("Switched head revision to " + revision);
+            }
+        } catch (SegmentNotFoundException e) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("Unable to switch head revision to ");
+            sb.append(revision);
+            sb.append(newline);
+            sb.append("    ");
+            sb.append(e.getMessage());
             sb.append(newline);
+            sb.append("Will rollback to ");
+            sb.append(head);
+            log.setText(sb.toString());
+            return safeRevert(head, true);
         }
-        sb.append("----------");
-        log.setText(sb.toString());
-
-        refreshModel();
+        if (rollback) {
+            return false;
+        }
+        return true;
     }
 
     private static class NamePathModel implements Comparable<NamePathModel> {