]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/BaseMgrModule: run MonCommandCompletion on the finisher 27699/head
authorSage Weil <sage@redhat.com>
Thu, 18 Apr 2019 18:10:15 +0000 (13:10 -0500)
committerSage Weil <sage@redhat.com>
Sat, 20 Apr 2019 13:49:02 +0000 (08:49 -0500)
The completion takes the ActivePyModules::lock, but the caller may be
holding an internal lock for Objecter and/or MonClient.  Avoid deadlock
by putting the completion on our finisher.

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit b8f2bc43b49b3d9ab815797c3f95a5d10277e6a1)

src/mgr/ActivePyModules.cc
src/mgr/ActivePyModules.h
src/mgr/BaseMgrModule.cc

index 9e32dce58cac9200c47e77bc1f1a0636960c018e..3782223309084397b00bf26a4eaeed090b37f015 100644 (file)
@@ -46,9 +46,11 @@ ActivePyModules::ActivePyModules(PyModuleConfig &module_config_,
   : module_config(module_config_), daemon_state(ds), cluster_state(cs),
     monc(mc), clog(clog_), audit_clog(audit_clog_), objecter(objecter_),
     client(client_), finisher(f),
+    cmd_finisher(g_ceph_context, "cmd_finisher", "cmdfin"),
     server(server), py_module_registry(pmr), lock("ActivePyModules")
 {
   store_cache = std::move(store_data);
+  cmd_finisher.start();
 }
 
 ActivePyModules::~ActivePyModules() = default;
@@ -434,6 +436,9 @@ void ActivePyModules::shutdown()
     lock.Lock();
   }
 
+  cmd_finisher.wait_for_empty();
+  cmd_finisher.stop();
+
   modules.clear();
 }
 
index 758f94f06478cf815639bb6c916ea41b5d0a6eee..b3feb0be4e64cc155a9b9e713eb68adcd6c02a8e 100644 (file)
@@ -47,6 +47,9 @@ class ActivePyModules
   Objecter &objecter;
   Client   &client;
   Finisher &finisher;
+public:
+  Finisher cmd_finisher;
+private:
   DaemonServer &server;
   PyModuleRegistry &py_module_registry;
 
index 083050c61429e79a4cd01bcaee9c13954fa5f93d..e03e3a465401f1af2f3f95396d7f221dbbfa0243 100644 (file)
@@ -165,7 +165,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
         {},
         &command_c->outbl,
         &command_c->outs,
-        c);
+        new C_OnFinisher(c, &self->py_modules->cmd_finisher));
   } else if (std::string(type) == "osd") {
     std::string err;
     uint64_t osd_id = strict_strtoll(name, 10, &err);
@@ -186,7 +186,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
         &tid,
         &command_c->outbl,
         &command_c->outs,
-        command_c);
+        new C_OnFinisher(command_c, &self->py_modules->cmd_finisher));
   } else if (std::string(type) == "mds") {
     int r = self->py_modules->get_client().mds_command(
         name,
@@ -194,7 +194,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
         {},
         &command_c->outbl,
         &command_c->outs,
-        command_c);
+        new C_OnFinisher(command_c, &self->py_modules->cmd_finisher));
     if (r != 0) {
       string msg("failed to send command to mds: ");
       msg.append(cpp_strerror(r));
@@ -221,7 +221,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
         &tid,
         &command_c->outbl,
         &command_c->outs,
-        command_c);
+        new C_OnFinisher(command_c, &self->py_modules->cmd_finisher));
     PyEval_RestoreThread(tstate);
     return nullptr;
   } else {