Author: mduerig Date: Thu Apr 20 12:26:38 2017 New Revision: 1792048 URL: http://svn.apache.org/viewvc?rev=1792048&view=rev Log: OAK-6110: Offline compaction uses too much memory Test case
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.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=1792048&r1=1792047&r2=1792048&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 Thu Apr 20 12:26:38 2017 @@ -339,10 +339,31 @@ public class CompactionAndCleanupIT { } } - /** - * Create 2 binary nodes with same content but not same reference. Verify - * de-duplication capabilities of compaction. - */ + @Test + public void equalContentAfterOC() throws Exception { + SegmentGCOptions gcOptions = defaultGCOptions().setOffline(); + ScheduledExecutorService executor = newSingleThreadScheduledExecutor(); + + try (FileStore fileStore = fileStoreBuilder(getFileStoreFolder()) + .withGCOptions(gcOptions) + .build()) { + SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); + + // Add initial content + NodeBuilder rootBuilder = nodeStore.getRoot().builder(); + addNodes(rootBuilder, 8, "p"); + addProperties(rootBuilder, 3); + nodeStore.merge(rootBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + + NodeState initialRoot = nodeStore.getRoot(); + assertTrue(fileStore.compact()); + NodeState compactedRoot = nodeStore.getRoot(); + + assertTrue(initialRoot != compactedRoot); + assertEquals(initialRoot, compactedRoot); + } + } + @Test public void offlineCompactionBinC1() throws Exception { SegmentGCOptions gcOptions = defaultGCOptions().setOffline() @@ -647,6 +668,15 @@ public class CompactionAndCleanupIT { } } + private static void addProperties(NodeBuilder builder, int count) { + for (int c = 0; c < count; c++) { + builder.setProperty("p-" + c, "v-" + c); + } + for (String child : builder.getChildNodeNames()) { + addProperties(builder.getChildNode(child), count); + } + } + /** * Regression test for OAK-2192 testing for mixed segments. This test does not * cover OAK-3348. I.e. it does not assert the segment graph is free of cross Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java?rev=1792048&r1=1792047&r2=1792048&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java Thu Apr 20 12:26:38 2017 @@ -19,7 +19,9 @@ package org.apache.jackrabbit.oak.segmen import static java.lang.Integer.getInteger; import static java.lang.System.getProperty; +import static org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.defaultGCOptions; import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder; +import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import java.io.File; @@ -69,6 +71,7 @@ public class ManyChildNodesIT { .withStringDeduplicationCacheSize(0) .withTemplateDeduplicationCacheSize(0) .withNodeDeduplicationCacheSize(1) + .withGCOptions(defaultGCOptions().setOffline()) .build(); } @@ -94,6 +97,20 @@ public class ManyChildNodesIT { } } + /** + * Offline compaction should be able to deal with many child nodes in constant memory. + */ + @Test + public void manyChildNodesOC() throws Exception { + try (FileStore fileStore = createFileStore()) { + SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); + NodeBuilder root = nodeStore.getRoot().builder(); + addManyNodes(root); + nodeStore.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY); + assertTrue(fileStore.compact()); + } + } + private static void addManyNodes(NodeBuilder builder) { for (int k = 0; k < NODE_COUNT; k++) { builder.setChildNode("c-" + k);