From: David Zafman Date: Thu, 9 Jan 2020 00:02:51 +0000 (-0800) Subject: mgr/progress: Add pg_ready interface for python to get pgmap_ready state X-Git-Tag: v14.2.10~14^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1751f2fc406b1f3cdc380fe0a09faf513b538a7c;p=ceph.git mgr/progress: Add pg_ready interface for python to get pgmap_ready state Fixes: https://tracker.ceph.com/issues/43557 Signed-off-by: David Zafman (cherry picked from commit 563811a0f60ad225c0f38b7359f84667043c2017) Conflicts: src/pybind/mgr/progress/module.py - adapted for post-nautilus cleanups src/pybind/mgr/progress/test_progress.py - file not present in nautilus --- diff --git a/src/mgr/ActivePyModules.cc b/src/mgr/ActivePyModules.cc index ee022e875e9..cd334b7016c 100644 --- a/src/mgr/ActivePyModules.cc +++ b/src/mgr/ActivePyModules.cc @@ -372,6 +372,10 @@ PyObject *ActivePyModules::get_python(const std::string &what) pg_map.dump_pool_stats(&f); }); return f.get(); + } else if (what == "pg_ready") { + PyEval_RestoreThread(tstate); + server.dump_pg_ready(&f); + return f.get(); } else if (what == "osd_stats") { cluster_state.with_pgmap( [&f, &tstate](const PGMap &pg_map) { diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 93e770ad9ce..0e7a795be8a 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -288,6 +288,11 @@ bool DaemonServer::ms_dispatch(Message *m) }; } +void DaemonServer::dump_pg_ready(ceph::Formatter *f) +{ + f->dump_bool("pg_ready", pgmap_ready.load()); +} + void DaemonServer::maybe_ready(int32_t osd_id) { if (pgmap_ready.load()) { diff --git a/src/mgr/DaemonServer.h b/src/mgr/DaemonServer.h index 0bc0ad75cc1..3c73d84c53c 100644 --- a/src/mgr/DaemonServer.h +++ b/src/mgr/DaemonServer.h @@ -174,6 +174,7 @@ public: void log_access_denied(std::shared_ptr& cmdctx, MgrSession* session, std::stringstream& ss); + void dump_pg_ready(ceph::Formatter *f); }; #endif diff --git a/src/pybind/mgr/mgr_module.py b/src/pybind/mgr/mgr_module.py index 4e7e923b719..4ca31308cb4 100644 --- a/src/pybind/mgr/mgr_module.py +++ b/src/pybind/mgr/mgr_module.py @@ -702,7 +702,7 @@ class MgrModule(ceph_module.BaseMgrModule): osd_map, osd_map_tree, osd_map_crush, config, mon_map, fs_map, osd_metadata, pg_summary, io_rate, pg_dump, df, osd_stats, health, mon_status, devices, device , pg_stats, - pool_stats. + pool_stats, pg_ready. Note: All these structures have their own JSON representations: experiment diff --git a/src/pybind/mgr/progress/module.py b/src/pybind/mgr/progress/module.py index ce81aaee3bb..fa66e40890e 100644 --- a/src/pybind/mgr/progress/module.py +++ b/src/pybind/mgr/progress/module.py @@ -191,7 +191,7 @@ class PgRecoveryEvent(Event): def evacuating_osds(self): return self. _evacuate_osds - def pg_update(self, raw_pg_stats, log): + def pg_update(self, raw_pg_stats, pg_ready, log): # FIXME: O(pg_num) in python # FIXME: far more fields getting pythonized than we really care about pg_to_state = dict([(p['pgid'], p) for p in raw_pg_stats['pg_stats']]) @@ -206,7 +206,7 @@ class PgRecoveryEvent(Event): pg_to_state[pg_str]['stat_sum']['num_bytes_recovered'] else: missing_pgs.append(pg) - if pg_dump.get('pg_ready', False): + if pg_ready: for pg in missing_pgs: self._pgs.remove(pg) @@ -409,7 +409,7 @@ class Module(MgrModule): which_pgs=affected_pgs, evacuate_osds=[osd_id] ) - ev.pg_update(self.get("pg_stats"), self.log) + ev.pg_update(self.get("pg_stats"), self.get("pg_ready"), self.log) self._events[ev.id] = ev def _osd_in(self, osd_id): @@ -455,9 +455,10 @@ class Module(MgrModule): self._osdmap_changed(old_osdmap, self._latest_osdmap) elif notify_type == "pg_summary": data = self.get("pg_stats") + ready = self.get("pg_ready") for ev_id, ev in self._events.items(): if isinstance(ev, PgRecoveryEvent): - ev.pg_update(data, self.log) + ev.pg_update(data, ready, self.log) self.maybe_complete(ev) def maybe_complete(self, event): diff --git a/src/pybind/mgr/selftest/module.py b/src/pybind/mgr/selftest/module.py index 5a1a8a5fb8d..0bbd773550b 100644 --- a/src/pybind/mgr/selftest/module.py +++ b/src/pybind/mgr/selftest/module.py @@ -236,6 +236,7 @@ class Module(MgrModule): "pg_summary", "pg_status", "pg_dump", + "pg_ready", "df", "pg_stats", "pool_stats",