]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/ActivePyModules: fix RestoreThread calls for get('devices')
authorSage Weil <sage@redhat.com>
Fri, 18 Jan 2019 15:24:34 +0000 (09:24 -0600)
committerSage Weil <sage@redhat.com>
Sat, 19 Jan 2019 15:50:27 +0000 (09:50 -0600)
Fixes 61aa7e2e0230bff49e757c32932d1db4bcad5f67

Fixes: http://tracker.ceph.com/issues/37736
Signed-off-by: Sage Weil <sage@redhat.com>
src/mgr/ActivePyModules.cc
src/mgr/DaemonState.h

index 4069b100b67610b9cf268fc9a4974581cec23207..0e72ad75c8f6f7013adac55fa56597cfc1b2abfa 100644 (file)
@@ -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 &&
index 692c265027c060daea6368115f6ff7a4cc2a2e14..680d4a0cc2cf5112e13a1b322e67c92f7110ea9e 100644 (file)
@@ -334,6 +334,17 @@ public:
     }
   }
 
+  template<typename CallbackInitial, typename Callback, typename...Args>
+  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<Callback>(cb)(*i.second, std::forward<Args>(args)...);
+    }
+  }
+
   void list_devids_by_server(const std::string& server,
                             std::set<std::string> *ls) {
     auto m = get_by_server(server);