diff options
author | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-02-25 16:15:46 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahooinc.com> | 2022-02-28 13:14:45 +0000 |
commit | 00af3469c33fc20fb3db166e2115a10a4e8226e3 (patch) | |
tree | 3ff6e3dd7a7f06abad984f6ed68c71593811a4bf /slobrok | |
parent | f77539dc41418af0305ba863bef3299de6f8f18d (diff) |
Fix Slobrok race between completion callback and scheduled task
This resolves a racing read/write on "request done" status that may
happen when RPC `HandleDone()` is invoked from one FNET thread and
`PerformTask()` is concurrently invoked from another FNET thread.
Diffstat (limited to 'slobrok')
-rw-r--r-- | slobrok/src/vespa/slobrok/sbregister.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/slobrok/src/vespa/slobrok/sbregister.cpp b/slobrok/src/vespa/slobrok/sbregister.cpp index cdab4d4009d..f0d7b3f43cb 100644 --- a/slobrok/src/vespa/slobrok/sbregister.cpp +++ b/slobrok/src/vespa/slobrok/sbregister.cpp @@ -125,6 +125,7 @@ RegisterAPI::unregisterName(vespalib::stringref name) void RegisterAPI::handleReqDone() { + std::lock_guard guard(_lock); if (_reqDone) { _reqDone = false; if (_req->IsError()) { @@ -268,11 +269,13 @@ RegisterAPI::PerformTask() void -RegisterAPI::RequestDone(FRT_RPCRequest *req) +RegisterAPI::RequestDone([[maybe_unused]] FRT_RPCRequest *req) { - LOG_ASSERT(req == _req && !_reqDone); - (void) req; - _reqDone = true; + { + std::lock_guard guard(_lock); + LOG_ASSERT(req == _req && !_reqDone); + _reqDone = true; + } ScheduleNow(); } |