code: private <T> CompletableFuture<T> withRetries(Supplier<CompletableFuture<T>> futureSupplier, Supplier<String> errorMessage) {
          return RetryHelper.withRetriesAsync(exceptionalCallback(futureSupplier, errorMessage),
                  e -> {
                      Throwable unwrap = Exceptions.unwrap(e);
                      return unwrap instanceof StoreException.StoreConnectionException;
                  }, NUM_OF_RETRIES, executor);
      }
docs: /*
  We dont want to do indefinite retries because for controller's graceful shutting down, it waits on grpc service to
  be terminated which in turn waits on all outstanding grpc calls to complete. And the store may stall the calls if
  there is indefinite retries. Restricting it to 12 retries gives us ~60 seconds worth of wait on the upper side.
  Also, note that the call can fail because hostContainerMap has not been updated or it can fail because it cannot
  talk to segment store. Both these are translated to ConnectionErrors and are retried. All other exceptions
  are thrown back