summaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2019-03-14 14:29:34 +0000
committerArne Juul <arnej@yahoo-inc.com>2019-03-14 14:45:33 +0000
commit0cd96762e725678f3087dc94d5d051f527f8a19e (patch)
treeec83a6e79265554915dcfc658fd4e2213e20e74f /slobrok
parentff201447a3e3d1ef22232742c99ea0aa7ab72718 (diff)
protect from invoking new requests during destructor
* race condition during shutdown would lead to core dump in some rare cases.
Diffstat (limited to 'slobrok')
-rw-r--r--slobrok/src/vespa/slobrok/server/remote_slobrok.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp b/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
index e8569bbae28..cc4ab45b442 100644
--- a/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
+++ b/slobrok/src/vespa/slobrok/server/remote_slobrok.cpp
@@ -36,6 +36,8 @@ RemoteSlobrok::~RemoteSlobrok()
{
_reconnecter.disable();
+ _pending.clear();
+
if (_remote != nullptr) {
_remote->SubRef();
_remote = nullptr;
@@ -63,6 +65,8 @@ RemoteSlobrok::doPending()
LOG_ASSERT(_remAddReq == nullptr);
LOG_ASSERT(_remRemReq == nullptr);
+ if (_remote == nullptr) return;
+
if ( ! _pending.empty() ) {
std::unique_ptr<NamedService> todo = std::move(_pending.front());
_pending.pop_front();
@@ -158,7 +162,7 @@ RemoteSlobrok::RequestDone(FRT_RPCRequest *req)
_remListReq = nullptr;
// next step is to push the ones I own:
- pushMine();
+ if (_remote != nullptr) pushMine();
} else if (req == _remAddReq) {
// handle response after pushing some name that we managed:
if (req->IsError() && (req->GetErrorCode() == FRTE_RPC_CONNECTION ||