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