This is an automated email from the ASF dual-hosted git repository.

reschke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 03e307d7c5 OAK-10649: MemoryDS: add toggle to limit document size 
(#1309)
03e307d7c5 is described below

commit 03e307d7c5a295efb9a9f9192de9cb7b5b70519b
Author: Julian Reschke <[email protected]>
AuthorDate: Thu Feb 15 16:14:52 2024 +0100

    OAK-10649: MemoryDS: add toggle to limit document size (#1309)
    
    * OAK-10649: MemoryDS: add toggle to limit document size
    
    * OAK-10649: MemoryDS: add toggle to limit document size - shuffle code to 
minimize diff
    
    * OAK-10649: MemoryDS: add toggle to limit document size - rename constant
---
 .../document/memory/MemoryDocumentStore.java       | 46 ++++++++++++++--------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
index 56c44c5de2..90af8c10af 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/memory/MemoryDocumentStore.java
@@ -16,6 +16,11 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.memory;
 
+import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS;
+import static 
org.apache.jackrabbit.oak.plugins.document.UpdateOp.Condition.newEqualsCondition;
+import static 
org.apache.jackrabbit.oak.plugins.document.UpdateUtils.assertUnconditional;
+import static 
org.apache.jackrabbit.oak.plugins.document.UpdateUtils.checkConditions;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -27,9 +32,11 @@ import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.jackrabbit.guava.common.base.Predicate;
+import org.apache.jackrabbit.guava.common.base.Splitter;
 import org.apache.jackrabbit.guava.common.collect.ImmutableMap;
 import org.apache.jackrabbit.guava.common.collect.Maps;
 import org.apache.jackrabbit.oak.cache.CacheStats;
+import org.apache.jackrabbit.oak.commons.properties.SystemPropertySupplier;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStore;
@@ -40,19 +47,13 @@ import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Condition;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
 import org.apache.jackrabbit.oak.plugins.document.UpdateUtils;
+import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
+import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import org.apache.jackrabbit.guava.common.base.Splitter;
 import com.mongodb.ReadPreference;
 import com.mongodb.WriteConcern;
-import org.apache.jackrabbit.oak.plugins.document.cache.CacheInvalidationStats;
-import org.apache.jackrabbit.oak.plugins.document.util.Utils;
-
-import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.MODIFIED_IN_SECS;
-import static 
org.apache.jackrabbit.oak.plugins.document.UpdateOp.Condition.newEqualsCondition;
-import static 
org.apache.jackrabbit.oak.plugins.document.UpdateUtils.assertUnconditional;
-import static 
org.apache.jackrabbit.oak.plugins.document.UpdateUtils.checkConditions;
 
 /**
  * Emulates a MongoDB store (possibly consisting of multiple shards and
@@ -98,6 +99,8 @@ public class MemoryDocumentStore implements DocumentStore {
 
     private static final Key KEY_MODIFIED = new Key(MODIFIED_IN_SECS, null);
 
+    private static final long SIZE_LIMIT = 
SystemPropertySupplier.create("memoryds.size.limit", -1).get();
+
     public MemoryDocumentStore() {
         this(false);
     }
@@ -338,6 +341,7 @@ public class MemoryDocumentStore implements DocumentStore {
             // update the document
             UpdateUtils.applyChanges(doc, update);
             maintainModCount(doc);
+            checkSize(doc);
             doc.seal();
             map.put(update.getId(), doc);
             return oldDoc;
@@ -392,7 +396,7 @@ public class MemoryDocumentStore implements DocumentStore {
     public CacheInvalidationStats invalidateCache(Iterable<String> keys) {
         return null;
     }
-    
+
     @Override
     public void dispose() {
         // ignore
@@ -470,14 +474,24 @@ public class MemoryDocumentStore implements DocumentStore 
{
         return 0;
     }
 
-    private void maintainModCount(Document doc) {
-        if (!maintainModCount) {
-            return;
+    private void checkSize(Document doc) {
+        if (SIZE_LIMIT >= 0) {
+            int size = doc.getMemory();
+            if (size >= SIZE_LIMIT) {
+                throw new DocumentStoreException(
+                        String.format("Resulting size for _id '%s' is %d, 
exceeding configured size limit of %d. Diagnostics: %s.",
+                                doc.getId(), size, SIZE_LIMIT, 
Utils.mapEntryDiagnostics(doc.entrySet())));
+            }
         }
-        Long modCount = doc.getModCount();
-        if (modCount == null) {
-            modCount = 0L;
+    }
+
+    private void maintainModCount(Document doc) {
+        if (maintainModCount) {
+            Long modCount = doc.getModCount();
+            if (modCount == null) {
+                modCount = 0L;
+            }
+            doc.put(Document.MOD_COUNT, modCount + 1);
         }
-        doc.put(Document.MOD_COUNT, modCount + 1);
     }
 }

Reply via email to