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


Reply via email to