osd/scrub: restart snap trimming only after scrubbing is done

Snap trimming that was postponed as the target PG was scrubbing
must be restarted at scrub completion.
PR #38111 moved trimming restart to just before the scrub fully
terminated. The current PR fixes that.

Trimming is also restarted in those cases where scrub was
queued but aborted immediately.

Fixes: https://tracker.ceph.com/issues/52026

Signed-off-by: Ronen Friedman <rfriedma@redhat.com>
This commit is contained in:
Ronen Friedman 2022-03-25 10:45:47 +00:00
parent 502ce262ff
commit 948d3266c6
2 changed files with 9 additions and 7 deletions

View File

@ -4912,8 +4912,8 @@ void PrimaryLogPG::kick_snap_trim()
void PrimaryLogPG::snap_trimmer_scrub_complete()
{
if (is_primary() && is_active() && is_clean()) {
ceph_assert(!snap_trimq.empty());
if (is_primary() && is_active() && is_clean() && !snap_trimq.empty()) {
dout(10) << "scrub finished - requeuing snap_trimmer" << dendl;
snap_trimmer_machine.process_event(ScrubComplete());
}
}

View File

@ -189,6 +189,8 @@ void PgScrubber::initiate_regular_scrub(epoch_t epoch_queued)
dout(10) << "scrubber event --<< StartScrub" << dendl;
} else {
clear_queued_or_active();
// and just in case snap trimming was blocked by the aborted scrub
m_pg->snap_trimmer_scrub_complete();
}
}
@ -203,6 +205,8 @@ void PgScrubber::initiate_scrub_after_repair(epoch_t epoch_queued)
dout(10) << "scrubber event --<< AfterRepairScrub" << dendl;
} else {
clear_queued_or_active();
// and just in case snap trimming was blocked by the aborted scrub
m_pg->snap_trimmer_scrub_complete();
}
}
@ -1793,11 +1797,6 @@ void PgScrubber::scrub_finish()
&t);
int tr = m_osds->store->queue_transaction(m_pg->ch, std::move(t), nullptr);
ceph_assert(tr == 0);
if (!m_pg->snap_trimq.empty()) {
dout(10) << "scrub finished, requeuing snap_trimmer" << dendl;
m_pg->snap_trimmer_scrub_complete();
}
}
if (has_error) {
@ -1817,6 +1816,9 @@ void PgScrubber::scrub_finish()
if (m_pg->is_active() && m_pg->is_primary()) {
m_pg->recovery_state.share_pg_info();
}
// we may have blocked the snap trimmer
m_pg->snap_trimmer_scrub_complete();
}
void PgScrubber::on_digest_updates()