From 28844553f5a3c8e0ac1daf89cbe4ded188b790ef Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 26 Apr 2019 08:24:32 +0200 Subject: Make validRandomTargets thread safe. --- .../com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java index 048149e86ab..5355da563c2 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; /** @@ -65,7 +67,7 @@ public class StoragePolicy extends ExternalSlobrokPolicy { /** Helper class to match a host pattern with node to use. */ public abstract static class HostFetcher { private int requiredUpPercentageToSendToKnownGoodNodes = 60; - private List validRandomTargets = new ArrayList<>(); + private AtomicReference> safeValidRandomTargets = new AtomicReference<>(new CopyOnWriteArrayList<>()); private int totalTargets = 1; protected final Random randomizer = new Random(12345); // Use same randomizer each time to make unit testing easy. @@ -76,11 +78,12 @@ public class StoragePolicy extends ExternalSlobrokPolicy { for (int i=0; i(validRandomTargets)); this.totalTargets = state.getNodeCount(NodeType.DISTRIBUTOR); } public abstract String getTargetSpec(Integer distributor, RoutingContext context); String getRandomTargetSpec(RoutingContext context) { + List validRandomTargets = safeValidRandomTargets.get(); // Try to use list of random targets, if at least X % of the nodes are up while (100 * validRandomTargets.size() / totalTargets >= requiredUpPercentageToSendToKnownGoodNodes) { int randIndex = randomizer.nextInt(validRandomTargets.size()); -- cgit v1.2.3