ReplyT doRoute()

in mcrouter/routes/DestinationRoute.h [238:314]


  ReplyT<Request> doRoute(
      const Request& req,
      ProxyRequestContextWithInfo<RouterInfo>& ctx) const {
    DestinationRequestCtx dctx(nowUs());
    folly::Optional<Request> newReq;
    folly::StringPiece strippedRoutingPrefix;
    if (!keepRoutingPrefix_ && !req.key_ref()->routingPrefix().empty()) {
      newReq.emplace(req);
      newReq->key_ref()->stripRoutingPrefix();
      strippedRoutingPrefix = req.key_ref()->routingPrefix();
    }

    uint64_t remainingDeadlineTime = 0;
    uint64_t totalDestTimeout = 0;
    auto requestClass = fiber_local<RouterInfo>::getRequestClass();
    bool isShadow = requestClass.is(RequestClass::kShadow);

    if (!isShadow && !disableRequestDeadlineCheck_) {
      auto remainingTime = getRemainingTime(req);
      // If deadline request is being used, initialize total timeout
      // (sum of request timeout and connect timeout) and remaining time to
      // deadline
      if (remainingTime.first) {
        remainingDeadlineTime = remainingTime.second;
        totalDestTimeout =
            timeout_.count() + destination_->shortestConnectTimeout().count();
      }
    }

    // Copy the request if failover count is greater than zero or if the
    // total destination timeout is less the remaining time to deadline
    if (fiber_local<RouterInfo>::getFailoverCount() > 0 ||
        totalDestTimeout < remainingDeadlineTime) {
      if (!newReq) {
        newReq.emplace(req);
      }
      if (totalDestTimeout < remainingDeadlineTime) {
        auto proxy = &fiber_local<RouterInfo>::getSharedCtx()->proxy();
        proxy->stats().increment(request_deadline_num_copy_stat);
        setRequestDeadline(*newReq, totalDestTimeout);
      }
      if (fiber_local<RouterInfo>::getFailoverCount() > 0) {
        carbon::detail::setRequestFailover(*newReq);
        incFailoverHopCount(
            *newReq, fiber_local<RouterInfo>::getFailoverCount());
      }
    }

    const auto& reqToSend = newReq ? *newReq : req;
    ctx.onBeforeRequestSent(
        poolName_,
        *destination_->accessPoint(),
        strippedRoutingPrefix,
        reqToSend,
        fiber_local<RouterInfo>::getRequestClass(),
        dctx.startTime);
    RpcStatsContext rpcContext;
    auto reply = destination_->send(reqToSend, dctx, timeout_, rpcContext);
    ctx.onReplyReceived(
        poolName_,
        *destination_->accessPoint(),
        strippedRoutingPrefix,
        reqToSend,
        reply,
        fiber_local<RouterInfo>::getRequestClass(),
        dctx.startTime,
        dctx.endTime,
        poolStatIndex_,
        rpcContext,
        fiber_local<RouterInfo>::getNetworkTransportTimeUs(),
        fiber_local<RouterInfo>::getExtraDataCallbacks());

    fiber_local<RouterInfo>::incNetworkTransportTimeBy(
        dctx.endTime - dctx.startTime);
    fiber_local<RouterInfo>::setServerLoad(rpcContext.serverLoad);
    return reply;
  }