diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-04-26 08:24:32 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-04-26 08:24:32 +0200 |
commit | 28844553f5a3c8e0ac1daf89cbe4ded188b790ef (patch) | |
tree | 886129a0dc481afbbb71798b32406c6e73a984af /documentapi/src | |
parent | a718b1561aa2d511248ad48d25a6ab63a8125d93 (diff) |
Make validRandomTargets thread safe.
Diffstat (limited to 'documentapi/src')
-rw-r--r-- | documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java | 7 |
1 files 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<Integer> validRandomTargets = new ArrayList<>(); + private AtomicReference<List<Integer>> 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<state.getNodeCount(NodeType.DISTRIBUTOR); ++i) { if (state.getNodeState(new Node(NodeType.DISTRIBUTOR, i)).getState().oneOf(upStates)) validRandomTargets.add(i); } - this.validRandomTargets = validRandomTargets; + this.safeValidRandomTargets.set(new CopyOnWriteArrayList<>(validRandomTargets)); this.totalTargets = state.getNodeCount(NodeType.DISTRIBUTOR); } public abstract String getTargetSpec(Integer distributor, RoutingContext context); String getRandomTargetSpec(RoutingContext context) { + List<Integer> 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()); |