From: Sage Weil Date: Fri, 18 Jan 2019 15:24:34 +0000 (-0600) Subject: mgr/ActivePyModules: fix RestoreThread calls for get('devices') X-Git-Tag: v14.1.0~326^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dac649753bcb49bcbeafd70b5128349cfc6f6856;p=ceph.git mgr/ActivePyModules: fix RestoreThread calls for get('devices') Fixes 61aa7e2e0230bff49e757c32932d1db4bcad5f67 Fixes: http://tracker.ceph.com/issues/37736 Signed-off-by: Sage Weil --- 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);