docs: @CanIgnoreReturnValue
    @Override
    public <T> T callWithTimeout(
        Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit, boolean amInterruptible)
        throws Exception {
      checkNotNull(callable);
      checkNotNull(timeoutUnit);
      checkArgument(timeoutDuration > 0, "timeout must be positive: %s", timeoutDuration);
      Future<T> future = executor.submit(callable);
      try {
        if (amInterruptible) {
          try {
            return future.get(timeoutDuration, timeoutUnit);
          } catch (InterruptedException e) {
            future.cancel(true);
            throw e;
          }
        } else {
          return Uninterruptibles.getUninterruptibly(future, timeoutDuration, timeoutUnit);
        }
      } catch (ExecutionException e) {
        throw throwCause(e, true);
      } catch (TimeoutException e) {
        future.cancel(true);
        throw new UncheckedTimeoutException(e);
      }
    }