]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: return error code to break next op in cmp_ext 46613/head
authorchunmei-liu <chunmei.liu@intel.com>
Fri, 10 Jun 2022 01:30:20 +0000 (18:30 -0700)
committerchunmei-liu <chunmei.liu@intel.com>
Wed, 22 Jun 2022 00:14:20 +0000 (17:14 -0700)
Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
src/crimson/common/errorator.h
src/crimson/osd/ops_executer.h
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 5898b8c96c24fc1dbd52633d8bb45ee97201e552..73c58b264f76792bc0551b87d47d4655cf9183f1 100644 (file)
@@ -1147,6 +1147,7 @@ namespace ct_error {
   using enametoolong = ct_error_code<static_cast<int>(std::errc::filename_too_long)>;
   using eexist = ct_error_code<static_cast<int>(std::errc::file_exists)>;
   using edquot = ct_error_code<int(122)>;
+  using cmp_fail = ct_error_code<int(4095)>;
 
   struct pass_further_all {
     template <class ErrorT>
index 9a2cd189430c50e55c26f8b4211a7083fcca98fb..2fded4f7fc6713135234e05b8c4ead1211589ee4 100644 (file)
@@ -43,6 +43,7 @@ class OpsExecuter : public seastar::enable_lw_shared_from_this<OpsExecuter> {
     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,
index 829b8ea07c93027b3e6879cac8d8536e46ef3d7a..1cfcd92fa8bcd4b6274beb725a701ba22917846d 100644 (file)
@@ -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<>();
   });
 }
 
index 40a1d4cdb66aca5e2723f9fe0f55612f38270a79..da03426b8909a7e212c08044eaefeca4a3304c6c 100644 (file)
@@ -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,