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> {