private void fetchRequests(RequestRegistrationCallback<PutOperation> requestRegistrationCallback) {
      Iterator<ReplicaId> replicaIterator = operationTracker.getReplicaIterator();
      while (replicaIterator.hasNext()) {
        ReplicaId replicaId = replicaIterator.next();
        String hostname = replicaId.getDataNodeId().getHostname();
        Port port = RouterUtils.getPortToConnectTo(replicaId, routerConfig.routerEnableHttp2NetworkClient);
        PutRequest putRequest = createPutRequest();
        RequestInfo requestInfo =
            new RequestInfo(hostname, port, putRequest, replicaId, prepareQuotaCharger(), time.milliseconds(),
                routerConfig.routerRequestNetworkTimeoutMs, routerConfig.routerRequestTimeoutMs);
        int correlationId = putRequest.getCorrelationId();
        correlationIdToChunkPutRequestInfo.put(correlationId, requestInfo);
        correlationIdToPutChunk.put(correlationId, this);
        requestRegistrationCallback.registerRequestToSend(PutOperation.this, requestInfo);
        replicaIterator.remove();
        if (RouterUtils.isRemoteReplica(routerConfig, replicaId)) {
          logger.debug("{}: Making request with correlationId {} to a remote replica {} in {}", loggingContext,
              correlationId, replicaId.getDataNodeId(), replicaId.getDataNodeId().getDatacenterName());
          routerMetrics.crossColoRequestCount.inc();
        } else {
          logger.trace("{}: Making request with correlationId {} to a local replica {}", loggingContext, correlationId,
              replicaId.getDataNodeId());
        }
        routerMetrics.getDataNodeBasedMetrics(replicaId.getDataNodeId()).putRequestRate.mark();
        routerMetrics.routerPutRequestRate.mark();
      }
    }
Fetch {@link PutRequest}s to send for the current data chunk.
ambry-router/src/main/java/com/github/ambry/router/PutOperation.java