From: Matty Williams Date: Thu, 14 May 2026 12:44:12 +0000 (+0100) Subject: osd: Fix condition for rolling forward pg log entries X-Git-Tag: v21.0.1~4^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ec7afb5c27f41f7f263c05311442ed46994fa07f;p=ceph.git osd: Fix condition for rolling forward pg log entries https://tracker.ceph.com/issues/76577 Signed-off-by: Matty Williams --- diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 66a14168580..0082d8dfb0e 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -4794,6 +4794,8 @@ void PeeringState::append_log( } psdout(10) << "append_log " << pg_log.get_log() << " " << logv << dendl; + bool invalidate_pwlc = false; + PGLog::LogEntryHandlerRef handler{pl->get_log_handler(t)}; if (!transaction_applied) { /* We must be a backfill or async recovery peer, so it's ok if we apply @@ -4806,17 +4808,7 @@ void PeeringState::append_log( * object is deleted before we can _merge_object_divergent_entries(). */ pg_log.skip_rollforward(&info, handler.get()); - /* Invalidate pwlc for this shard until the next interval when - * it will be updated with the pwlc from another shard - */ - for (auto & [shard, versionrange] : - info.partial_writes_last_complete) { - auto & [fromversion, toversion] = versionrange; - fromversion.epoch = 0; - fromversion.version = eversion_t::max().version; - toversion = fromversion; - } - info.partial_writes_last_complete_epoch = 0; + invalidate_pwlc = true; } for (auto p = logv.begin(); p != logv.end(); ++p) { @@ -4825,9 +4817,12 @@ void PeeringState::append_log( /* We don't want to leave the rollforward artifacts around * here past last_backfill. It's ok for the same reason as * above */ - if (transaction_applied && - p->soid > info.last_backfill) { + if (transaction_applied && !is_acting(pg_whoami)) { + psdout(20) << __func__ + << ": rolling forward because of backfill/async_recovery, soid=" + << p->soid << " entry=" << *p << dendl; pg_log.roll_forward(&info, handler.get()); + invalidate_pwlc = true; } } if (transaction_applied && roll_forward_to > pg_log.get_can_rollback_to()) { @@ -4838,6 +4833,20 @@ void PeeringState::append_log( last_rollback_info_trimmed_to_applied = roll_forward_to; } + if (invalidate_pwlc) { + /* Invalidate pwlc for this shard until the next interval when + * it will be updated with the pwlc from another shard + */ + for (auto & [shard, versionrange] : + info.partial_writes_last_complete) { + auto & [fromversion, toversion] = versionrange; + fromversion.epoch = 0; + fromversion.version = eversion_t::max().version; + toversion = fromversion; + } + info.partial_writes_last_complete_epoch = 0; + } + psdout(10) << "approx pg log length = " << pg_log.get_log().approx_size() << dendl; psdout(10) << "dups pg log length = "