docs: @Override
      public <K, V, R> R invoke(Cache<K, V> cache, Operation<K, V, R> operation, Flag... allFlags) {
          Flag[] attemptFlags = null;
          // attemptFlags = allFlags - Flag.FAIL_SILENTLY
          if ((allFlags != null) && (allFlags.length > 0)) {
              Set<Flag> flags = EnumSet.noneOf(Flag.class);
              flags.addAll(Arrays.asList(allFlags));
              flags.remove(Flag.FAIL_SILENTLY);
              attemptFlags = flags.toArray(new Flag[flags.size()]);
          }
  
          Exception exception = null;
  
          for (int i = 0; i <= this.backOffIntervals.length; ++i) {
              // Make sure Flag.FAIL_SILENTLY, if specified, is applied to the last try only
              try {
                  return this.invoker.invoke(cache, operation, (i < this.backOffIntervals.length) ? attemptFlags : allFlags);
              } catch (TimeoutException e) {
                  exception = e;
              }
  
              if (i < this.backOffIntervals.length) {
                  int delay = this.backOffIntervals[i];
  
                  try {
                      if (ROOT_LOGGER.isTraceEnabled()) {
                          ROOT_LOGGER.tracef(exception, "Cache operation failed.  Retrying in %d ms", Integer.valueOf(delay));
                      }
  
                      Thread.sleep(delay);
                  } catch (InterruptedException e) {
                      Thread.currentThread().interrupt();
                  }
              }
          }
  
          throw MESSAGES.abortingCacheOperation(exception, this.backOffIntervals.length + 1);
      }