void handleResponse(ResponseInfo responseInfo) {
    long startTime = time.milliseconds();
    GetResponse getResponse =
        RouterUtils.extractResponseAndNotifyResponseHandler(responseHandler, routerMetrics, responseInfo,
            stream -> GetResponse.readFrom(stream, clusterMap), response -> {
              ServerErrorCode serverError = response.getError();
              if (serverError == ServerErrorCode.NoError) {
                serverError = response.getPartitionResponseInfoList().get(0).getErrorCode();
              }
              return serverError;
            });
    RequestInfo routerRequestInfo = responseInfo.getRequestInfo();
    GetRequest getRequest = (GetRequest) routerRequestInfo.getRequest();
    GetOperation getOperation = correlationIdToGetOperation.remove(getRequest.getCorrelationId());
    if (getOperation != null && getOperations.contains(getOperation)) {
      try {
        getOperation.handleResponse(responseInfo, getResponse);
        if (getOperation.isOperationComplete()) {
          remove(getOperation);
        }
      } catch (Exception e) {
        removeAndAbort(getOperation, new RouterException("Get handleResponse encountered unexpected error", e,
            RouterErrorCode.UnexpectedInternalError));
      }
      routerMetrics.getManagerHandleResponseTimeMs.update(time.milliseconds() - startTime);
    } else {
      routerMetrics.ignoredResponseCount.inc();
    }
  }
Hands over the response to the associated GetOperation that issued the request.
@param responseInfo the {@link ResponseInfo} containing the response.
ambry-router/src/main/java/com/github/ambry/router/GetManager.java