void handleResponse(ResponseInfo responseInfo) {
    long startTime = time.milliseconds();
    TtlUpdateResponse ttlUpdateResponse =
        RouterUtils.extractResponseAndNotifyResponseHandler(responseHandler, routerMetrics, responseInfo,
            TtlUpdateResponse::readFrom, TtlUpdateResponse::getError);
    RequestInfo routerRequestInfo = responseInfo.getRequestInfo();
    int correlationId = routerRequestInfo.getRequest().getCorrelationId();
    TtlUpdateOperation ttlUpdateOperation = correlationIdToTtlUpdateOperation.remove(correlationId);
    if (ttlUpdateOperation == null) {
      LOGGER.warn("No TtlUpdateOperation found for correlation id: {}", correlationId);
      routerMetrics.ignoredResponseCount.inc();
      return;
    }
    // If it is still an active operation, hand over the response. Otherwise, ignore.
    if (ttlUpdateOperations.contains(ttlUpdateOperation)) {
      boolean exceptionEncountered = false;
      try {
        ttlUpdateOperation.handleResponse(responseInfo, ttlUpdateResponse);
      } catch (Exception e) {
        exceptionEncountered = true;
        ttlUpdateOperation.setOperationException(
            new RouterException("TTLUpdate handleResponse encountered unexpected error", e,
                RouterErrorCode.UnexpectedInternalError));
      }
      if (exceptionEncountered || ttlUpdateOperation.isOperationComplete()) {
        if (ttlUpdateOperations.remove(ttlUpdateOperation)) {
          onComplete(ttlUpdateOperation);
        }
      }
      routerMetrics.ttlUpdateManagerHandleResponseTimeMs.update(time.milliseconds() - startTime);
    } else {
      routerMetrics.ignoredResponseCount.inc();
    }
  }
Handles responses received for each of the {@link TtlUpdateOperation} within this TtlUpdateManager.
@param responseInfo the {@link ResponseInfo} containing the response.
ambry-router/src/main/java/com/github/ambry/router/TtlUpdateManager.java