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;
}