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 <cuixiaofei@sangfor.com.cn>
(cherry picked from commit
fd5d2d6d6eb39151d6d96105e83bfd39749d79d5)
}
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;
}