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