]> 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>
Mon, 9 Oct 2023 12:39:04 +0000 (08:39 -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>
(cherry picked from commit e72194b42ce1921e4b687fbed94e9d199923e77b)

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 d03fc1d050e759f4c5fe6a2c63717e4cc2b6f85c..142f79db324b59e4d38a697012b0a26864c57508 100644 (file)
@@ -1507,13 +1507,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 d697cb061714580153015590afdbc482f0cb6282..366f1ba7be2e470719e1ba0b1e092f5ebda0cf94 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 48e50d2ae23cc915f71e13f9461a8531afce6ce5..df32616005002021c01dd76957a02881db1edc9a 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 a629bb0e56445694180a27bbb523a4f8482c9267..26f3f817236516074a3fc5d0852ebda14d9b8ed7 100644 (file)
@@ -1324,7 +1324,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
@@ -2127,7 +2127,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 1371f4c219c53419a9a292bd216671fe3456279c..007386d29c8c0349d9ba4db0ecda5b2e9b88d686 100644 (file)
@@ -162,7 +162,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:
@@ -171,7 +171,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))