@Override
    public boolean hasNext() {
      if (replicaIterator.hasNext()) {
        if (shouldSendRequestWithoutConsideringMetrics()) {
          return true;
        }
        if (inflightCount < routerConfig.routerOperationTrackerMaxInflightRequests && isOldestRequestPastDue()) {
          return true;
        }
      }
      return false;
    }
For Adaptive Operation Tracker, we want to achieve this result when the {@link RouterConfig#routerAdaptiveOperationTrackerWaitingForResponse} is true.
1. we don't want to send more than #parallelism requests when all requests get responses in time
2. we don't want to send more than #successTarget requests if we don't know the response.
2. we only send additional request when one of the existing request's latency exceeds 95% or there is a failure response.

For example, if we have 6 replicas and the parallelism is 3, success target is 2, calling hasNext(), next() and remove()
would result in:
replica 1: inflight(0) < parallelism(3) && inflight(0) + successCount(0) < successTarget(2), return true
replica 2: inflight(1) < parallelism(3) && inflight(1) + successCount(0) < successTarget(2), return true
replica 3: inflight(2) < parallelism(3) && inflight(2) + successCount(0) < successTarget(2), return false, since inflight + successCount < successTarget is false.
Replica 1 receives SUCCESS response
replica 3: inflight(1) < parallelism(3) && inflight(1) + successCount(1) < successTarget(2), return false, since inflight + successCount < successTarget is false.
Replica 2 receives FAILURE response
replica 3: inflight(0) < parallelism(3) && inflight(0) + successCount(1) < successTarget(2), return true
replica 4: inflight(1) < parallelism(3) && inflight(1) + successCount(1) < successTarget(2), return false, since inflight + successCount < successTarget is false.
replica 3 exceeds 95% latency
replica 4: return true
@return
ambry-router/src/main/java/com/github/ambry/router/AdaptiveOperationTracker.java