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 al...@apache.org on 2014/08/27 15:48:41 UTC
svn commit: r1620898 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/segment/
test/java/org/apache/jackrabbit/oak/plugins/segment/
Author: alexparvulescu
Date: Wed Aug 27 13:48:41 2014
New Revision: 1620898
URL: http://svn.apache.org/r1620898
Log:
OAK-2049 ArrayIndexOutOfBoundsException in Segment.getRefId()
- added protection for the ArrayIndexOutOfBoundsException, added segmentid to the error logs
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.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/SegmentIdFactoryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1620898&r1=1620897&r2=1620898&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Wed Aug 27 13:48:41 2014
@@ -188,6 +188,14 @@ public class Segment {
}
SegmentId getRefId(int index) {
+ if (refids == null || index >= refids.length) {
+ String type = "data";
+ if (!id.isDataSegmentId()) {
+ type = "bulk";
+ }
+ throw new IllegalStateException("RefId '" + index
+ + "' doesn't exist in " + type + " segment " + id);
+ }
SegmentId refid = refids[index];
if (refid == null) {
synchronized (this) {
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=1620898&r1=1620897&r2=1620898&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 Wed Aug 27 13:48:41 2014
@@ -87,7 +87,7 @@ public class SegmentWriter {
static final int BLOCK_SIZE = 1 << 12; // 4kB
- private static byte[] createNewBuffer() {
+ static byte[] createNewBuffer() {
byte[] buffer = new byte[Segment.MAX_SEGMENT_SIZE];
buffer[0] = '0';
buffer[1] = 'a';
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java?rev=1620898&r1=1620897&r2=1620898&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentIdFactoryTest.java Wed Aug 27 13:48:41 2014
@@ -19,8 +19,8 @@ package org.apache.jackrabbit.oak.plugin
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import java.nio.ByteBuffer;
import java.util.Set;
-import java.util.UUID;
import org.apache.jackrabbit.oak.plugins.segment.memory.MemoryStore;
import org.junit.Test;
@@ -84,4 +84,29 @@ public class SegmentIdFactoryTest {
assertTrue(ids.contains(b));
}
+ /**
+ * OAK-2049 - error for data segments
+ */
+ @Test(expected = IllegalStateException.class)
+ public void dataAIOOBE() {
+ SegmentId id = factory.newDataSegmentId();
+ byte[] buffer = SegmentWriter.createNewBuffer();
+ ByteBuffer data = ByteBuffer.allocate(Segment.MAX_SEGMENT_SIZE);
+ data.put(buffer);
+ data.rewind();
+ Segment s = new Segment(factory, id, data);
+ s.getRefId(1);
+ }
+
+ /**
+ * OAK-2049 - error for bulk segments
+ */
+ @Test(expected = IllegalStateException.class)
+ public void bulkAIOOBE() {
+ SegmentId id = factory.newBulkSegmentId();
+ ByteBuffer data = ByteBuffer.allocate(4);
+ Segment s = new Segment(factory, id, data);
+ s.getRefId(1);
+ }
+
}