]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: fix crashable DaemonStateIndex::get calls 17933/head
authorJohn Spray <john.spray@redhat.com>
Sat, 23 Sep 2017 17:21:47 +0000 (13:21 -0400)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Sep 2017 10:20:54 +0000 (06:20 -0400)
This function was recently fixed to return null
on missing entries: handle that properly.

Fixes: http://tracker.ceph.com/issues/17737
Signed-off-by: John Spray <john.spray@redhat.com>
src/mgr/PyModules.cc
src/mgr/PyModules.h

index 0fdf21654ab455125f4cf82a5dc1ad7e26aa2952..ffbc6d9d38443d849a6fd55273163a9425b6a445 100644 (file)
@@ -121,10 +121,15 @@ PyObject *PyModules::list_servers_python()
 
 PyObject *PyModules::get_metadata_python(
   std::string const &handle,
-  const std::string &svc_name,
+  const std::string &svc_type,
   const std::string &svc_id)
 {
-  auto metadata = daemon_state.get(DaemonKey(svc_name, svc_id));
+  auto metadata = daemon_state.get(DaemonKey(svc_type, svc_id));
+  if (metadata == nullptr) {
+    derr << "Requested missing service " << svc_type << "." << svc_id << dendl;
+    Py_RETURN_NONE;
+  }
+
   Mutex::Locker l(metadata->lock);
   PyFormatter f;
   f.dump_string("hostname", metadata->hostname);
@@ -137,10 +142,15 @@ PyObject *PyModules::get_metadata_python(
 
 PyObject *PyModules::get_daemon_status_python(
   std::string const &handle,
-  const std::string &svc_name,
+  const std::string &svc_type,
   const std::string &svc_id)
 {
-  auto metadata = daemon_state.get(DaemonKey(svc_name, svc_id));
+  auto metadata = daemon_state.get(DaemonKey(svc_type, svc_id));
+  if (metadata == nullptr) {
+    derr << "Requested missing service " << svc_type << "." << svc_id << dendl;
+    Py_RETURN_NONE;
+  }
+
   Mutex::Locker l(metadata->lock);
   PyFormatter f;
   for (const auto &i : metadata->service_status) {
index 894c42db3f313f5f007e0dbde2a38fdd3930e287..3bb5449d156b3ec94c4113d73266214580222a9f 100644 (file)
@@ -69,10 +69,10 @@ public:
   PyObject *list_servers_python();
   PyObject *get_metadata_python(
     std::string const &handle,
-    const std::string &svc_name, const std::string &svc_id);
+    const std::string &svc_type, const std::string &svc_id);
   PyObject *get_daemon_status_python(
     std::string const &handle,
-    const std::string &svc_name, const std::string &svc_id);
+    const std::string &svc_type, const std::string &svc_id);
   PyObject *get_counter_python(
     std::string const &handle,
     const std::string &svc_name,