From 26e21355ba30e3256c476512728f3d65976c3a1f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 1 Mar 2019 11:00:55 -0600 Subject: [PATCH] mgr/BaseMgrModule: drop GIL for ceph_send_command 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 (cherry picked from commit 94486a9fb6827157bee2d2483f20222126083b22) Conflicts: src/mgr/BaseMgrModule.cc : Resolved in ceph_send_command --- src/mgr/BaseMgrModule.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mgr/BaseMgrModule.cc b/src/mgr/BaseMgrModule.cc index 6777a5238881c..de026013d5ccf 100644 --- a/src/mgr/BaseMgrModule.cc +++ b/src/mgr/BaseMgrModule.cc @@ -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; } -- 2.39.5