aboutsummaryrefslogtreecommitdiffstats
path: root/slobrok
diff options
context:
space:
mode:
authorArne H Juul <arnej@yahooinc.com>2021-09-08 12:08:42 +0000
committerArne H Juul <arnej@yahooinc.com>2021-09-09 14:09:29 +0000
commitbb42ff1449aec38ff7dffc43eb9370b635c3eef4 (patch)
tree10434b2f3309b4bc83beb844f6d650205d66aab7 /slobrok
parent4aaa45e688172ee3ab207d91ef31f8dd028bfdb7 (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.cpp41
-rw-r--r--slobrok/src/vespa/slobrok/server/local_rpc_monitor_map.h6
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;