Author: adulceanu
Date: Mon Jun 8 13:23:13 2020
New Revision: 1878608
URL: http://svn.apache.org/viewvc?rev=1878608&view=rev
Log:
OAK-9101 - Monitoring for maximum number of entries in biggest map record
(backported r1878510 to 1.8 branch)
Modified:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
jackrabbit/oak/branches/1.8/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
Modified:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java?rev=1878608&r1=1878607&r2=1878608&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
(original)
+++
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
Mon Jun 8 13:23:13 2020
@@ -93,6 +93,8 @@ public class DefaultSegmentWriter implem
private static final int CHILD_NODE_UPDATE_LIMIT = Integer
.getInteger("child.node.update.limit", 10000);
+ protected static final String MAX_MAP_RECORD_SIZE_KEY =
"oak.segmentNodeStore.maxMapRecordSize";
+
@NotNull
private final WriterCacheManager cacheManager;
@@ -248,6 +250,11 @@ public class DefaultSegmentWriter implem
private RecordId writeMap(@Nullable MapRecord base, @NotNull
Map<String, RecordId> changes) throws IOException {
if (base != null) {
if (base.size() >= MapRecord.WARN_SIZE) {
+ int maxMapRecordSize =
Integer.getInteger(MAX_MAP_RECORD_SIZE_KEY, 0);
+ if (base.size() > maxMapRecordSize) {
+ System.setProperty(MAX_MAP_RECORD_SIZE_KEY,
String.valueOf(base.size()));
+ }
+
if (base.size() >= MapRecord.ERROR_SIZE_HARD_STOP) {
throw new UnsupportedOperationException("Map record
has more than " + MapRecord.ERROR_SIZE_HARD_STOP
+ " direct entries. Writing is not
allowed. Please remove entries.");
Modified:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java?rev=1878608&r1=1878607&r2=1878608&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.8/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
(original)
+++
jackrabbit/oak/branches/1.8/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
Mon Jun 8 13:23:13 2020
@@ -337,6 +337,7 @@ public class RecordTest {
@Test(expected = UnsupportedOperationException.class)
public void testHugeMapRecordErrorSizeHardStop() throws IOException {
System.setProperty("oak.segmentNodeStore.allowWritesOnHugeMapRecord",
"true");
+ System.setProperty(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY,
String.valueOf(0));
RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
MapRecord one = new MapRecord(store.getReader(), writer.writeMap(null,
ImmutableMap.of("one", blockId)));
@@ -344,10 +345,13 @@ public class RecordTest {
Mockito.when(hugeMapRecord.size()).thenReturn(MapRecord.ERROR_SIZE_HARD_STOP);
MapRecord many = new MapRecord(store.getReader(),
writer.writeMap(hugeMapRecord, ImmutableMap.of("one", blockId)));
+ assertEquals(MapRecord.ERROR_SIZE_HARD_STOP, (int)
Integer.getInteger(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY, 0));
}
@Test
public void testHugeMapRecordErrorSize() throws IOException {
+ System.setProperty(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY,
String.valueOf(0));
+
RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
final ListAppender<ILoggingEvent> logAppender = subscribeAppender();
@@ -358,11 +362,14 @@ public class RecordTest {
MapRecord many = new MapRecord(store.getReader(),
writer.writeMap(hugeMapRecord, ImmutableMap.of("one", blockId)));
assertEquals(logAppender.list.get(0).getFormattedMessage(), "Map entry
has more than 450000000 entries. Please remove entries.");
assertEquals(logAppender.list.get(0).getLevel(), Level.ERROR);
+ assertEquals(MapRecord.ERROR_SIZE, (int)
Integer.getInteger(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY, 0));
unsubscribe(logAppender);
}
@Test
public void testHugeMapRecordWarnSize() throws IOException {
+ System.setProperty(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY,
String.valueOf(0));
+
RecordId blockId = writer.writeBlock(bytes, 0, bytes.length);
final ListAppender<ILoggingEvent> logAppender = subscribeAppender();
@@ -373,6 +380,7 @@ public class RecordTest {
MapRecord many = new MapRecord(store.getReader(),
writer.writeMap(hugeMapRecord, ImmutableMap.of("one", blockId)));
assertEquals(logAppender.list.get(0).getFormattedMessage(), "Map entry
has more than 400000000 entries. Please remove entries.");
assertEquals(logAppender.list.get(0).getLevel(), Level.WARN);
+ assertEquals(MapRecord.WARN_SIZE, (int)
Integer.getInteger(DefaultSegmentWriter.MAX_MAP_RECORD_SIZE_KEY, 0));
unsubscribe(logAppender);
}