From 613575719191ce55bc8997577965f3a03e22453c Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 14 Feb 2024 00:38:46 +0000 Subject: [PATCH] osd: always send returnvec-on-errors for client's retry Currently there is a discrepancy in terms of the returnvec's presence between MOSDOpReplys sent for original requests and those on dups. The former always contain the returnvec if an error happened, even if `allows_returnvec()` is `false`. This commit extends the behavior on dups. For RCA please see: https://tracker.ceph.com/issues/64192#note-9 Fixes: https://tracker.ceph.com/issues/64192 Signed-off-by: Radoslaw Zarzynski --- src/osd/PrimaryLogPG.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index ca83a563e4f8d..3a49b0ffafd15 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -4288,8 +4288,11 @@ void PrimaryLogPG::execute_ctx(OpContext *ctx) } reply->add_flags(CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK); // append to pg log for dup detection - don't save buffers for now - record_write_error(op, soid, reply, result, - ctx->op->allows_returnvec() ? ctx : nullptr); + // store op's returnvec unconditionally-on-errors to ensure coherency + // with the original request handling (see `ignore_out_data` above). + record_write_error( + op, soid, reply, result, + (ctx->op->allows_returnvec() || result < 0) ? ctx : nullptr); close_op_ctx(ctx); return; } -- 2.39.5