code: @Override
    public RetryDecision onReadTimeout(
        @NonNull Request request,
        @NonNull ConsistencyLevel cl,
        int blockFor,
        int received,
        boolean dataPresent,
        int retryCount) {
  
      RetryDecision decision =
          (retryCount == 0 && received >= blockFor && !dataPresent)
              ? RetryDecision.RETRY_SAME
              : RetryDecision.RETHROW;
  
      if (decision == RetryDecision.RETRY_SAME && LOG.isTraceEnabled()) {
        LOG.trace(RETRYING_ON_READ_TIMEOUT, logPrefix, cl, blockFor, received, false, retryCount);
      }
  
      return decision;
    }
docs: {@inheritDoc}
  
  <p>This implementation triggers a maximum of one retry (to the same node), and only if enough
  replicas had responded to the read request but data was not retrieved amongst those. That
  usually means that enough replicas are alive to satisfy the consistency, but the coordinator
  picked a dead one for data retrieval, not having detected that replica as dead yet. The
  reasoning is that by the time we get the timeout, the dead replica will likely have been
  detected as dead and the retry has a high chance of success.
  
  <p>Otherwise, the exception is rethrown.