diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-20 10:31:40 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-20 10:31:40 +0000 |
commit | d4ff7d34d3d60ff7da1323e4ddb7308efadecdd9 (patch) | |
tree | 422112c247b42ccc8bb35f864fd0f932864eee98 /config | |
parent | f3956e6144fdb4fc05b4d61cab45b77a89dca48a (diff) |
Use a guard to ensure cleanup is done in all cases, and the last thing done before leaving method.
Diffstat (limited to 'config')
-rw-r--r-- | config/src/vespa/config/frt/frtsource.cpp | 20 | ||||
-rw-r--r-- | config/src/vespa/config/frt/frtsource.h | 1 |
2 files changed, 17 insertions, 4 deletions
diff --git a/config/src/vespa/config/frt/frtsource.cpp b/config/src/vespa/config/frt/frtsource.cpp index ea0b514e168..08eeb5171f6 100644 --- a/config/src/vespa/config/frt/frtsource.cpp +++ b/config/src/vespa/config/frt/frtsource.cpp @@ -76,7 +76,7 @@ FRTSource::getConfig() void FRTSource::erase(FRT_RPCRequest * request) { std::lock_guard guard(_lock); - _inflight.erase(request); + assert(1 == _inflight.erase(request)); _cond.notify_all(); } @@ -88,12 +88,25 @@ FRTSource::find(FRT_RPCRequest * request) { return found->second; } +class FRTSource::CleanupGuard { +public: + CleanupGuard(FRTSource * frtSource, FRT_RPCRequest * request) + : _frtSource(frtSource), _request(request) {} + ~CleanupGuard() { + _frtSource->erase(_request); + } +private: + FRTSource * _frtSource; + FRT_RPCRequest * _request; +}; + + void FRTSource::RequestDone(FRT_RPCRequest * request) { + FRTSource::CleanupGuard cleanup(this, request); if (request->GetErrorCode() == FRTE_RPC_ABORT) { LOG(debug, "request aborted, stopping"); - erase(request); return; } std::shared_ptr<FRTConfigRequest> configRequest = find(request); @@ -103,7 +116,6 @@ FRTSource::RequestDone(FRT_RPCRequest * request) configRequest->setError(request->GetErrorCode()); } _agent->handleResponse(*configRequest, configRequest->createResponse(request)); - erase(request); LOG(spam, "Calling schedule"); scheduleNextGetConfig(); } @@ -122,7 +134,7 @@ FRTSource::close() } LOG(spam, "Aborting"); for (auto & request : inflight) { - std::move(request.second)->abort(); + request.second->abort(); } inflight.clear(); LOG(spam, "Waiting"); diff --git a/config/src/vespa/config/frt/frtsource.h b/config/src/vespa/config/frt/frtsource.h index 8bc654dd05a..ceb0484a6bb 100644 --- a/config/src/vespa/config/frt/frtsource.h +++ b/config/src/vespa/config/frt/frtsource.h @@ -27,6 +27,7 @@ public: void reload(int64_t generation) override; void getConfig() override; private: + class CleanupGuard; void scheduleNextGetConfig(); void erase(FRT_RPCRequest *); std::shared_ptr<FRTConfigRequest> find(FRT_RPCRequest *); |