mirror of
https://github.com/facebook/sapling.git
synced 2024-10-05 14:28:17 +03:00
add handle to publish finish event when exception thrown
Summary: If the handler throws without returning a future, the finish event will not be published. This diff adds the `LiveRequest` to publish finish event in its destructor. Reviewed By: chadaustin Differential Revision: D29332452 fbshipit-source-id: 880a4b67ba47b737063a3955c9f4bdbf605f1a43
This commit is contained in:
parent
d54083bd53
commit
d8abf544d2
@ -1721,6 +1721,39 @@ constexpr auto kNfs3dHandlers = [] {
|
||||
return handlers;
|
||||
}();
|
||||
|
||||
namespace {
|
||||
struct LiveRequest {
|
||||
LiveRequest(
|
||||
std::shared_ptr<TraceBus<NfsTraceEvent>> traceBus,
|
||||
std::atomic<size_t>& traceDetailedArguments,
|
||||
HandlerEntry& handlerEntry,
|
||||
folly::io::Cursor& deser,
|
||||
uint32_t xid,
|
||||
uint32_t procNumber)
|
||||
: traceBus_{std::move(traceBus)}, xid_{xid}, procNumber_{procNumber} {
|
||||
if (traceDetailedArguments.load(std::memory_order_acquire)) {
|
||||
traceBus_->publish(NfsTraceEvent::start(
|
||||
xid, procNumber, handlerEntry.formatArgs(deser)));
|
||||
} else {
|
||||
traceBus_->publish(NfsTraceEvent::start(xid, procNumber));
|
||||
}
|
||||
}
|
||||
|
||||
LiveRequest(LiveRequest&& that) noexcept = default;
|
||||
LiveRequest& operator=(LiveRequest&&) = delete;
|
||||
|
||||
~LiveRequest() {
|
||||
if (traceBus_) {
|
||||
traceBus_->publish(NfsTraceEvent::finish(xid_, procNumber_));
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<TraceBus<NfsTraceEvent>> traceBus_;
|
||||
uint32_t xid_;
|
||||
uint32_t procNumber_;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
ImmediateFuture<folly::Unit> Nfsd3ServerProcessor::dispatchRpc(
|
||||
folly::io::Cursor deser,
|
||||
folly::io::QueueAppender ser,
|
||||
@ -1753,16 +1786,12 @@ ImmediateFuture<folly::Unit> Nfsd3ServerProcessor::dispatchRpc(
|
||||
"{}({})",
|
||||
handlerEntry.name,
|
||||
handlerEntry.formatArgs(deser));
|
||||
if (traceDetailedArguments_.load(std::memory_order_acquire)) {
|
||||
traceBus_->publish(
|
||||
NfsTraceEvent::start(xid, procNumber, handlerEntry.formatArgs(deser)));
|
||||
} else {
|
||||
traceBus_->publish(NfsTraceEvent::start(xid, procNumber));
|
||||
}
|
||||
|
||||
auto liveRequest = LiveRequest{
|
||||
traceBus_, traceDetailedArguments_, handlerEntry, deser, xid, procNumber};
|
||||
|
||||
return (this->*handlerEntry.handler)(std::move(deser), std::move(ser), xid)
|
||||
.ensure([this, xid, procNumber]() {
|
||||
traceBus_->publish(NfsTraceEvent::finish(xid, procNumber));
|
||||
});
|
||||
.ensure([liveRequest = std::move(liveRequest)]() {});
|
||||
}
|
||||
|
||||
void Nfsd3ServerProcessor::onSocketClosed() {
|
||||
|
Loading…
Reference in New Issue
Block a user