You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/12/17 01:47:20 UTC

svn commit: r1551426 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/segment/ test/java/org/apache/jackrabbit/oak/plugins/segment/

Author: jukka
Date: Tue Dec 17 00:47:19 2013
New Revision: 1551426

URL: http://svn.apache.org/r1551426
Log:
OAK-1287: java.lang.IllegalArgumentException when running FlatTreeWithAceForSamePrincipalTest

Fix handling of long lists of values

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ListRecord.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ListRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ListRecord.java?rev=1551426&r1=1551425&r2=1551426&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ListRecord.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/ListRecord.java Tue Dec 17 00:47:19 2013
@@ -57,8 +57,10 @@ class ListRecord extends Record {
             int bucketIndex = index / bucketSize;
             int bucketOffset = index % bucketSize;
             Segment segment = getSegment();
-            RecordId bucketId = segment.readRecordId(getOffset(0, bucketIndex));
-            ListRecord bucket = new ListRecord(segment, bucketId, bucketSize);
+            RecordId id = segment.readRecordId(getOffset(0, bucketIndex));
+            ListRecord bucket = new ListRecord(
+                    segment, id,
+                    Math.min(bucketSize, size - bucketIndex * bucketSize));
             return bucket.getEntry(bucketOffset);
         }
     }
@@ -78,7 +80,7 @@ class ListRecord extends Record {
                     list.add(id);
                 } else {
                     ListRecord bucket = new ListRecord(
-                            segment, id, Math.min(bucketSize, size - offset));
+                            segment, id, Math.min(bucketSize, size - i));
                     list.addAll(bucket.getEntries());
                 }
                 offset += Segment.RECORD_ID_BYTES;

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1551426&r1=1551425&r2=1551426&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Tue Dec 17 00:47:19 2013
@@ -340,6 +340,7 @@ public class SegmentWriter {
 
 
     private synchronized RecordId writeListBucket(List<RecordId> bucket) {
+        checkArgument(bucket.size() > 1);
         RecordId bucketId = prepare(RecordType.BUCKET, 0, bucket);
         for (RecordId id : bucket) {
             writeRecordId(id);
@@ -516,7 +517,11 @@ public class SegmentWriter {
             List<RecordId> nextLevel = Lists.newArrayList();
             for (List<RecordId> bucket :
                     Lists.partition(thisLevel, ListRecord.LEVEL_SIZE)) {
-                nextLevel.add(writeListBucket(bucket));
+                if (bucket.size() > 1) {
+                    nextLevel.add(writeListBucket(bucket));
+                } else {
+                    nextLevel.add(bucket.get(0));
+                }
             }
             thisLevel = nextLevel;
         }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java?rev=1551426&r1=1551425&r2=1551426&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/RecordTest.java Tue Dec 17 00:47:19 2013
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.segment;
 
 import static com.google.common.collect.Lists.newArrayList;
+import static junit.framework.Assert.fail;
 import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
 import static org.apache.jackrabbit.oak.plugins.segment.ListRecord.LEVEL_SIZE;
 import static org.apache.jackrabbit.oak.plugins.segment.SegmentIdFactory.newBulkSegmentId;
@@ -102,6 +103,18 @@ public class RecordTest {
         assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, level2p.size());
         assertEquals(blockId, level2p.getEntry(0));
         assertEquals(blockId, level2p.getEntry(LEVEL_SIZE * LEVEL_SIZE));
+
+        try {
+            int count = 0;
+            for (RecordId entry : level2p.getEntries()) {
+                assertEquals(blockId, entry);
+                assertEquals(blockId, level2p.getEntry(count));
+                count++;
+            }
+            assertEquals(LEVEL_SIZE * LEVEL_SIZE + 1, count);
+        } catch (IllegalArgumentException e) {
+            fail("OAK-1287");
+        }
     }
 
     private ListRecord writeList(int size, RecordId id) {