diff options
author | Arne Juul <arnej@verizonmedia.com> | 2021-08-18 10:20:21 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2021-08-18 10:20:21 +0000 |
commit | 6356a437375d9fba44be08f60f6bade18e520586 (patch) | |
tree | d23c4f99306f4cffeaae5ba7e9890b2b12245623 /slobrok | |
parent | 93aceff3649bacfdf39a8772b4605afe9b93a0e6 (diff) |
allow delayed notifications
* may get notifyOk or notifyFailed from a ManagedRpcServer that
we already decided to remove - those can be safely ignored.
Diffstat (limited to 'slobrok')
-rw-r--r-- | slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp | 64 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h | 2 |
2 files changed, 36 insertions, 30 deletions
diff --git a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp index 5836118d37d..3bea2018761 100644 --- a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp +++ b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp @@ -22,13 +22,17 @@ LocalRpcMonitorMap::LocalRpcMonitorMap(FRT_Supervisor &supervisor) LocalRpcMonitorMap::~LocalRpcMonitorMap() = default; -LocalRpcMonitorMap::PerService & +LocalRpcMonitorMap::PerService * LocalRpcMonitorMap::lookup(ManagedRpcServer *rpcsrv) { auto iter = _map.find(rpcsrv->getName()); - LOG_ASSERT(iter != _map.end()); + if (iter == _map.end()) { + return nullptr; + } PerService & psd = iter->second; - LOG_ASSERT(psd.srv.get() == rpcsrv); - return psd; + if (psd.srv.get() != rpcsrv) { + return nullptr; + } + return &psd; } ServiceMapHistory & LocalRpcMonitorMap::history() { @@ -118,36 +122,38 @@ void LocalRpcMonitorMap::remove(const ServiceMapping &mapping) { } void LocalRpcMonitorMap::notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string) { - auto &psd = lookup(rpcsrv); - LOG(debug, "failed: %s->%s", psd.name().c_str(), psd.spec().c_str()); - if (psd.inflight) { - auto target = std::move(psd.inflight); - target->doneHandler(OkState(13, "failed check using listNames callback")); - } - if (psd.localOnly) { - PerService removed = std::move(psd); - auto iter = _map.find(removed.name()); - _map.erase(iter); - if (removed.up) { - _dispatcher.remove(removed.mapping()); + if (auto *psd = lookup(rpcsrv)) { + LOG(debug, "failed: %s->%s", psd->name().c_str(), psd->spec().c_str()); + if (psd->inflight) { + auto target = std::move(psd->inflight); + target->doneHandler(OkState(13, "failed check using listNames callback")); + } + if (psd->localOnly) { + PerService removed = std::move(*psd); + auto iter = _map.find(removed.name()); + _map.erase(iter); + if (removed.up) { + _dispatcher.remove(removed.mapping()); + } + _delete.later(std::move(removed.srv)); + } else if (psd->up) { + psd->up = false; + _dispatcher.remove(psd->mapping()); } - _delete.later(std::move(removed.srv)); - } else if (psd.up) { - psd.up = false; - _dispatcher.remove(psd.mapping()); } } void LocalRpcMonitorMap::notifyOkRpcSrv(ManagedRpcServer *rpcsrv) { - auto &psd = lookup(rpcsrv); - LOG(debug, "ok: %s->%s", psd.name().c_str(), psd.spec().c_str()); - if (psd.inflight) { - auto target = std::move(psd.inflight); - target->doneHandler(OkState()); - } - if (! psd.up) { - psd.up = true; - _dispatcher.add(psd.mapping()); + if (auto *psd = lookup(rpcsrv)) { + LOG(debug, "ok: %s->%s", psd->name().c_str(), psd->spec().c_str()); + if (psd->inflight) { + auto target = std::move(psd->inflight); + target->doneHandler(OkState()); + } + if (! psd->up) { + psd->up = true; + _dispatcher.add(psd->mapping()); + } } } diff --git a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h index 8ca876df6b0..5557bca62f6 100644 --- a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h +++ b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h @@ -93,7 +93,7 @@ private: FRT_Supervisor &_supervisor; std::unique_ptr<MapSubscription> _subscription; - PerService &lookup(ManagedRpcServer *rpcsrv); + PerService *lookup(ManagedRpcServer *rpcsrv); public: LocalRpcMonitorMap(FRT_Supervisor &_supervisor); |