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/07/09 15:13:53 UTC

svn commit: r1609140 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins: backup/FileStoreRestore.java segment/Compactor.java

Author: alexparvulescu
Date: Wed Jul  9 13:13:53 2014
New Revision: 1609140

URL: http://svn.apache.org/r1609140
Log:
OAK-1946 Restore: "Attempt to read external blob" error


Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java?rev=1609140&r1=1609139&r2=1609140&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java Wed Jul  9 13:13:53 2014
@@ -22,12 +22,13 @@ import java.io.File;
 import java.io.IOException;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.plugins.segment.Compactor;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
-import org.apache.jackrabbit.oak.spi.state.ApplyDiff;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.slf4j.Logger;
@@ -52,24 +53,37 @@ public class FileStoreRestore {
 
         // 2. init filestore
         FileStore restore = new FileStore(source, MAX_FILE_SIZE, false);
+        SegmentWriter writer = restore.getTracker().getWriter();
         try {
             SegmentNodeState state = restore.getHead();
-            restore(state.getChildNode("root"), store);
+            restore(state.getChildNode("root"), store, writer);
         } finally {
             restore.close();
         }
     }
 
-    public static void restore(NodeState source, NodeStore store)
-            throws CommitFailedException {
+    private static void restore(NodeState source, NodeStore store,
+            SegmentWriter writer) throws CommitFailedException {
         long s = System.currentTimeMillis();
-        NodeState after = store.getRoot();
-        NodeBuilder builder = after.builder();
-        source.compareAgainstBaseState(after, new ApplyDiff(builder));
+        NodeState current = store.getRoot();
+        RestoreCompactor compactor = new RestoreCompactor(writer);
+        SegmentNodeBuilder builder = compactor.process(current, source);
         store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
         log.debug("Restore finished in {} ms.", System.currentTimeMillis() - s);
     }
 
+    private static class RestoreCompactor extends Compactor {
+
+        public RestoreCompactor(SegmentWriter writer) {
+            super(writer);
+        }
+
+        @Override
+        protected SegmentNodeBuilder process(NodeState before, NodeState after) {
+            return super.process(before, after);
+        }
+    }
+
     private static boolean validFileStore(File source) {
         if (source == null || !source.isDirectory()) {
             return false;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java?rev=1609140&r1=1609139&r2=1609140&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java Wed Jul  9 13:13:53 2014
@@ -74,11 +74,15 @@ public class Compactor {
         this.writer = writer;
     }
 
-    public SegmentNodeState compact(NodeState before, NodeState after) {
+    protected SegmentNodeBuilder process(NodeState before, NodeState after) {
         SegmentNodeBuilder builder = new SegmentNodeBuilder(
                 writer.writeNode(before), writer);
         after.compareAgainstBaseState(before, new CompactDiff(builder));
-        return builder.getNodeState();
+        return builder;
+    }
+
+    public SegmentNodeState compact(NodeState before, NodeState after) {
+        return process(before, after).getNodeState();
     }
 
     public CompactionMap getCompactionMap() {