aboutsummaryrefslogtreecommitdiffstats
path: root/slobrok/src
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-08-20 09:36:29 +0000
committerArne Juul <arnej@verizonmedia.com>2021-08-20 09:40:11 +0000
commit4db1a2342f93ecc79d606b5433de4b1cd8c76fd3 (patch)
tree34367072cc03eb8ec9623f3a26266d07f9228d96 /slobrok/src
parent5fe3186391f501839d7627a7118aef0176f3ea7a (diff)
update after review
* MappingMonitorListener -> MappingMonitorOwner * construct with factory * RpcMappingMonitor always has an owner * refactor common lookup into active() method
Diffstat (limited to 'slobrok/src')
-rw-r--r--slobrok/src/vespa/slobrok/server/mapping_monitor.h13
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.cpp47
-rw-r--r--slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.h8
3 files changed, 28 insertions, 40 deletions
diff --git a/slobrok/src/vespa/slobrok/server/mapping_monitor.h b/slobrok/src/vespa/slobrok/server/mapping_monitor.h
index d7e1a6975cb..035023f32fa 100644
--- a/slobrok/src/vespa/slobrok/server/mapping_monitor.h
+++ b/slobrok/src/vespa/slobrok/server/mapping_monitor.h
@@ -3,23 +3,26 @@
#pragma once
#include "service_mapping.h"
+#include <memory>
+#include <functional>
namespace slobrok {
-struct MappingMonitorListener {
+struct MappingMonitorOwner {
virtual void up(const ServiceMapping& mapping) = 0;
virtual void down(const ServiceMapping& mapping) = 0;
protected:
- ~MappingMonitorListener() = default;
+ ~MappingMonitorOwner() = default;
};
struct MappingMonitor {
- virtual void target(MappingMonitorListener *listener) = 0;
+ using UP = std::unique_ptr<MappingMonitor>;
virtual void start(const ServiceMapping& mapping) = 0;
virtual void stop(const ServiceMapping& mapping) = 0;
-protected:
- ~MappingMonitor() = default;
+ virtual ~MappingMonitor() = default;
};
+using MappingMonitorFactory = std::function<MappingMonitor::UP(MappingMonitorOwner &)>;
+
} // namespace slobrok
diff --git a/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.cpp b/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.cpp
index ec56db709f5..80c1a7d445a 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.cpp
+++ b/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.cpp
@@ -12,25 +12,15 @@ void RpcMappingMonitor::DelayedTasks::PerformTask() {
std::swap(deleteAfterSwap, _deleteList);
}
-RpcMappingMonitor::RpcMappingMonitor(FRT_Supervisor &orb)
+RpcMappingMonitor::RpcMappingMonitor(FRT_Supervisor &orb, MappingMonitorOwner &owner)
: _orb(orb),
_delayedTasks(orb.GetScheduler()),
_map(),
- _target(nullptr)
+ _owner(owner)
{}
RpcMappingMonitor::~RpcMappingMonitor() = default;
-void RpcMappingMonitor::target(MappingMonitorListener *listener) {
- if (listener == nullptr) {
- LOG_ASSERT(_target != nullptr);
- } else {
- LOG_ASSERT(_target == nullptr);
- }
- _target = listener;
- LOG(debug, "new target %p", _target);
-}
-
void RpcMappingMonitor::start(const ServiceMapping& mapping) {
LOG(spam, "start %s->%s", mapping.name.c_str(), mapping.spec.c_str());
LOG_ASSERT(_map.find(mapping) == _map.end());
@@ -46,39 +36,32 @@ void RpcMappingMonitor::stop(const ServiceMapping& mapping) {
_map.erase(iter);
}
+
+bool RpcMappingMonitor::active(const ServiceMapping &mapping, ManagedRpcServer *rpcsrv) const {
+ auto iter = _map.find(mapping);
+ if (iter == _map.end()) {
+ return false;
+ }
+ return iter->second.get() == rpcsrv;
+}
+
void RpcMappingMonitor::notifyFailedRpcSrv(ManagedRpcServer *rpcsrv, std::string errmsg) {
ServiceMapping mapping{rpcsrv->getName(), rpcsrv->getSpec()};
LOG(spam, "notifyFailed %s->%s", mapping.name.c_str(), mapping.spec.c_str());
- Map::const_iterator iter = _map.find(mapping);
- if (iter == _map.end()) {
- return;
- }
- const MUP & managedRpcServer = iter->second;
- if (managedRpcServer.get() != rpcsrv) {
- return;
- }
- if (_target) {
+ if (active(mapping, rpcsrv)) {
LOG(debug, "service %s [at %s] failed: %s",
mapping.name.c_str(), mapping.spec.c_str(), errmsg.c_str());
- _target->down(mapping);
+ _owner.down(mapping);
}
}
void RpcMappingMonitor::notifyOkRpcSrv(ManagedRpcServer *rpcsrv) {
ServiceMapping mapping{rpcsrv->getName(), rpcsrv->getSpec()};
LOG(spam, "notifyOk %s->%s", mapping.name.c_str(), mapping.spec.c_str());
- Map::const_iterator iter = _map.find(mapping);
- if (iter == _map.end()) {
- return;
- }
- const MUP & managedRpcServer = iter->second;
- if (managedRpcServer.get() != rpcsrv) {
- return;
- }
- if (_target) {
+ if (active(mapping, rpcsrv)) {
LOG(debug, "service %s [at %s] up ok -> target",
mapping.name.c_str(), mapping.spec.c_str());
- _target->up(mapping);
+ _owner.up(mapping);
}
}
diff --git a/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.h b/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.h
index 36043ac41b2..2f05a459729 100644
--- a/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.h
+++ b/slobrok/src/vespa/slobrok/server/rpc_mapping_monitor.h
@@ -41,12 +41,14 @@ private:
FRT_Supervisor& _orb;
DelayedTasks _delayedTasks;
Map _map;
- MappingMonitorListener* _target;
+ MappingMonitorOwner &_owner;
+
+ bool active(const ServiceMapping &mapping, ManagedRpcServer *rpcsrv) const;
+
public:
- RpcMappingMonitor(FRT_Supervisor &orb);
+ RpcMappingMonitor(FRT_Supervisor &orb, MappingMonitorOwner &owner);
~RpcMappingMonitor();
- void target(MappingMonitorListener *listener) override;
void start(const ServiceMapping& mapping) override;
void stop(const ServiceMapping& mapping) override;