aboutsummaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-08-18 10:20:21 +0000
committerArne Juul <arnej@verizonmedia.com>2021-08-18 10:20:21 +0000
commit6356a437375d9fba44be08f60f6bade18e520586 (patch)
treed23c4f99306f4cffeaae5ba7e9890b2b12245623 /slobrok
parent93aceff3649bacfdf39a8772b4605afe9b93a0e6 (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.cpp64
-rw-r--r--slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h2
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);