Author: catholicon
Date: Thu Mar  1 04:17:20 2018
New Revision: 1825620

URL: http://svn.apache.org/viewvc?rev=1825620&view=rev
Log:
OAK-7290: Reindexing using --doc-traversal-mode should have configurable upper 
bound for mem usage

Implement mem bound in linked list

Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedList.java
    
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedListTest.java

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedList.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedList.java?rev=1825620&r1=1825619&r2=1825620&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedList.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedList.java
 Thu Mar  1 04:17:20 2018
@@ -39,16 +39,31 @@ public class FlatFileBufferLinkedList {
 
     private int size = 0;
     private long memUsage = 0;
+    private final long memLimit;
+
+    FlatFileBufferLinkedList() {
+        this(Long.MAX_VALUE);
+    }
+
+    FlatFileBufferLinkedList(long memLimit) {
+        this.memLimit = memLimit;
+    }
 
     /**
      * Add {@code item} at the tail of the list
      */
     public void add(@Nonnull NodeStateEntry item) {
         Preconditions.checkArgument(item != null, "Can't add null to the 
list");
+        long incomingSize = item.estimatedMemUsage();
+        long memUsage = estimatedMemoryUsage();
+        Preconditions.checkState(memUsage + incomingSize <= memLimit,
+                String.format(
+                "Adding item (%s) estimated with %s bytes would increase mem 
usage beyond upper limit (%s)." +
+                        " Current estimated mem usage is %s bytes", 
item.getPath(), incomingSize, memLimit, memUsage));
         tail.next = new ListNode(item);
         tail = tail.next;
         size++;
-        memUsage += item.estimatedMemUsage();
+        this.memUsage += incomingSize;
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedListTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedListTest.java?rev=1825620&r1=1825619&r2=1825620&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedListTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileBufferLinkedListTest.java
 Thu Mar  1 04:17:20 2018
@@ -150,6 +150,26 @@ public class FlatFileBufferLinkedListTes
     }
 
     @Test
+    public void memLimit() {
+        list = new FlatFileBufferLinkedList(10);
+        NodeStateEntry e10Bytes = new NodeStateEntry(EMPTY_NODE, "/", 10);
+        NodeStateEntry e1Byte = new NodeStateEntry(EMPTY_NODE, "/", 1);
+
+        list.add(e10Bytes); //this should succeed
+
+        list.remove();
+        list.add(e1Byte);
+        try {
+            list.add(e10Bytes);
+        } catch (IllegalStateException ise) {
+            //ignore
+        }
+
+        assertEquals("Addition beyond mem limit shouldn't get added", 1, 
list.size());
+        assertEquals("Addition beyond mem limit shouldn't show up in usage", 
1, list.estimatedMemoryUsage());
+    }
+
+    @Test
     public void basics() {
         list.add(TEST_NODE_STATE_ENTRY);
         assertEquals("Adding an item should change size", 1, list.size());


Reply via email to