Author: mduerig
Date: Mon Oct 3 10:19:12 2016
New Revision: 1763147
URL: http://svn.apache.org/viewvc?rev=1763147&view=rev
Log:
OAK-2498: Root record references provide too little context for parsing a
segment
Properly account for duplicate segment references in exact segment size
calculation
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1763147&r1=1763146&r2=1763147&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Mon Oct 3 10:19:12 2016
@@ -23,6 +23,7 @@ import static com.google.common.base.Cha
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Sets.newHashSet;
import static java.lang.System.arraycopy;
import static java.lang.System.currentTimeMillis;
import static java.lang.System.identityHashCode;
@@ -35,6 +36,7 @@ import static org.apache.jackrabbit.oak.
import java.io.IOException;
import java.util.Collection;
+import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -420,11 +422,19 @@ public class SegmentBufferWriter impleme
// avoid the somewhat expensive list and set traversals.
if (segmentSize > buffer.length) {
- for (RecordId id : ids) {
- if (segmentReferences.contains(id.getSegmentId())) {
- referencedIdCount--;
+
+ // Collect the newly referenced segment ids
+ Set<SegmentId> segmentIds = newHashSet();
+ for (RecordId recordId : ids) {
+ SegmentId segmentId = recordId.getSegmentId();
+ if (segmentReferences.contains(segmentId)) {
+ segmentIds.add(segmentId);
}
}
+
+ // Adjust the estimation of the new referenced segment ID count.
+ referencedIdCount -= segmentIds.size();
+
headerSize = HEADER_SIZE + referencedIdCount * 16 +
recordNumbersCount * 12;
segmentSize = align(headerSize + recordSize + length, 16);
}