diff options
author | Arne H Juul <arnej@yahooinc.com> | 2021-09-08 12:08:42 +0000 |
---|---|---|
committer | Arne H Juul <arnej@yahooinc.com> | 2021-09-09 14:09:29 +0000 |
commit | bb42ff1449aec38ff7dffc43eb9370b635c3eef4 (patch) | |
tree | 10434b2f3309b4bc83beb844f6d650205d66aab7 /slobrok | |
parent | 4aaa45e688172ee3ab207d91ef31f8dd028bfdb7 (diff) |
add extra method for use by unregister RPC api
Diffstat (limited to 'slobrok')
-rw-r--r-- | slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp | 41 | ||||
-rw-r--r-- | slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h | 6 |
2 files changed, 47 insertions, 0 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 73d355b7645..79f796dc435 100644 --- a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp +++ b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.cpp @@ -93,6 +93,7 @@ void LocalRpcMonitorMap::addLocal(const ServiceMapping &mapping, if (exists.spec == mapping.spec) { LOG(debug, "added mapping %s->%s was already present", mapping.name.c_str(), mapping.spec.c_str()); + // clear exists.ignoreFirstOk ? inflight->doneHandler(OkState(0, "already registered")); return; } @@ -105,6 +106,42 @@ void LocalRpcMonitorMap::addLocal(const ServiceMapping &mapping, addToMap(mapping, localService(mapping, std::move(inflight)), true); } +void LocalRpcMonitorMap::removeLocal(const ServiceMapping &mapping) { + LOG(debug, "try local remove: mapping %s->%s", + mapping.name.c_str(), mapping.spec.c_str()); + auto old = _map.find(mapping.name); + if (old == _map.end()) { + return; // already removed, OK + } + PerService & exists = old->second; + if (exists.spec != mapping.spec) { + LOG(warning, "tried removeLocal for mapping %s->%s, but already had conflicting mapping %s->%s", + mapping.name.c_str(), mapping.spec.c_str(), + mapping.name.c_str(), exists.spec.c_str()); + return; // unregister for old, conflicting mapping + } + if (exists.localOnly) { + // we can just remove it + auto removed = removeFromMap(old); + if (removed.inflight) { + auto target = std::move(removed.inflight); + target->doneHandler(OkState(13, "removed during initialization")); + } + if (removed.up) { + _dispatcher.remove(removed.mapping); + } + return; + } + // also exists in consensus map, so we can't just remove it + // instead, pretend it's down, and ignore first "up()" notification + exists.ignoreFirstOk = true; + if (exists.up) { + exists.up = false; + _dispatcher.remove(mapping); + } + return; +} + void LocalRpcMonitorMap::add(const ServiceMapping &mapping) { _delayedTasks.handleLater(Event::add(mapping)); } @@ -187,6 +224,10 @@ void LocalRpcMonitorMap::down(const ServiceMapping& mapping) { void LocalRpcMonitorMap::up(const ServiceMapping& mapping) { PerService &psd = lookup(mapping); LOG(debug, "ok: %s->%s", mapping.name.c_str(), psd.spec.c_str()); + if (psd.ignoreFirstOk) { + psd.ignoreFirstOk = false; + return; + } if (psd.inflight) { auto target = std::move(psd.inflight); target->doneHandler(OkState()); 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 33a1109d915..df5ee26d077 100644 --- a/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h +++ b/slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h @@ -73,6 +73,7 @@ private: struct PerService { bool up; bool localOnly; + bool ignoreFirstOk; std::unique_ptr<AddLocalCompletionHandler> inflight; vespalib::string spec; }; @@ -83,6 +84,7 @@ private: return PerService{ .up = false, .localOnly = true, + .ignoreFirstOk = false, .inflight = std::move(inflight), .spec = mapping.spec }; @@ -92,6 +94,7 @@ private: return PerService{ .up = false, .localOnly = false, + .ignoreFirstOk = false, .inflight = {}, .spec = mapping.spec }; @@ -133,6 +136,9 @@ public: void addLocal(const ServiceMapping &mapping, std::unique_ptr<AddLocalCompletionHandler> inflight); + /** for use by unregister API */ + void removeLocal(const ServiceMapping &mapping); + void add(const ServiceMapping &mapping) override; void remove(const ServiceMapping &mapping) override; |