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


Reply via email to