Skip to content

Commit

Permalink
osd/PG: discover missing objects when an OSD peers and PG is degraded
Browse files Browse the repository at this point in the history
When a PG is remapped from OSD `a` to OSD `b`, the objects are
backfilled. When OSD `a` is restarted, objects become degraded
as `a` is no longer queried or considered as a backfill source.

As the PG is degraded, `PG::discover_all_missing` is not called
when a candidate OSD peers with the primary: The PG is already
active, thus `PG::activate` (and in turn missing object discovery)
is not called. Discovery is also not initiated from
`PG::RecoveryState::Active::react(const MNotifyRec& notevt)`
as there are no unfound objects.

This patch adds a call to `discover_all_missing` when
when an OSD sends its `MNotifyRec` message and the PG is degraded.

Fixes: https://tracker.ceph.com/issues/37439
Signed-off-by: Jonas Jelten <jj@stusta.net>
  • Loading branch information
TheJJ committed Apr 8, 2019
1 parent 1cb3847 commit b3f0101
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/osd/PG.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8558,7 +8558,7 @@ boost::statechart::result PG::RecoveryState::Active::react(const MNotifyRec& not
<< dendl;
pg->proc_replica_info(
notevt.from, notevt.notify.info, notevt.notify.epoch_sent);
if (pg->have_unfound()) {
if (pg->have_unfound() || (pg->is_degraded() && pg->might_have_unfound.count(notevt.from))) {
pg->discover_all_missing(*context< RecoveryMachine >().get_query_map());
}
}
Expand Down

0 comments on commit b3f0101

Please sign in to comment.