From f6c973a08db45c7b00ac36d87b016ef63e65923c Mon Sep 17 00:00:00 2001 From: Madan Jampani Date: Sat, 30 Jan 2016 22:20:48 -0800 Subject: [PATCH] DefaultConsistentMap to automatically retry compute* calls failing due to ConcurrentModification Change-Id: If59e432e423d323282eb8fe7b1b438899154aae9 --- .../primitives/impl/DefaultConsistentMap.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultConsistentMap.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultConsistentMap.java index e09b6249fc..f804611bc2 100644 --- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultConsistentMap.java +++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultConsistentMap.java @@ -19,6 +19,7 @@ package org.onosproject.store.primitives.impl; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -28,14 +29,18 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; +import org.onlab.util.Tools; import org.onosproject.store.primitives.ConsistentMapBackedJavaMap; import org.onosproject.store.service.AsyncConsistentMap; import org.onosproject.store.service.ConsistentMap; import org.onosproject.store.service.ConsistentMapException; +import org.onosproject.store.service.ConsistentMapException.ConcurrentModification; import org.onosproject.store.service.MapEventListener; import org.onosproject.store.service.Synchronous; import org.onosproject.store.service.Versioned; +import com.google.common.base.Throwables; + /** * Default implementation of {@code ConsistentMap}. * @@ -45,6 +50,7 @@ import org.onosproject.store.service.Versioned; public class DefaultConsistentMap extends Synchronous> implements ConsistentMap { private static final int OPERATION_TIMEOUT_MILLIS = 5000; + private static final int MAX_DELAY_BETWEEN_RETY_MILLS = 50; private final AsyncConsistentMap asyncMap; private Map javaMap; @@ -82,26 +88,29 @@ public class DefaultConsistentMap extends Synchronous computeIfAbsent(K key, Function mappingFunction) { - return complete(asyncMap.computeIfAbsent(key, mappingFunction)); + return computeIf(key, Objects::isNull, (k, v) -> mappingFunction.apply(k)); } @Override public Versioned computeIfPresent(K key, BiFunction remappingFunction) { - return complete(asyncMap.computeIfPresent(key, remappingFunction)); + return computeIf(key, Objects::nonNull, remappingFunction); } @Override public Versioned compute(K key, BiFunction remappingFunction) { - return complete(asyncMap.compute(key, remappingFunction)); + return computeIf(key, v -> true, remappingFunction); } @Override public Versioned computeIf(K key, Predicate condition, BiFunction remappingFunction) { - return complete(asyncMap.computeIf(key, condition, remappingFunction)); + return Tools.retryable(() -> complete(asyncMap.computeIf(key, condition, remappingFunction)), + ConcurrentModification.class, + Integer.MAX_VALUE, + MAX_DELAY_BETWEEN_RETY_MILLS).get(); } @Override @@ -203,11 +212,8 @@ public class DefaultConsistentMap extends Synchronous