summaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2022-02-25 15:50:56 +0000
committerTor Brede Vekterli <vekterli@yahooinc.com>2022-02-25 15:50:56 +0000
commit56e7d9f873421d54c1c6281c860fcdb630dbadbf (patch)
tree7cceee0ddaaa0cf404a2b3997077cf9582e9daa4 /storage
parentb10a166fe31795debf64644508a84e0c4be45c18 (diff)
Gracefully flush pending Slobrok task on content node RPC teardown
Avoids race between transport connection destruction in one FNET thread and processing unregistration task in another FNET thread.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/vespa/storage/storageserver/rpc/shared_rpc_resources.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/storage/src/vespa/storage/storageserver/rpc/shared_rpc_resources.cpp b/storage/src/vespa/storage/storageserver/rpc/shared_rpc_resources.cpp
index e1a2dc6b03c..7ad59ee574c 100644
--- a/storage/src/vespa/storage/storageserver/rpc/shared_rpc_resources.cpp
+++ b/storage/src/vespa/storage/storageserver/rpc/shared_rpc_resources.cpp
@@ -110,7 +110,12 @@ void SharedRpcResources::shutdown() {
assert(!_shutdown);
if (listen_port() > 0) {
_slobrok_register->unregisterName(_handle);
+ // Give slobrok some time to dispatch unregister RPC
+ while (_slobrok_register->busy()) {
+ std::this_thread::sleep_for(10ms);
+ }
}
+ _slobrok_register.reset(); // Implicitly kill any pending slobrok tasks prior to shutting down transport layer
_transport->ShutDown(true);
// FIXME need to reset to break weak_ptrs? But ShutDown should already sync pending resolves...!
_shutdown = true;