From 5e84a55f292d34c0568ad56e001ea03f3956b0b3 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Sat, 30 Mar 2019 11:15:49 +0800 Subject: [PATCH 1/2] mgr/BaseMgrModule: drop GIL in set_config Holding GIL and run mon_command turns out to be easily deadlock-prone. https://tracker.ceph.com/issues/35985 is a typical report, and here is another. Fix by using PyModuleConfig's own lock for protection of concurrent accesses, which should be sufficient enough. Fixes: http://tracker.ceph.com/issues/39040 Signed-off-by: xie xingguo (cherry picked from commit 96b7319cc92e13198e05398921404959005c26d9) Conflicts: src/mgr/BaseMgrModule.cc : Resolved in ceph_config_set --- src/mgr/BaseMgrModule.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mgr/BaseMgrModule.cc b/src/mgr/BaseMgrModule.cc index 1dbc5bfb48088..499c355260e1b 100644 --- a/src/mgr/BaseMgrModule.cc +++ b/src/mgr/BaseMgrModule.cc @@ -406,7 +406,9 @@ ceph_config_set(BaseMgrModule *self, PyObject *args) if (value) { val = value; } + PyThreadState *tstate = PyEval_SaveThread(); self->py_modules->set_config(self->this_module->get_name(), key, val); + PyEval_RestoreThread(tstate); Py_RETURN_NONE; } From b5035470e5d76e5398ab739cbbd222b96a291d9f Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Sat, 30 Mar 2019 11:26:19 +0800 Subject: [PATCH 2/2] mgr/BaseMgrModule: drop GIL in ceph_store_set Signed-off-by: xie xingguo (cherry picked from commit 5108860c385cc1d905588d2e92d80295e3222ca4) Conflicts: src/mgr/ActivePyModules.cc : Resolved in set_store --- src/mgr/ActivePyModules.cc | 3 --- src/mgr/BaseMgrModule.cc | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mgr/ActivePyModules.cc b/src/mgr/ActivePyModules.cc index 2244eaeb72926..2f62956b01ccd 100644 --- a/src/mgr/ActivePyModules.cc +++ b/src/mgr/ActivePyModules.cc @@ -523,10 +523,7 @@ void ActivePyModules::set_store(const std::string &module_name, Command set_cmd; { - PyThreadState *tstate = PyEval_SaveThread(); Mutex::Locker l(lock); - PyEval_RestoreThread(tstate); - if (val) { store_cache[global_key] = *val; } else { diff --git a/src/mgr/BaseMgrModule.cc b/src/mgr/BaseMgrModule.cc index 499c355260e1b..46b648cf573b5 100644 --- a/src/mgr/BaseMgrModule.cc +++ b/src/mgr/BaseMgrModule.cc @@ -449,7 +449,9 @@ ceph_store_set(BaseMgrModule *self, PyObject *args) if (value) { val = value; } + PyThreadState *tstate = PyEval_SaveThread(); self->py_modules->set_store(self->this_module->get_name(), key, val); + PyEval_RestoreThread(tstate); Py_RETURN_NONE; }