aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-12-20 10:31:40 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-12-20 10:31:40 +0000
commitd4ff7d34d3d60ff7da1323e4ddb7308efadecdd9 (patch)
tree422112c247b42ccc8bb35f864fd0f932864eee98 /config
parentf3956e6144fdb4fc05b4d61cab45b77a89dca48a (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.cpp20
-rw-r--r--config/src/vespa/config/frt/frtsource.h1
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 *);