summaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-02-25 16:15:46 +0000
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-02-28 13:14:45 +0000
commit00af3469c33fc20fb3db166e2115a10a4e8226e3 (patch)
tree3ff6e3dd7a7f06abad984f6ed68c71593811a4bf /slobrok
parentf77539dc41418af0305ba863bef3299de6f8f18d (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.cpp11
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();
}