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/07/22 13:13:08 UTC

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

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