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 md...@apache.org on 2016/05/09 15:54:50 UTC

svn commit: r1742989 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/ main/java/org/apache/jackrabbit/oak/segment/file/ test/java/org/apache/jackrabbit/oak/segment/

Author: mduerig
Date: Mon May  9 15:54:50 2016
New Revision: 1742989

URL: http://svn.apache.org/viewvc?rev=1742989&view=rev
Log:
OAK-4353: IndexOutOfBoundsException in FileStore.writeStream
Define segment gc generation = 0 for bulk segments and consider the type of the segment in the gc generation methods accordingly

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1742989&r1=1742988&r2=1742989&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java Mon May  9 15:54:50 2016
@@ -26,6 +26,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Maps.newConcurrentMap;
 import static java.lang.Boolean.getBoolean;
 import static org.apache.jackrabbit.oak.commons.IOUtils.closeQuietly;
+import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
 import static org.apache.jackrabbit.oak.segment.SegmentVersion.isValid;
 import static org.apache.jackrabbit.oak.segment.SegmentWriter.BLOCK_SIZE;
 
@@ -38,6 +39,7 @@ import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 import java.util.Arrays;
 import java.util.List;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
 
 import javax.annotation.CheckForNull;
@@ -314,12 +316,27 @@ public class Segment {
         return data.getShort(ROOT_COUNT_OFFSET) & 0xffff;
     }
 
-    public static int getGcGen(ByteBuffer data) {
-        return data.getInt(GC_GEN_OFFSET);
+    /**
+     * Determine the gc generation a segment from its data. Note that bulk segments don't have
+     * generations (i.e. stay at 0).
+     *
+     * @param data         the date of the segment
+     * @param segmentId    the id of the segment
+     * @return  the gc generation of this segment or 0 if this is bulk segment.
+     */
+    public static int getGcGen(ByteBuffer data, UUID segmentId) {
+        return isDataSegmentId(segmentId.getLeastSignificantBits())
+            ? data.getInt(GC_GEN_OFFSET)
+            : 0;
     }
 
+    /**
+     * Determine the gc generation of this segment. Note that bulk segments don't have
+     * generations (i.e. stay at 0).
+     * @return  the gc generation of this segment or 0 if this is bulk segment.
+     */
     public int getGcGen() {
-        return getGcGen(data);
+        return getGcGen(data, id.asUUID());
     }
 
     public RecordType getRootType(int index) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1742989&r1=1742988&r2=1742989&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java Mon May  9 15:54:50 2016
@@ -1368,7 +1368,7 @@ public class FileStore implements Segmen
     public void writeSegment(SegmentId id, byte[] data, int offset, int length) throws IOException {
         fileStoreLock.writeLock().lock();
         try {
-            int generation = Segment.getGcGen(wrap(data, offset, length));
+            int generation = Segment.getGcGen(wrap(data, offset, length), id.asUUID());
             long size = writer.writeEntry(
                     id.getMostSignificantBits(),
                     id.getLeastSignificantBits(),

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1742989&r1=1742988&r2=1742989&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java Mon May  9 15:54:50 2016
@@ -218,7 +218,7 @@ class TarReader implements Closeable {
         for (Map.Entry<UUID, byte[]> entry : entries.entrySet()) {
             UUID uuid = entry.getKey();
             byte[] data = entry.getValue();
-            int generation = getGcGen(wrap(data));
+            int generation = getGcGen(wrap(data), uuid);
             writer.writeEntry(
                     uuid.getMostSignificantBits(),
                     uuid.getLeastSignificantBits(),

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java?rev=1742989&r1=1742988&r2=1742989&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/RecordTest.java Mon May  9 15:54:50 2016
@@ -57,7 +57,6 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -152,7 +151,6 @@ public class RecordTest {
     }
 
     @Test
-    @Ignore("OAK-4353")  // FIXME OAK-4353: IndexOutOfBoundsException in FileStore.writeStream
     public void testStreamRecord() throws IOException {
         checkRandomStreamRecord(0);
         checkRandomStreamRecord(1);