docs: boolean detectAndHandleBackupTimeout(long timeoutMillis) {
          // if the backups have completed, we are done; this also filters out all non backup-aware operations
          // since the backupsAcksExpected will always be equal to the backupsAcksReceived
          boolean backupsCompleted = backupsAcksExpected == backupsAcksReceived;
          long responseReceivedMillis = pendingResponseReceivedMillis;
  
          // if this has not yet expired (so has not been in the system for a too long period) we ignore it
          long expirationTime = responseReceivedMillis + timeoutMillis;
          boolean timeout = expirationTime > 0 && expirationTime < Clock.currentTimeMillis();
  
          // if no response has yet been received, we we are done; we are only going to re-invoke an operation
          // if the response of the primary has been received, but the backups have not replied
          boolean responseReceived = pendingResponse != VOID;
  
          if (backupsCompleted || !responseReceived || !timeout) {
              return false;
          }
  
          if (shouldFailOnIndeterminateOperationState()) {
              complete(new IndeterminateOperationStateException(this + " failed because backup acks missed."));
              return true;
          }
  
          boolean targetDead = context.clusterService.getMember(targetAddress) == null;
          if (targetDead) {
              // the target doesn't exist, so we are going to re-invoke this invocation;
              // the reason for the re-invocation is that otherwise it's possible to lose data,
              // e.g. when a map.put() was done and the primary node has returned the response,
              // but has not yet completed the backups and then the primary node fails;
              // the consequence would be that the backups are never be made and the effects of the map.put() will never be visible,
              // even though the future returned a value;
              // so if we would complete the future, a response is sent even though its changes never made it into the system
              resetAndReInvoke();
              return false;
          }
  
          // the backups have not yet completed, but we are going to release the future anyway if a pendingResponse has been set
          complete(pendingResponse);
          return true;
      }