From fd5d2d6d6eb39151d6d96105e83bfd39749d79d5 Mon Sep 17 00:00:00 2001 From: Xiaofei Cui Date: Mon, 17 Dec 2018 16:56:59 +0800 Subject: [PATCH] osd/PrimaryLogPG: fix the extent length error of the sync read The extent.length of the sync read is changed to 0, when the read is failed. This makes the retry of the read with a offset of 0 to read the total object. Let the extent.length as it is, if the return code is -EAGAIN, which will make the read try again later with the correct extent.length. Fixes: https://tracker.ceph.com/issues/37680 Signed-off-by: Xiaofei Cui --- src/osd/PrimaryLogPG.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 56806e1d9b8a2..f08dcb69574f9 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5518,7 +5518,12 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { } if (r >= 0) op.extent.length = r; - else { + else if (r == -EAGAIN) { + // EAGAIN should not change the length of extent or count the read op. + dout(10) << " read got " << r << " / " << op.extent.length + << " bytes from obj " << soid << ". try again." << dendl; + return -EAGAIN; + } else { result = r; op.extent.length = 0; } -- 2.39.5