Commit 1d2d4f32 authored by Mirek Klimos's avatar Mirek Klimos Committed by Facebook Github Bot

Add warnings when overriding RequestContext

Summary: We currently store the previous value on creation of RequestContextScopeGuard and reset it to the previous one when it goes out of scope - this means that if it's not unset properly somewhere, we'll prolong its life by saving it and restoring later. We need to do this because of some edge cases but a RequestContext should generally never be overridden by a different RequestContext - let's add a warning if this happens

Reviewed By: djwatson, palmtenor

Differential Revision: D3971904

fbshipit-source-id: e72b5f01102d18977d8aa5f8dca5a7802545098a
parent d07b730b
...@@ -107,16 +107,26 @@ class RequestContextScopeGuard { ...@@ -107,16 +107,26 @@ class RequestContextScopeGuard {
std::shared_ptr<RequestContext> prev_; std::shared_ptr<RequestContext> prev_;
public: public:
RequestContextScopeGuard(const RequestContextScopeGuard&) = delete;
RequestContextScopeGuard& operator=(const RequestContextScopeGuard&) = delete;
RequestContextScopeGuard(RequestContextScopeGuard&&) = delete;
RequestContextScopeGuard& operator=(RequestContextScopeGuard&&) = delete;
// Create a new RequestContext and reset to the original value when // Create a new RequestContext and reset to the original value when
// this goes out of scope. // this goes out of scope.
RequestContextScopeGuard() : prev_(RequestContext::saveContext()) { RequestContextScopeGuard() : prev_(RequestContext::saveContext()) {
DLOG_IF(INFO, prev_ != nullptr)
<< "Overriding folly::RequestContext - did you mean to unset it first?";
RequestContext::create(); RequestContext::create();
} }
// Set a RequestContext that was previously captured by saveContext(). It will // Set a RequestContext that was previously captured by saveContext(). It will
// be automatically reset to the original value when this goes out of scope. // be automatically reset to the original value when this goes out of scope.
explicit RequestContextScopeGuard(std::shared_ptr<RequestContext> ctx) explicit RequestContextScopeGuard(std::shared_ptr<RequestContext> ctx)
: prev_(RequestContext::setContext(std::move(ctx))) {} : prev_(RequestContext::setContext(std::move(ctx))) {
DLOG_IF(INFO, prev_ != nullptr && prev_.get() != RequestContext::get())
<< "Overriding folly::RequestContext - did you mean to unset it first?";
}
~RequestContextScopeGuard() { ~RequestContextScopeGuard() {
RequestContext::setContext(std::move(prev_)); RequestContext::setContext(std::move(prev_));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment