]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/BaseMgrModule: drop GIL for ceph_send_command 26830/head
authorSage Weil <sage@redhat.com>
Fri, 1 Mar 2019 17:00:55 +0000 (11:00 -0600)
committerPrashant D <pdhange@redhat.com>
Thu, 7 Mar 2019 23:38:35 +0000 (18:38 -0500)
Otherwise, we can easily deadlock, since other bits of the code hold the
objecter lock and then take the GIL.

Fixes: http://tracker.ceph.com/issues/38537
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 94486a9fb6827157bee2d2483f20222126083b22)

Conflicts:
src/mgr/BaseMgrModule.cc : Resolved in ceph_send_command

src/mgr/BaseMgrModule.cc

index 6777a5238881cc2580d6a7cb6f138af59e508725..de026013d5ccff9e99df2323b7387a388e9bd496 100644 (file)
@@ -137,6 +137,9 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
 
   auto c = new MonCommandCompletion(self->py_modules,
       completion, tag, PyThreadState_Get());
+
+  PyThreadState *tstate = PyEval_SaveThread();
+
   if (std::string(type) == "mon") {
     self->py_modules->get_monc().start_mon_command(
         {cmd_json},
@@ -151,6 +154,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
       delete c;
       string msg("invalid osd_id: ");
       msg.append("\"").append(name).append("\"");
+      PyEval_RestoreThread(tstate);
       PyErr_SetString(PyExc_ValueError, msg.c_str());
       return nullptr;
     }
@@ -175,6 +179,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
     if (r != 0) {
       string msg("failed to send command to mds: ");
       msg.append(cpp_strerror(r));
+      PyEval_RestoreThread(tstate);
       PyErr_SetString(PyExc_RuntimeError, msg.c_str());
       return nullptr;
     }
@@ -184,6 +189,7 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
       delete c;
       string msg("invalid pgid: ");
       msg.append("\"").append(name).append("\"");
+      PyEval_RestoreThread(tstate);
       PyErr_SetString(PyExc_ValueError, msg.c_str());
       return nullptr;
     }
@@ -197,15 +203,18 @@ ceph_send_command(BaseMgrModule *self, PyObject *args)
         &c->outbl,
         &c->outs,
         c);
+    PyEval_RestoreThread(tstate);
     return nullptr;
   } else {
     delete c;
     string msg("unknown service type: ");
     msg.append(type);
+    PyEval_RestoreThread(tstate);
     PyErr_SetString(PyExc_ValueError, msg.c_str());
     return nullptr;
   }
 
+  PyEval_RestoreThread(tstate);
   Py_RETURN_NONE;
 }