def evacuating_osds(self):
return self. _evacuate_osds
- def pg_update(self, pg_dump, log):
+ def pg_update(self, pg_dump, log,latest_osd_map_epoch):
# 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 pg_dump['pg_stats']])
# The PG is gone! Probably a pool was deleted. Drop it.
complete.add(pg)
continue
+ #Only checks the state of each PGs when it's epoch >= the OSDMap's epoch
+ if int(info['reported_epoch']) < int(latest_osd_map_epoch):
+ continue
state = info['state']
which_pgs=affected_pgs,
evacuate_osds=[osd_id]
)
- ev.pg_update(self.get("pg_dump"), self.log)
+ ev.pg_update(self.get("pg_dump"), self.log,self._latest_osdmap.get_epoch())
self._events[ev.id] = ev
def _osd_in(self, osd_id):
data = self.get("pg_dump")
for ev_id, ev in self._events.items():
if isinstance(ev, PgRecoveryEvent):
- ev.pg_update(data, self.log)
+ ev.pg_update(data, self.log,self._latest_osdmap.get_epoch())
self.maybe_complete(ev)
def maybe_complete(self, event):