]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: fix crashable DaemonStateIndex::get calls 18412/head
authorJohn Spray <john.spray@redhat.com>
Sat, 23 Sep 2017 17:21:47 +0000 (13:21 -0400)
committerKarol Mroz <kmroz@suse.de>
Fri, 20 Oct 2017 01:13:46 +0000 (18:13 -0700)
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>
(cherry picked from commit ade4827d86bb2bc79466a2da040475651c2aae0d)

src/mgr/PyModules.cc
src/mgr/PyModules.h

index 5fa6df9cf7a5f16d7d35f8270a80a67d439f9d47..6b3b50e599c9fff766c8b745690183501289b1f8 100644 (file)
@@ -119,10 +119,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);
@@ -135,10 +140,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 c7aad4e5df8859587ac1f7a353e3a930d6d44e16..ef94c3b99379c12f7c64c49881a48ed3d7743ab8 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,