Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java (revision 1746478) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreBackup.java (working copy) @@ -24,8 +24,12 @@ import java.io.File; import java.io.IOException; -import com.google.common.base.Stopwatch; +import org.apache.jackrabbit.oak.segment.Compactor; +import org.apache.jackrabbit.oak.segment.SegmentBufferWriter; +import org.apache.jackrabbit.oak.segment.SegmentNodeState; import org.apache.jackrabbit.oak.segment.SegmentNodeStore; +import org.apache.jackrabbit.oak.segment.SegmentVersion; +import org.apache.jackrabbit.oak.segment.SegmentWriter; import org.apache.jackrabbit.oak.segment.file.FileStore; import org.apache.jackrabbit.oak.segment.file.FileStore.Builder; import org.apache.jackrabbit.oak.segment.file.tooling.BasicReadOnlyBlobStore; @@ -34,12 +38,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Stopwatch; +import com.google.common.base.Suppliers; + public class FileStoreBackup { private static final Logger log = LoggerFactory .getLogger(FileStoreBackup.class); - public static boolean USE_FAKE_BLOBSTORE = Boolean.getBoolean("oak.backup.UseFakeBlobStore"); + public static boolean USE_FAKE_BLOBSTORE = Boolean + .getBoolean("oak.backup.UseFakeBlobStore"); public static void backup(NodeStore store, File destination) throws IOException { @@ -53,16 +61,21 @@ } FileStore backup = builder.build(); try { - // FIXME OAK-4278: Fix backup and restore -// SegmentNodeState state = backup.getRevisions().getHead(); - // Use dedicated implementation instead of compactor. - // This is allows us to decouple and fix problems for online compaction independent - // of backup / restore. -// Compactor compactor = new Compactor(backup.getTracker()); -// compactor.setDeepCheckLargeBinaries(true); -// compactor.setContentEqualityCheck(true); -// SegmentNodeState after = compactor.compact(state, current, state); -// backup.setHead(state, after); + + SegmentNodeState state = backup.getReader().readHeadState(); + // TODO what should be the generation? + SegmentBufferWriter bufferWriter = new SegmentBufferWriter(backup, + backup.getTracker(), backup.getReader(), + SegmentVersion.LATEST_VERSION, "B", 0); + SegmentWriter writer = new SegmentWriter(backup, + backup.getReader(), backup.getBlobStore(), + backup.getTracker(), bufferWriter); + Compactor compactor = new Compactor(backup.getReader(), writer, + backup.getBlobStore(), Suppliers.ofInstance(false)); + compactor.setContentEqualityCheck(true); + SegmentNodeState after = compactor.compact(state, current, state); + backup.getRevisions().setHead(state.getRecordId(), + after.getRecordId()); } finally { backup.close(); } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java (revision 1746478) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/FileStoreRestore.java (working copy) @@ -22,12 +22,19 @@ import java.io.File; import java.io.IOException; -import com.google.common.base.Stopwatch; +import org.apache.jackrabbit.oak.segment.Compactor; +import org.apache.jackrabbit.oak.segment.SegmentBufferWriter; +import org.apache.jackrabbit.oak.segment.SegmentNodeState; +import org.apache.jackrabbit.oak.segment.SegmentVersion; +import org.apache.jackrabbit.oak.segment.SegmentWriter; import org.apache.jackrabbit.oak.segment.file.FileStore; import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Stopwatch; +import com.google.common.base.Suppliers; + public class FileStoreRestore { private static final Logger log = LoggerFactory @@ -48,17 +55,21 @@ Stopwatch watch = Stopwatch.createStarted(); FileStore store = FileStore.builder(destination).build(); - // FIXME OAK-4278: Fix backup and restore -// SegmentNodeState current = store.getRevisions().getHead(); + SegmentNodeState current = store.getReader().readHeadState(); try { - // Use dedicated implementation instead of compactor. - // This is allows us to decouple and fix problems for online compaction independent - // of backup / restore. - // compactor.setDeepCheckLargeBinaries(true); -// Compactor compactor = new Compactor(store.getTracker()); -// SegmentNodeState after = compactor.compact(current, -// restore.getHead(), current); -// store.setHead(current, after); + // TODO what should be the generation? + SegmentBufferWriter bufferWriter = new SegmentBufferWriter(store, + store.getTracker(), store.getReader(), + SegmentVersion.LATEST_VERSION, "R", 0); + SegmentWriter writer = new SegmentWriter(store, store.getReader(), + store.getBlobStore(), store.getTracker(), bufferWriter); + Compactor compactor = new Compactor(store.getReader(), writer, + store.getBlobStore(), Suppliers.ofInstance(false)); + compactor.setContentEqualityCheck(true); + SegmentNodeState after = compactor.compact(current, restore + .getReader().readHeadState(), current); + store.getRevisions().setHead(current.getRecordId(), + after.getRecordId()); } finally { restore.close(); store.close(); Index: oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java =================================================================== --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java (revision 1746478) +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/backup/FileStoreBackupTest.java (working copy) @@ -38,13 +38,10 @@ import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -@Ignore -// FIXME OAK-4278: Fix backup and restore public class FileStoreBackupTest { private File src; @@ -100,13 +97,18 @@ NodeBuilder builder = store.getRoot().builder(); NodeBuilder c = builder.child("test-backup").child("binaries"); for (int i = 0; i < 2; i++) { - c.setProperty("bin" + i, createBlob(store, 64 * 1024)); + c.setProperty("binS" + i, createBlob(store, 6 * 1024)); + } + + for (int i = 0; i < 2; i++) { + c.setProperty("binL" + i, createBlob(store, 64 * 1024)); } builder.child("root"); // make sure we don't backup the super-root store.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); } - private static Blob createBlob(NodeStore nodeStore, int size) throws IOException { + private static Blob createBlob(NodeStore nodeStore, int size) + throws IOException { byte[] data = new byte[size]; new Random().nextBytes(data); return nodeStore.createBlob(new ByteArrayInputStream(data)); @@ -114,8 +116,10 @@ private static void compare(FileStore store, File destination) throws IOException { - FileStore backup = FileStore.builder(destination).withMaxFileSize(8).build(); - assertEquals(store.getRevisions().getHead(), backup.getRevisions().getHead()); + FileStore backup = FileStore.builder(destination).withMaxFileSize(8) + .build(); + assertEquals(store.getReader().readHeadState(), backup.getReader() + .readHeadState()); backup.close(); }