Author: alexparvulescu Date: Thu Jun 16 13:24:56 2016 New Revision: 1748722
URL: http://svn.apache.org/viewvc?rev=1748722&view=rev Log: OAK-3797 SegmentTracker#collectBlobReferences should retain fewer SegmentId instances Modified: jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java Modified: jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1748722&r1=1748721&r2=1748722&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java (original) +++ jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java Thu Jun 16 13:24:56 2016 @@ -24,6 +24,7 @@ import java.io.IOException; import java.security.SecureRandom; import java.util.Queue; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -289,20 +290,25 @@ public class SegmentTracker { */ public void collectBlobReferences(ReferenceCollector collector) { try { - Set<SegmentId> processed = newHashSet(); - Queue<SegmentId> queue = newArrayDeque(getReferencedSegmentIds()); + Set<UUID> processed = newHashSet(); + for (SegmentId sid : getReferencedSegmentIds()) { + if (sid.isDataSegmentId()) { + processed.add(sid.asUUID()); + } + } + Queue<UUID> queue = newArrayDeque(processed); writer.flush(); // force the current segment to have root record info while (!queue.isEmpty()) { - SegmentId id = queue.remove(); - if (id.isDataSegmentId() && processed.add(id)) { - Segment segment = id.getSegment(); - - segment.collectBlobReferences(collector); - - for (SegmentId refid : segment.getReferencedIds()) { - if (refid.isDataSegmentId() && !processed.contains(refid)) { - queue.add(refid); - } + UUID uid = queue.remove(); + SegmentId id = getSegmentId(uid.getMostSignificantBits(), + uid.getLeastSignificantBits()); + Segment segment = id.getSegment(); + segment.collectBlobReferences(collector); + for (SegmentId refid : segment.getReferencedIds()) { + UUID rid = refid.asUUID(); + if (refid.isDataSegmentId() && !processed.contains(rid)) { + queue.add(rid); + processed.add(rid); } } }
