Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java (revision 1608464) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/backup/FileStoreRestore.java (working copy) @@ -22,12 +22,13 @@ 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 @@ // 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; Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (revision 1608464) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Compactor.java (working copy) @@ -74,11 +74,15 @@ 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() {