summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-06-30 09:21:05 +0000
committerArne Juul <arnej@verizonmedia.com>2021-07-01 11:02:41 +0000
commit6efebbe0b10420582eab1d0915ac99492a7be420 (patch)
treebac7e2fe1508d76fd499efe05f93212865603bc4
parente631cc1c682a58e1c309dcb62350c1f93d70e145 (diff)
add some new interfaces
* add MapListener interface * add MapSource interface * add ProxyMapSource for simple forwarding
-rw-r--r--slobrok/src/vespa/slobrok/server/CMakeLists.txt7
-rw-r--r--slobrok/src/vespa/slobrok/server/map_listener.cpp21
-rw-r--r--slobrok/src/vespa/slobrok/server/map_listener.h18
-rw-r--r--slobrok/src/vespa/slobrok/server/map_source.cpp10
-rw-r--r--slobrok/src/vespa/slobrok/server/map_source.h16
-rw-r--r--slobrok/src/vespa/slobrok/server/proxy_map_source.cpp44
-rw-r--r--slobrok/src/vespa/slobrok/server/proxy_map_source.h26
7 files changed, 140 insertions, 2 deletions
diff --git a/slobrok/src/vespa/slobrok/server/CMakeLists.txt b/slobrok/src/vespa/slobrok/server/CMakeLists.txt
index 5951e876ecc..5b9059af932 100644
--- a/slobrok/src/vespa/slobrok/server/CMakeLists.txt
+++ b/slobrok/src/vespa/slobrok/server/CMakeLists.txt
@@ -8,17 +8,20 @@ vespa_add_library(slobrok_slobrokserver
i_rpc_server_manager.cpp
managed_rpc_server.cpp
map_diff.cpp
+ map_listener.cpp
+ map_source.cpp
metrics_producer.cpp
monitor.cpp
named_service.cpp
+ proxy_map_source.cpp
reconfigurable_stateserver.cpp
remote_check.cpp
remote_slobrok.cpp
reserved_name.cpp
- rpchooks.cpp
- rpcmirror.cpp
rpc_server_manager.cpp
rpc_server_map.cpp
+ rpchooks.cpp
+ rpcmirror.cpp
sbenv.cpp
service_map_history.cpp
service_mapping.cpp
diff --git a/slobrok/src/vespa/slobrok/server/map_listener.cpp b/slobrok/src/vespa/slobrok/server/map_listener.cpp
new file mode 100644
index 00000000000..b77fde49c7d
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/map_listener.cpp
@@ -0,0 +1,21 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "map_listener.h"
+#include <vespa/log/log.h>
+
+LOG_SETUP(".slobrok.server.map_listener");
+
+namespace slobrok {
+
+MapListener::~MapListener() = default;
+
+void MapListener::update(const ServiceMapping &old_mapping,
+ const ServiceMapping &new_mapping)
+{
+ LOG_ASSERT(old_mapping.name == new_mapping.name);
+ remove(old_mapping);
+ add(new_mapping);
+}
+
+} // namespace slobrok
+
diff --git a/slobrok/src/vespa/slobrok/server/map_listener.h b/slobrok/src/vespa/slobrok/server/map_listener.h
new file mode 100644
index 00000000000..cc99cfb58ac
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/map_listener.h
@@ -0,0 +1,18 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "service_mapping.h"
+
+namespace slobrok {
+
+struct MapListener {
+ virtual void add(const ServiceMapping &mapping) = 0;
+ virtual void remove(const ServiceMapping &mapping) = 0;
+ virtual void update(const ServiceMapping &old_mapping,
+ const ServiceMapping &new_mapping);
+ virtual ~MapListener();
+};
+
+} // namespace slobrok
+
diff --git a/slobrok/src/vespa/slobrok/server/map_source.cpp b/slobrok/src/vespa/slobrok/server/map_source.cpp
new file mode 100644
index 00000000000..6c20835cf31
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/map_source.cpp
@@ -0,0 +1,10 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "map_source.h"
+
+namespace slobrok {
+
+MapSource::~MapSource() = default;
+
+} // namespace slobrok
+
diff --git a/slobrok/src/vespa/slobrok/server/map_source.h b/slobrok/src/vespa/slobrok/server/map_source.h
new file mode 100644
index 00000000000..63d97fa319f
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/map_source.h
@@ -0,0 +1,16 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "map_listener.h"
+
+namespace slobrok {
+
+struct MapSource {
+ virtual void registerListener(MapListener &listener) = 0;
+ virtual void unregisterListener(MapListener &listener) = 0;
+ virtual ~MapSource();
+};
+
+} // namespace slobrok
+
diff --git a/slobrok/src/vespa/slobrok/server/proxy_map_source.cpp b/slobrok/src/vespa/slobrok/server/proxy_map_source.cpp
new file mode 100644
index 00000000000..97579a587e3
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/proxy_map_source.cpp
@@ -0,0 +1,44 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "proxy_map_source.h"
+#include <vespa/log/log.h>
+
+LOG_SETUP(".slobrok.server.proxy_map_source");
+
+namespace slobrok {
+
+ProxyMapSource::ProxyMapSource() = default;
+
+ProxyMapSource::~ProxyMapSource() = default;
+
+void ProxyMapSource::registerListener(MapListener &listener) {
+ _listeners.insert(&listener);
+}
+
+void ProxyMapSource::unregisterListener(MapListener &listener) {
+ _listeners.erase(&listener);
+}
+
+void ProxyMapSource::add(const ServiceMapping &mapping) {
+ for (auto * listener : _listeners) {
+ listener->add(mapping);
+ }
+}
+
+void ProxyMapSource::remove(const ServiceMapping &mapping) {
+ for (auto * listener : _listeners) {
+ listener->remove(mapping);
+ }
+}
+
+void ProxyMapSource::update(const ServiceMapping &old_mapping,
+ const ServiceMapping &new_mapping)
+{
+ LOG_ASSERT(old_mapping.name == new_mapping.name);
+ for (auto * listener : _listeners) {
+ listener->update(old_mapping, new_mapping);
+ }
+}
+
+} // namespace slobrok
+
diff --git a/slobrok/src/vespa/slobrok/server/proxy_map_source.h b/slobrok/src/vespa/slobrok/server/proxy_map_source.h
new file mode 100644
index 00000000000..1af347486fe
--- /dev/null
+++ b/slobrok/src/vespa/slobrok/server/proxy_map_source.h
@@ -0,0 +1,26 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "map_source.h"
+#include <set>
+
+namespace slobrok {
+
+class ProxyMapSource : public MapSource, public MapListener {
+ std::set<MapListener *> _listeners;
+public:
+ ProxyMapSource();
+ ~ProxyMapSource();
+
+ void registerListener(MapListener &listener) override;
+ void unregisterListener(MapListener &listener) override;
+
+ void add(const ServiceMapping &mapping) override;
+ void remove(const ServiceMapping &mapping) override;
+ void update(const ServiceMapping &old_mapping,
+ const ServiceMapping &new_mapping) override;
+};
+
+} // namespace slobrok
+