Author: frm
Date: Wed Dec 16 09:27:45 2015
New Revision: 1720306

URL: http://svn.apache.org/viewvc?rev=1720306&view=rev
Log:
OAK-3794 - Let the standby client be resilient to loops in the segment graph

Modified:
    
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/store/StandbyStore.java

Modified: 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/store/StandbyStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/store/StandbyStore.java?rev=1720306&r1=1720305&r2=1720306&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/store/StandbyStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-tarmk-standby/src/main/java/org/apache/jackrabbit/oak/plugins/segment/standby/store/StandbyStore.java
 Wed Dec 16 09:27:45 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.segment.standby.store;
 
+import static com.google.common.collect.Sets.newHashSet;
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
 
 import java.io.ByteArrayOutputStream;
@@ -88,8 +89,13 @@ public class StandbyStore implements Seg
         long maxWeight = 0;
         long maxKeys = 0;
 
+        Set<SegmentId> visited = newHashSet();
+
         while (!ids.isEmpty()) {
             SegmentId id = ids.remove();
+
+            visited.add(id);
+
             if (!persisted.contains(id) && !delegate.containsSegment(id)) {
                 Segment s;
                 boolean logRefs = true;
@@ -114,7 +120,7 @@ public class StandbyStore implements Seg
                         }
                         for (SegmentId nr : refs) {
                             // skip already persisted or self-ref
-                            if (persisted.contains(nr) || id.equals(nr)) {
+                            if (persisted.contains(nr) || id.equals(nr) || 
visited.contains(nr)) {
                                 continue;
                             }
                             hasPendingRefs = true;


Reply via email to