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) {
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 <devid>, pg_stats,
- pool_stats.
+ pool_stats, pg_ready.
Note:
All these structures have their own JSON representations: experiment
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']])
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)
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):
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):