]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: always send returnvec-on-errors for client's retry 55570/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 14 Feb 2024 00:38:46 +0000 (00:38 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 14 Feb 2024 00:55:35 +0000 (00:55 +0000)
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 <rzarzyns@redhat.com>
src/osd/PrimaryLogPG.cc

index ca83a563e4f8d2ee60b917af8689857af6d7a282..3a49b0ffafd15daf2aaaf9205c89587d62779d7f 100644 (file)
@@ -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;
   }