Author: mduerig
Date: Fri Jul 22 13:13:08 2016
New Revision: 1753787

URL: http://svn.apache.org/viewvc?rev=1753787&view=rev
Log:
OAK-4591: Clarify implementation and documentation of TarReader#mark
Removed condition always evaluating to true, fixed javadoc and added better 
comments

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

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=1753787&r1=1753786&r2=1753787&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
 Fri Jul 22 13:13:08 2016
@@ -761,7 +761,7 @@ class TarReader implements Closeable {
      * Collect reclaimable segments.
      * A data segment is reclaimable iff its generation is in the {@code 
reclaimGeneration}
      * predicate.
-     * A bulk segment is reclaimable if it is in {@code bulkRefs} or if it is 
transitively
+     * A bulk segment is reclaimable if it is not in {@code bulkRefs} or if it 
is transitively
      * reachable through a non reclaimable data segment.
      *
      * @param bulkRefs  bulk segment gc roots
@@ -774,6 +774,11 @@ class TarReader implements Closeable {
         Map<UUID, List<UUID>> graph = getGraph(true);
         TarEntry[] entries = getEntries();
         for (int i = entries.length - 1; i >= 0; i--) {
+            // A bulk segments is *always* written before any data segment 
referencing it.
+            // Backward iteration ensures we see all references to bulk 
segments before
+            // we see the bulk segment itself. Therefore we can remove a bulk 
reference
+            // from the bulkRefs set once we encounter it, which save us some 
memory and
+            // CPU on subsequent look-ups.
             TarEntry entry = entries[i];
             UUID id = new UUID(entry.msb(), entry.lsb());
             if ((!isDataSegmentId(entry.lsb()) && !bulkRefs.remove(id)) ||
@@ -785,11 +790,9 @@ class TarReader implements Closeable {
                     for (UUID refId : getReferences(entry, id, graph)) {
                         if (!isDataSegmentId(refId.getLeastSignificantBits())) 
{
                             // keep the extra check for bulk segments for the 
case where a
-                            // pre-compiled graph is not available and 
getReferences also
-                            // includes data references
-                            if (!reclaim.remove(id)) {
-                                bulkRefs.add(refId);
-                            }
+                            // pre-compiled graph is not available (graph == 
null) and
+                            // getReferences also includes data references
+                            bulkRefs.add(refId);
                         }
                     }
                 }


Reply via email to