Author: mduerig
Date: Tue Apr 26 13:59:39 2016
New Revision: 1741030
URL: http://svn.apache.org/viewvc?rev=1741030&view=rev
Log:
OAK-3348: Cross gc sessions might introduce references to pre-compacted segments
Use the term stable id for the node id persisted with the segment node states
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java?rev=1741030&r1=1741029&r2=1741030&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/RecordWriters.java
Tue Apr 26 13:59:39 2016
@@ -139,8 +139,8 @@ final class RecordWriters {
childNameId, propNamesId, version);
}
- public static RecordWriter newNodeStateWriter(RecordId nodeId,
List<RecordId> ids) {
- return new NodeStateWriter(nodeId, ids);
+ public static RecordWriter newNodeStateWriter(RecordId stableId,
List<RecordId> ids) {
+ return new NodeStateWriter(stableId, ids);
}
/**
@@ -490,19 +490,19 @@ final class RecordWriters {
* @see RecordType#NODE
*/
private static class NodeStateWriter extends RecordWriter {
- private final RecordId nodeId;
+ private final RecordId stableId;
- private NodeStateWriter(RecordId nodeId, List<RecordId> ids) {
+ private NodeStateWriter(RecordId stableId, List<RecordId> ids) {
super(NODE, RECORD_ID_BYTES, ids);
- this.nodeId = nodeId;
+ this.stableId = stableId;
}
@Override
protected RecordId writeRecordContent(RecordId id, SegmentBufferWriter
writer) {
- if (nodeId == null) {
+ if (stableId == null) {
writer.writeRecordId(id);
} else {
- writer.writeRecordId(nodeId);
+ writer.writeRecordId(stableId);
}
for (RecordId recordId : ids) {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java?rev=1741030&r1=1741029&r2=1741030&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeState.java
Tue Apr 26 13:59:39 2016
@@ -90,7 +90,14 @@ public class SegmentNodeState extends Re
return segment.readMap(segment.readRecordId(getOffset(0, 2)));
}
- String getId() {
+ /**
+ * Returns the stable id of this node. In contrast to the node's record id
+ * (which is technically the node's address) the stable id doesn't change
+ * after an online gc cycle. It might though change after an offline gc
cycle.
+ *
+ * @return stable id
+ */
+ String getStableId() {
RecordId id = getSegment().readRecordId(getOffset());
if (id.equals(getRecordId())) {
return id.toString10();
@@ -589,7 +596,7 @@ public class SegmentNodeState extends Re
}
if (a instanceof SegmentNodeState && b instanceof SegmentNodeState
- && ((SegmentNodeState) a).getId().equals(((SegmentNodeState)
b).getId())) {
+ && ((SegmentNodeState) a).getStableId().equals(((SegmentNodeState)
b).getStableId())) {
return true;
}
@@ -598,7 +605,7 @@ public class SegmentNodeState extends Re
@Override
public int hashCode() {
- return getId().hashCode();
+ return getStableId().hashCode();
}
@Override
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1741030&r1=1741029&r2=1741030&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
Tue Apr 26 13:59:39 2016
@@ -41,6 +41,7 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.api.Type.NAMES;
import static org.apache.jackrabbit.oak.api.Type.STRING;
import static org.apache.jackrabbit.oak.segment.MapRecord.BUCKETS_PER_LEVEL;
+import static
org.apache.jackrabbit.oak.segment.RecordWriters.newNodeStateWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -786,7 +787,7 @@ public class SegmentWriter {
SegmentNodeState sns = ((SegmentNodeState) state);
if (hasSegment(sns)) {
if (isOldGen(sns.getRecordId())) {
- RecordId cachedId =
nodeCache.generation(generation()).get(sns.getId());
+ RecordId cachedId =
nodeCache.generation(generation()).get(sns.getStableId());
if (cachedId != null) {
return cachedId;
}
@@ -799,7 +800,7 @@ public class SegmentWriter {
RecordId recordId = writeNodeUncached(state, depth);
if (state instanceof SegmentNodeState) {
SegmentNodeState sns = (SegmentNodeState) state;
- nodeCache.generation(generation()).put(sns.getId(), recordId,
depth);
+ nodeCache.generation(generation()).put(sns.getStableId(),
recordId, depth);
}
return recordId;
}
@@ -890,14 +891,14 @@ public class SegmentWriter {
ids.add(writeList(pIds));
}
- RecordId nodeId = null;
+ RecordId stableId = null;
if (state instanceof SegmentNodeState) {
// FIXME OAK-4279: Rework offline compaction
- // Offline compaction could remove these ids
+ // Offline compaction could remove the stable ids again
byte[] id = ((Record) state).getRecordId().toArray();
- nodeId = writeBlock(id, 0, id.length);
+ stableId = writeBlock(id, 0, id.length);
}
- return RecordWriters.newNodeStateWriter(nodeId, ids).write(writer);
+ return newNodeStateWriter(stableId, ids).write(writer);
}
private boolean hasSegment(SegmentNodeState node) {
Modified:
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java?rev=1741030&r1=1741029&r2=1741030&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-next/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java
Tue Apr 26 13:59:39 2016
@@ -548,7 +548,7 @@ public class CompactionAndCleanupIT {
assertEquals(uncompacted, compacted);
assertTrue(uncompacted instanceof SegmentNodeState);
assertTrue(compacted instanceof SegmentNodeState);
- assertEquals(((SegmentNodeState)uncompacted).getId(),
((SegmentNodeState)compacted).getId());
+ assertEquals(((SegmentNodeState)uncompacted).getStableId(),
((SegmentNodeState)compacted).getStableId());
NodeState checkpoint = nodeStore.retrieve(cpId);
assertTrue(checkpoint instanceof SegmentNodeState);