From 7e0d6bf149e07422ce9ca45d1a4ca0234f67cc39 Mon Sep 17 00:00:00 2001 From: Bill Scales Date: Mon, 23 Jun 2025 10:24:17 +0100 Subject: [PATCH] osd: Optimized EC pools - fix overaggressive assert in read_log_and_missing Non-primary shards may not be updated because of partial writes. This means that the OI verison for an object on these shards may be stale. An assert in read_log_and_missing was checking that the OI version matched the have version in a missing entry. The missing entry calculates the have version using the prior_version from a log entry, this does not take into account partial writes so can be ahead of the stale OI version. Relax the assert for optimized pools to require have >= oi.version Signed-off-by: Bill Scales (cherry picked from commit 74e138a7c1f8b7e375568c6811a60f6bdad181b3) --- src/osd/PGLog.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index f7d0386d9cf81..eea032b780d5c 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -1719,7 +1719,14 @@ public: ceph_assert(miter->second.need == i->version); // the 'have' version is reset if an object is deleted, // then created again - ceph_assert(miter->second.have == oi.version || miter->second.have == eversion_t()); + if (ec_optimizations_enabled) { + // non-primary shards in an optimized pool may not have updates + // because of partial writes, which may result in oi.version being + // less than have + ceph_assert(miter->second.have >= oi.version || miter->second.have == eversion_t()); + } else { + ceph_assert(miter->second.have == oi.version || miter->second.have == eversion_t()); + } checked.insert(i->soid); } else { missing.add(i->soid, i->version, oi.version, i->is_delete()); -- 2.39.5