+ 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()));
+ }