diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2019-03-14 14:29:34 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2019-03-14 14:45:33 +0000 |
commit | 0cd96762e725678f3087dc94d5d051f527f8a19e (patch) | |
tree | ec83a6e79265554915dcfc658fd4e2213e20e74f | |
parent | ff201447a3e3d1ef22232742c99ea0aa7ab72718 (diff) |
protect from invoking new requests during destructor
* race condition during shutdown would lead to core dump in
some rare cases.
-rw-r--r-- | slobrok/src/vespa/slobrok/server/remote_slobrok.cpp | 6 |
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 || |