From: chunmei-liu Date: Fri, 10 Jun 2022 01:30:20 +0000 (-0700) Subject: crimson/osd: return error code to break next op in cmp_ext X-Git-Tag: v18.0.0~635^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=a0c9d06bda51160c216035afe14a6a40fb48e9aa;p=ceph.git crimson/osd: return error code to break next op in cmp_ext Signed-off-by: chunmei-liu --- diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 5898b8c96c24f..73c58b264f767 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -1147,6 +1147,7 @@ namespace ct_error { using enametoolong = ct_error_code(std::errc::filename_too_long)>; using eexist = ct_error_code(std::errc::file_exists)>; using edquot = ct_error_code; + using cmp_fail = ct_error_code; struct pass_further_all { template diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 9a2cd189430c5..2fded4f7fc671 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -43,6 +43,7 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this { crimson::ct_error::eexist, crimson::ct_error::enospc, crimson::ct_error::edquot, + crimson::ct_error::cmp_fail, crimson::ct_error::eagain, crimson::ct_error::invarg, crimson::ct_error::erange, diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 829b8ea07c930..1cfcd92fa8bcd 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -398,19 +398,19 @@ PGBackend::cmp_ext(const ObjectState& os, OSDOp& osd_op) } else { read_ext = _read(os.oi.soid, op.extent.offset, ext_len, 0); } - return read_ext.safe_then_interruptible([&osd_op](auto&& read_bl) { - int32_t retcode = 0; + return read_ext.safe_then_interruptible([&osd_op](auto&& read_bl) + -> cmp_ext_errorator::future<> { for (unsigned index = 0; index < osd_op.indata.length(); index++) { char byte_in_op = osd_op.indata[index]; char byte_from_disk = (index < read_bl.length() ? read_bl[index] : 0); if (byte_in_op != byte_from_disk) { logger().debug("cmp_ext: mismatch at {}", index); - retcode = -MAX_ERRNO - index; - break; + osd_op.rval = -MAX_ERRNO - index; + return crimson::ct_error::cmp_fail::make(); } } - logger().debug("cmp_ext: {}", retcode); - osd_op.rval = retcode; + osd_op.rval = 0; + return cmp_ext_errorator::make_ready_future<>(); }); } diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 40a1d4cdb66ac..da03426b8909a 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -99,7 +99,8 @@ public: const ObjectState& os, OSDOp& osd_op); using cmp_ext_errorator = ll_read_errorator::extend< - crimson::ct_error::invarg>; + crimson::ct_error::invarg, + crimson::ct_error::cmp_fail>; using cmp_ext_ierrorator = ::crimson::interruptible::interruptible_errorator< ::crimson::osd::IOInterruptCondition,