]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: rework register_client to take name and replace
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 27 Feb 2023 20:00:08 +0000 (15:00 -0500)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 27 Jun 2023 18:18:16 +0000 (14:18 -0400)
Two new parameters:

- "name" to allow setting the name associated with the addrv. Previously
  this was hard-coded to the mgr module name. However, we want mgr
  modules to be able to update the libcephsqlite cluster handle.

- "replace" to replace all addrv for the given "name". libcephsqlite
  only ever has one handle, remove the old ones.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mgr/ActivePyModules.cc
src/mgr/ActivePyModules.h
src/mgr/BaseMgrModule.cc
src/mgr/Mgr.cc
src/mgr/PyModuleRegistry.h
src/pybind/mgr/ceph_module.pyi
src/pybind/mgr/mgr_module.py
src/pybind/mgr/mgr_util.py

index c007509f92f1711bc303de240a2757725778fafc..45038e734afcf90c15c0e54e01757ddb4aeef7b7 100644 (file)
@@ -1511,13 +1511,13 @@ void ActivePyModules::cluster_log(const std::string &channel, clog_type prio,
   cl->do_log(prio, message);
 }
 
-void ActivePyModules::register_client(std::string_view name, std::string addrs)
+void ActivePyModules::register_client(std::string_view name, std::string addrs, bool replace)
 {
   entity_addrvec_t addrv;
   addrv.parse(addrs.data());
 
-  dout(7) << "registering msgr client handle " << addrv << dendl;
-  py_module_registry.register_client(name, std::move(addrv));
+  dout(7) << "registering msgr client handle " << addrv << " (replace=" << replace << ")" << dendl;
+  py_module_registry.register_client(name, std::move(addrv), replace);
 }
 
 void ActivePyModules::unregister_client(std::string_view name, std::string addrs)
index 4b180942dde0c9e4a81650b62f1d2d0223b5872d..283f96a6ed95943edc3e84ad3cd31240d7d151c6 100644 (file)
@@ -158,7 +158,7 @@ public:
   void clear_all_progress_events();
   void get_progress_events(std::map<std::string,ProgressEvent>* events);
 
-  void register_client(std::string_view name, std::string addrs);
+  void register_client(std::string_view name, std::string addrs, bool replace);
   void unregister_client(std::string_view name, std::string addrs);
 
   void config_notify();
index 4fb5b250b98b9cc79c404a8a27a454fae10f606a..ab64ac39fbedb1c1f0cbd379c91fd68b015a784b 100644 (file)
@@ -1388,12 +1388,15 @@ ceph_is_authorized(BaseMgrModule *self, PyObject *args)
 static PyObject*
 ceph_register_client(BaseMgrModule *self, PyObject *args)
 {
-  char *addrs = nullptr;
-  if (!PyArg_ParseTuple(args, "s:ceph_register_client", &addrs)) {
+  const char* _name = nullptr;
+  char* addrs = nullptr;
+  int replace = 0;
+  if (!PyArg_ParseTuple(args, "zsp:ceph_register_client", &_name, &addrs, &replace)) {
     return nullptr;
   }
+  auto name = _name ? std::string(_name) : std::string(self->this_module->get_name());
   without_gil([&] {
-    self->py_modules->register_client(self->this_module->get_name(), addrs);
+    self->py_modules->register_client(name, addrs, replace);
   });
   Py_RETURN_NONE;
 }
@@ -1401,12 +1404,14 @@ ceph_register_client(BaseMgrModule *self, PyObject *args)
 static PyObject*
 ceph_unregister_client(BaseMgrModule *self, PyObject *args)
 {
-  char *addrs = nullptr;
-  if (!PyArg_ParseTuple(args, "s:ceph_unregister_client", &addrs)) {
+  const char* _name = nullptr;
+  char* addrs = nullptr;
+  if (!PyArg_ParseTuple(args, "zs:ceph_unregister_client", &_name, &addrs)) {
     return nullptr;
   }
+  auto name = _name ? std::string(_name) : std::string(self->this_module->get_name());
   without_gil([&] {
-    self->py_modules->unregister_client(self->this_module->get_name(), addrs);
+    self->py_modules->unregister_client(name, addrs);
   });
   Py_RETURN_NONE;
 }
index 7dc158fe152e08b1dec134836e675c791146ae2c..cb988cf761cc20e7f5b4f9b00fa546f8f1d25fa1 100644 (file)
@@ -388,7 +388,7 @@ void Mgr::init()
     entity_addrvec_t addrv;
     addrv.parse(ident);
     ident = (char*)realloc(ident, 0);
-    py_module_registry->register_client("libcephsqlite", addrv);
+    py_module_registry->register_client("libcephsqlite", addrv, true);
   }
 #endif
 
index e16b2830d910e8cbcf757a1bf443b7a6e49c090b..9af9abb57625f047f81f6fed0ca76810948f2983 100644 (file)
@@ -202,10 +202,14 @@ public:
     return active_modules->get_services();
   }
 
-  void register_client(std::string_view name, entity_addrvec_t addrs)
+  void register_client(std::string_view name, entity_addrvec_t addrs, bool replace)
   {
     std::lock_guard l(lock);
-    clients.emplace(std::string(name), std::move(addrs));
+    auto n = std::string(name);
+    if (replace) {
+      clients.erase(n);
+    }
+    clients.emplace(n, std::move(addrs));
   }
   void unregister_client(std::string_view name, const entity_addrvec_t& addrs)
   {
index b89402d01be09ef6a53f5d1ef46e5463d3ea7e7e..50147f08f30dbd2533fea8b6d35fe1cd9e8ceded 100644 (file)
@@ -112,7 +112,7 @@ class BaseMgrModule(object):
     def _ceph_remove_mds_perf_query(self, query_id: int) -> None: ...
     def _ceph_reregister_mds_perf_queries(self) -> None: ...
     def _ceph_get_mds_perf_counters(self, query_id: int) -> Optional[Dict[str, List[PerfCounterT]]]: ...
-    def _ceph_unregister_client(self, addrs: str) -> None: ...
-    def _ceph_register_client(self, addrs: str) -> None: ...
+    def _ceph_unregister_client(self, name: Optional[str], addrs: str) -> None: ...
+    def _ceph_register_client(self, name: Optional[str], addrs: str, replace: Optional[bool]) -> None: ...
     def _ceph_is_authorized(self, arguments: Dict[str, str]) -> bool: ...
     def _ceph_get_daemon_health_metrics(self) -> Dict[str, List[Dict[str, Any]]]: ...
index e1db33467b3ab669ea2e40b448196208e5758024..4f929ae490412509ed1c4744aa2db33e421f846c 100644 (file)
@@ -1341,7 +1341,7 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
         if self._rados:
             addrs = self._rados.get_addrs()
             self._rados.shutdown()
-            self._ceph_unregister_client(addrs)
+            self._ceph_unregister_client(None, addrs)
             self._rados = None
 
     @API.expose
@@ -2148,7 +2148,7 @@ class MgrModule(ceph_module.BaseMgrModule, MgrModuleLoggingMixin):
         ctx_capsule = self.get_context()
         self._rados = rados.Rados(context=ctx_capsule)
         self._rados.connect()
-        self._ceph_register_client(self._rados.get_addrs())
+        self._ceph_register_client(None, self._rados.get_addrs(), False)
         return self._rados
 
     @staticmethod
index 0e7c8cb2fb58b3bbb62c106642e941ad6a115c39..8684f8013184e18f548254d873f4b8d77625cecf 100644 (file)
@@ -167,7 +167,7 @@ class CephfsConnectionPool(object):
             logger.debug("CephFS mounting...")
             self.fs.mount(filesystem_name=self.fs_name.encode('utf-8'))
             logger.debug("Connection to cephfs '{0}' complete".format(self.fs_name))
-            self.mgr._ceph_register_client(self.fs.get_addrs())
+            self.mgr._ceph_register_client(None, self.fs.get_addrs(), False)
 
         def disconnect(self) -> None:
             try:
@@ -176,7 +176,7 @@ class CephfsConnectionPool(object):
                 logger.info("disconnecting from cephfs '{0}'".format(self.fs_name))
                 addrs = self.fs.get_addrs()
                 self.fs.shutdown()
-                self.mgr._ceph_unregister_client(addrs)
+                self.mgr._ceph_unregister_client(None, addrs)
                 self.fs = None
             except Exception as e:
                 logger.debug("disconnect: ({0})".format(e))