void handleResponse(ResponseInfo responseInfo) {
    long startTime = time.milliseconds();
    PutResponse putResponse =
        RouterUtils.extractResponseAndNotifyResponseHandler(responseHandler, routerMetrics, responseInfo,
            PutResponse::readFrom, PutResponse::getError);
    RequestInfo routerRequestInfo = responseInfo.getRequestInfo();
    int correlationId = routerRequestInfo.getRequest().getCorrelationId();
    // Get the PutOperation that generated the request.
    PutOperation putOperation = correlationIdToPutOperation.remove(correlationId);
    // If it is still an active operation, hand over the response. Otherwise, ignore.
    // putOperation may be null if the operation was already completed in a previous event loop iteration.
    if (putOperation != null && putOperations.contains(putOperation)) {
      try {
        putOperation.handleResponse(responseInfo, putResponse);
      } catch (Exception e) {
        putOperation.setOperationExceptionAndComplete(
            new RouterException("Put handleResponse encountered unexpected error", e,
                RouterErrorCode.UnexpectedInternalError));
      }
      if (putOperation.isOperationComplete() && putOperations.remove(putOperation)) {
        onComplete(putOperation);
      }
      routerMetrics.putManagerHandleResponseTimeMs.update(time.milliseconds() - startTime);
    } else {
      logger.debug("Put operation not found in map for {} : {}", correlationId, putOperation);
      routerMetrics.ignoredResponseCount.inc();
    }
  }
Hands over the response to the associated PutOperation that issued the request.
@param responseInfo the {@link ResponseInfo} containing the response.
ambry-router/src/main/java/com/github/ambry/router/PutManager.java