diff options
author | Billy Donahue <billy.donahue@mongodb.com> | 2023-02-08 02:56:19 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-02-15 22:34:06 +0000 |
commit | 5a8a7076ad21c779a2f127df6276cabd5083ea8d (patch) | |
tree | df2e7357371b1c2212ad71d9131e096d63e56b18 | |
parent | a0ee5a1e6ce59b4794b066fdb6863eaba7b879dd (diff) | |
download | mongo-5a8a7076ad21c779a2f127df6276cabd5083ea8d.tar.gz |
SERVER-73699 SessionWorkflow: remove redundant yield and Frame shared_ptrs
(cherry picked from commit 294d9e038f972e4ee6c4c1d155df20f59e725932)
-rw-r--r-- | src/mongo/transport/session_workflow.cpp | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/src/mongo/transport/session_workflow.cpp b/src/mongo/transport/session_workflow.cpp index 0447b597f33..98b58cf42c8 100644 --- a/src/mongo/transport/session_workflow.cpp +++ b/src/mongo/transport/session_workflow.cpp @@ -80,10 +80,10 @@ namespace metrics_detail { /** Applies X(id) for each SplitId */ #define EXPAND_TIME_SPLIT_IDS(X) \ X(started) \ + X(yielded) \ X(receivedWork) \ X(processedWork) \ X(sentResponse) \ - X(yielded) \ X(done) \ /**/ @@ -95,27 +95,27 @@ namespace metrics_detail { * `intervals` are durations between notable pairs of them. * * [started] - * | [receivedWork] - * | | [processedWork] - * | | | [sentResponse] - * | | | | [yielded] + * | [yielded] + * | | [receivedWork] + * | | | [processedWork] + * | | | | [sentResponse] * | | | | | [done] * |<----------------->| total - * | |<------------->| active - * |<->| | | | | receivedWork - * | |<->| | | | processWork - * | | |<->| | | sendResponse - * | | | |<->| | yield + * |<->| | | | | yield + * | |<->| | | | receiveWork + * | | |<--------->| active + * | | |<->| | | processWork + * | | | |<->| | sendResponse * | | | | |<->| finalize */ #define EXPAND_INTERVAL_IDS(X) \ X(total, started, done) \ + X(yield, started, yielded) \ + X(receiveWork, yielded, receivedWork) \ X(active, receivedWork, done) \ - X(receiveWork, started, receivedWork) \ X(processWork, receivedWork, processedWork) \ X(sendResponse, processedWork, sentResponse) \ - X(yield, sentResponse, yielded) \ - X(finalize, yielded, done) \ + X(finalize, sentResponse, done) \ /**/ #define X_ID(id, ...) id, @@ -407,6 +407,17 @@ private: ServiceExecutor* source = nullptr; }; + struct IterationFrame { + explicit IterationFrame(const Impl& impl) : metrics{impl._sep} { + metrics.start(); + } + ~IterationFrame() { + metrics.finish(); + } + + metrics_detail::SessionWorkflowMetrics metrics; + }; + /** Alias: refers to this Impl, but holds a ref to the enclosing workflow. */ std::shared_ptr<Impl> shared_from_this() { return {_workflow->shared_from_this(), this}; @@ -440,6 +451,7 @@ private: // we're trying deliberately to make it happen, to reduce long tail // latency. _yieldPointReached(); + _iterationFrame->metrics.yielded(); return _receiveRequest(); } auto&& [p, f] = makePromiseFuture<void>(); @@ -494,6 +506,7 @@ private: std::unique_ptr<WorkItem> _work; std::unique_ptr<WorkItem> _nextWork; /**< created by exhaust responses */ + boost::optional<IterationFrame> _iterationFrame; }; class SessionWorkflow::Impl::WorkItem { @@ -708,33 +721,20 @@ void SessionWorkflow::Impl::_onLoopError(Status error) { /** Returns a Future representing the completion of one loop iteration. */ Future<void> SessionWorkflow::Impl::_doOneIteration() { - struct Frame { - explicit Frame(std::shared_ptr<Impl> a) : anchor{std::move(a)} { - metrics.start(); - } - ~Frame() { - metrics.finish(); - } - - std::shared_ptr<Impl> anchor; - metrics_detail::SessionWorkflowMetrics metrics{anchor->_sep}; - }; - - auto fr = std::make_shared<Frame>(shared_from_this()); + _iterationFrame.emplace(*this); return _getNextWork() - .then([&, fr](auto work) { - fr->metrics.received(); + .then([&](auto work) { + _iterationFrame->metrics.received(); invariant(!_work); _work = std::move(work); return _dispatchWork(); }) - .then([&, fr](auto rsp) { + .then([&](auto rsp) { _acceptResponse(std::move(rsp)); - fr->metrics.processed(); + _iterationFrame->metrics.processed(); _sendResponse(); - fr->metrics.sent(*session()); - _yieldPointReached(); - fr->metrics.yielded(); + _iterationFrame->metrics.sent(*session()); + _iterationFrame.reset(); }); } |