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);


Reply via email to