The merge target could be a stray pg that has never got the chance
to finish a complete peering cycle (we never purge strays before merge
is done) and hence leaving a zeroed last_epoch_started in the info.
In case the merge target incorrectly absorbs an invalid history in,
e.g., from an actual placeholder merge source pg, use
history.epoch_created == 0
to identify if the merge target is truly a placeholder instead.
Fixes: https://tracker.ceph.com/issues/37654
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
// make sure we have a meaningful last_epoch_started/clean (if we were a
// placeholder)
- if (info.last_epoch_started == 0) {
+ if (info.history.epoch_created == 0) {
// start with (a) source's history, since these PGs *should* have been
// remapped in concert with each other...
info.history = sources.begin()->second->info.history;