From a0c9d06bda51160c216035afe14a6a40fb48e9aa Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Thu, 9 Jun 2022 18:30:20 -0700 Subject: [PATCH] crimson/osd: return error code to break next op in cmp_ext Signed-off-by: chunmei-liu --- src/crimson/common/errorator.h | 1 + src/crimson/osd/ops_executer.h | 1 + src/crimson/osd/pg_backend.cc | 12 ++++++------ src/crimson/osd/pg_backend.h | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 5898b8c96c2..73c58b264f7 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 9a2cd189430..2fded4f7fc6 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 829b8ea07c9..1cfcd92fa8b 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 40a1d4cdb66..da03426b890 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, -- 2.39.5