diff options
Diffstat (limited to 'documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java')
-rw-r--r-- | documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/StoragePolicy.java | 11 |
1 files changed, 9 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 adf9d5ee912..46d0cd3fc37 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 @@ -104,7 +104,9 @@ public class StoragePolicy extends SlobrokPolicy { String getRandomTargetSpec(RoutingContext context) { Targets targets = validTargets.get(); // Try to use list of random targets, if at least X % of the nodes are up - while (100 * targets.list.size() / targets.total >= requiredUpPercentageToSendToKnownGoodNodes) { + while ((targets.total != 0) && + (100 * targets.list.size() / targets.total >= requiredUpPercentageToSendToKnownGoodNodes)) + { int randIndex = randomizer.nextInt(targets.list.size()); String targetSpec = getTargetSpec(targets.list.get(randIndex), context); if (targetSpec != null) { @@ -408,9 +410,10 @@ public class StoragePolicy extends SlobrokPolicy { log.log(LogLevel.DEBUG, "No distributors available; clearing cluster state"); safeCachedClusterState.set(null); sendRandomReason = "No distributors available. Sending to random distributor."; + context.setContext(createRandomDistributorTargetContext()); } } else { - context.setContext(new MessageContext(null)); + context.setContext(createRandomDistributorTargetContext()); sendRandomReason = "No cluster state cached. Sending to random distributor."; } if (context.shouldTrace(1)) { @@ -419,6 +422,10 @@ public class StoragePolicy extends SlobrokPolicy { return hostFetcher.getRandomTargetSpec(context); } + private static MessageContext createRandomDistributorTargetContext() { + return new MessageContext(null); + } + private static Optional<ClusterState> clusterStateFromReply(final WrongDistributionReply reply) { try { return Optional.of(new ClusterState(reply.getSystemState())); |