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