Author: mduerig Date: Tue Dec 12 12:50:03 2017 New Revision: 1817910 URL: http://svn.apache.org/viewvc?rev=1817910&view=rev Log: OAK-7050: Offline compaction corrupts repository Regression test
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java?rev=1817910&r1=1817909&r2=1817910&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java Tue Dec 12 12:50:03 2017 @@ -314,6 +314,44 @@ public class CompactionAndCleanupIT { } } + @Test + public void cancelOfflineCompaction() throws Exception { + final AtomicBoolean cancelCompaction = new AtomicBoolean(true); + try (FileStore fileStore = fileStoreBuilder(getFileStoreFolder()) + .withGCOptions(defaultGCOptions().setOffline()) + .build()) { + SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); + // Create ~2MB of data + NodeBuilder extra = nodeStore.getRoot().builder(); + NodeBuilder content = extra.child("content"); + for (int i = 0; i < 10000; i++) { + NodeBuilder c = content.child("c" + i); + for (int j = 0; j < 1000; j++) { + c.setProperty("p" + i, "v" + i); + } + } + nodeStore.merge(extra, EmptyHook.INSTANCE, CommitInfo.EMPTY); + fileStore.flush(); + NodeState uncompactedRoot = nodeStore.getRoot(); + + // Keep cancelling compaction + new Thread(() -> { + while (cancelCompaction.get()) { + fileStore.cancelGC(); + } + }).start(); + + fileStore.compactFull(); + + // Cancelling compaction must not corrupt the repository. See OAK-7050. + NodeState compactedRoot = nodeStore.getRoot(); + assertTrue(compactedRoot.exists()); + assertEquals(uncompactedRoot, compactedRoot); + } finally { + cancelCompaction.set(false); + } + } + /** * Create a lot of data nodes (no binaries) and a few checkpoints, verify * that compacting checkpoints will not cause the size to explode