From d47386c3145d3d4c4ace630ce7b48e552c5f2a5a Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Thu, 22 Aug 2019 15:21:17 +0800 Subject: [PATCH] osd/PeeringState: fix wrong history of merge target 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 --- src/osd/PeeringState.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 01e4e3c1ce181..b8d2ff4edec88 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -2796,7 +2796,7 @@ void PeeringState::merge_from( // 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; -- 2.39.5