From dac649753bcb49bcbeafd70b5128349cfc6f6856 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Jan 2019 09:24:34 -0600 Subject: [PATCH] mgr/ActivePyModules: fix RestoreThread calls for get('devices') Fixes 61aa7e2e0230bff49e757c32932d1db4bcad5f67 Fixes: http://tracker.ceph.com/issues/37736 Signed-off-by: Sage Weil --- src/mgr/ActivePyModules.cc | 13 +++++++------ src/mgr/DaemonState.h | 11 +++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/mgr/ActivePyModules.cc b/src/mgr/ActivePyModules.cc index 4069b100b67..0e72ad75c8f 100644 --- a/src/mgr/ActivePyModules.cc +++ b/src/mgr/ActivePyModules.cc @@ -299,13 +299,14 @@ PyObject *ActivePyModules::get_python(const std::string &what) ); return f.get(); } else if (what == "devices") { - PyEval_RestoreThread(tstate); f.open_array_section("devices"); - daemon_state.with_devices([&f] (const DeviceState& dev) { - f.dump_object("device", dev); - }); - - PyEval_RestoreThread(tstate); + daemon_state.with_devices2( + [&tstate]() { + PyEval_RestoreThread(tstate); + }, + [&f] (const DeviceState& dev) { + f.dump_object("device", dev); + }); f.close_section(); return f.get(); } else if (what.size() > 7 && diff --git a/src/mgr/DaemonState.h b/src/mgr/DaemonState.h index 692c265027c..680d4a0cc2c 100644 --- a/src/mgr/DaemonState.h +++ b/src/mgr/DaemonState.h @@ -334,6 +334,17 @@ public: } } + template + void with_devices2(CallbackInitial&& cbi, // with lock taken + Callback&& cb, // for each device + Args&&... args) const { + RWLock::RLocker l(lock); + cbi(); + for (auto& i : devices) { + std::forward(cb)(*i.second, std::forward(args)...); + } + } + void list_devids_by_server(const std::string& server, std::set *ls) { auto m = get_by_server(server); -- 2.39.5