+ return null;
+ }
+
+ @SuppressWarnings("checkstyle:IllegalCatch")
+ public void waitUntilNoLeader(ActorRef shard) {
+ FiniteDuration duration = Duration.create(100, TimeUnit.MILLISECONDS);
+ Object lastResponse = null;
+ for (int i = 0; i < 20 * 5; i++) {
+ Future<Object> future = Patterns.ask(shard, FindLeader.INSTANCE, new Timeout(duration));
+ try {
+ final Optional<String> maybeLeader = ((FindLeaderReply) Await.result(future, duration))
+ .getLeaderActor();
+ if (!maybeLeader.isPresent()) {
+ return;
+ }
+
+ lastResponse = maybeLeader.get();
+ } catch (TimeoutException e) {
+ lastResponse = e;
+ } catch (Exception e) {
+ LOG.error("FindLeader failed", e);
+ lastResponse = e;
+ }
+
+ Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS);
+ }
+
+ if (lastResponse instanceof Throwable) {
+ throw (AssertionError)new AssertionError(
+ String.format("Unexpected error occurred from FindLeader for shard %s", shard.path()))
+ .initCause((Throwable)lastResponse);
+ }
+
+ Assert.fail(String.format("Unexpected leader %s found for shard %s", lastResponse, shard.path()));