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;