Author: mduerig
Date: Mon Apr 20 10:19:54 2015
New Revision: 1674780

URL: http://svn.apache.org/r1674780
Log:
OAK-2713: High memory usage of CompactionMap
Better random trees

Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java?rev=1674780&r1=1674779&r2=1674780&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentCompactionIT.java
 Mon Apr 20 10:19:54 2015
@@ -374,29 +374,62 @@ public class SegmentCompactionIT {
                 throws IOException {
             int k = rnd.nextInt(100);
             if (k < 10) {
-                if (!nodeBuilder.remove()) {
-                    descent(nodeStore, nodeBuilder, deleteOnly);
-                }
-            } else if (k < 40 && !deleteOnly)  {
-                nodeBuilder.setChildNode('N' + itemPrefix + rnd.nextInt(1000));
+                chooseRandomNode(nodeBuilder).remove();
+            } else if (k < 20) {
+                removeRandomProperty(chooseRandomNode(nodeBuilder));
+            } else if (k < 60 && !deleteOnly)  {
+                addRandomNode(nodeBuilder);
             } else if (k < 80 && !deleteOnly) {
-                nodeBuilder.setProperty('P' + itemPrefix + rnd.nextInt(1000),
-                        randomAlphabetic(rnd.nextInt(10000)));
-            } else if (k < 90 && !deleteOnly) {
-                nodeBuilder.setProperty('B' + itemPrefix + rnd.nextInt(1000),
-                        createBlob(nodeStore, rnd.nextInt(maxBlobSize)));
+                addRandomValue(nodeBuilder);
+            } else if (!deleteOnly) {
+                addRandomBlob(nodeStore, nodeBuilder);
+            }
+        }
+
+        private NodeBuilder chooseRandomNode(NodeBuilder nodeBuilder) {
+            NodeBuilder childBuilder = nodeBuilder;
+            for (int k = 0; k < rnd.nextInt(1000); k++) {
+                childBuilder = randomStep(nodeBuilder, nodeBuilder = 
childBuilder);
+            }
+            return childBuilder;
+        }
+
+        private NodeBuilder randomStep(NodeBuilder parent, NodeBuilder node) {
+            int count = (int) node.getChildNodeCount(Long.MAX_VALUE);
+            int k = rnd.nextInt(count + 1);
+            if (k == 0) {
+                return parent;
             } else {
-                descent(nodeStore, nodeBuilder, deleteOnly);
+                String name = get(node.getChildNodeNames(), k - 1);
+                return node.getChildNode(name);
             }
         }
 
-        private void descent(NodeStore nodeStore, NodeBuilder nodeBuilder, 
boolean deleteOnly)
-                throws IOException {
-            long count = nodeBuilder.getChildNodeCount(Long.MAX_VALUE);
+        private void removeRandomProperty(NodeBuilder nodeBuilder) {
+            int count = (int) nodeBuilder.getPropertyCount();
             if (count > 0) {
-                int c = rnd.nextInt((int) count);
-                String name = get(nodeBuilder.getChildNodeNames(), c);
-                modify(nodeStore, nodeBuilder.getChildNode(name), deleteOnly);
+                PropertyState property = get(nodeBuilder.getProperties(), 
rnd.nextInt(count));
+                nodeBuilder.removeProperty(property.getName());
+            }
+        }
+
+        private void addRandomNode(NodeBuilder nodeBuilder) {
+            if (nodeBuilder.getChildNodeCount(1000) < 1000) {
+                chooseRandomNode(nodeBuilder).setChildNode('N' + itemPrefix + 
rnd.nextInt(1000));
+            }
+        }
+
+        private void addRandomValue(NodeBuilder nodeBuilder) {
+            if (nodeBuilder.getPropertyCount() < 1000) {
+                chooseRandomNode(nodeBuilder).setProperty('P' + itemPrefix + 
rnd.nextInt(1000),
+                        randomAlphabetic(rnd.nextInt(10000)));
+            }
+        }
+
+        private void addRandomBlob(NodeStore nodeStore, NodeBuilder 
nodeBuilder) throws IOException {
+            if (nodeBuilder.getPropertyCount() < 1000) {
+                chooseRandomNode(nodeBuilder).setProperty('B' + itemPrefix + 
rnd.nextInt(1000),
+                        createBlob(nodeStore, rnd.nextInt(maxBlobSize)));
             }
         }
 
@@ -416,16 +449,26 @@ public class SegmentCompactionIT {
             this.nodeStore = nodeStore;
         }
 
-        protected final NodeState readRandomTree(NodeState node) {
-            int i = rnd.nextInt(1 + (int) 
node.getChildNodeCount(Long.MAX_VALUE));
-            if (i != 0) {
-                return readRandomTree(get(node.getChildNodeEntries(), i - 
1).getNodeState());
+        private NodeState randomStep(NodeState parent, NodeState node) {
+            int count = (int) node.getChildNodeCount(Long.MAX_VALUE);
+            int k = rnd.nextInt(count + 1);
+            if (k == 0) {
+                return parent;
             } else {
-                return node;
+                String name = get(node.getChildNodeNames(), k - 1);
+                return node.getChildNode(name);
+            }
+        }
+
+        protected final NodeState chooseRandomNode(NodeState parent) {
+            NodeState child = parent;
+            for (int k = 0; k < rnd.nextInt(1000); k++) {
+                child = randomStep(parent, parent = child);
             }
+            return child;
         }
 
-        protected final PropertyState readRandomProperty(NodeState node) 
throws Exception {
+        protected final PropertyState chooseRandomProperty(NodeState node) 
throws Exception {
             int count = (int) node.getPropertyCount();
             if (count > 0) {
                 return get(node.getProperties(), rnd.nextInt(count));
@@ -442,7 +485,7 @@ public class SegmentCompactionIT {
 
         @Override
         public NodeState call() throws Exception {
-            return readRandomTree(nodeStore.getRoot());
+            return chooseRandomNode(nodeStore.getRoot());
         }
     }
 
@@ -453,7 +496,7 @@ public class SegmentCompactionIT {
 
         @Override
         public PropertyState call() throws Exception {
-            return readRandomProperty(readRandomTree(nodeStore.getRoot()));
+            return chooseRandomProperty(chooseRandomNode(nodeStore.getRoot()));
         }
     }
 


Reply via email to