From 895188987dcc6c30814faaab887de4f46a9651f6 Mon Sep 17 00:00:00 2001 From: chunmei-liu Date: Wed, 27 Jul 2022 23:44:47 -0700 Subject: [PATCH] crimson: for cmp_fail error, return -MAX_ERRNO-index instead of cmp_fail error code. Signed-off-by: chunmei-liu --- src/crimson/common/errorator.h | 3 ++- src/crimson/osd/ops_executer.cc | 6 +++++- src/crimson/osd/pg.cc | 11 +++++++++++ src/crimson/osd/pg_backend.cc | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 73c58b264f76..c6c1a8b476d3 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -1147,7 +1147,8 @@ 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; + constexpr int cmp_fail_error_value = 4095; + using cmp_fail = ct_error_code; struct pass_further_all { template diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index a074d114ac92..706105f091fd 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -479,7 +479,11 @@ OpsExecuter::execute_op(OSDOp& osd_op) return do_execute_op(osd_op).handle_error_interruptible( osd_op_errorator::all_same_way([&osd_op](auto e, auto&& e_raw) -> OpsExecuter::osd_op_errorator::future<> { - osd_op.rval = -e.value(); + // All ops except for CMPEXT should have rval set to -e.value(), + // CMPEXT sets rval itself and shouldn't be overridden. + if (e.value() != ct_error::cmp_fail_error_value) { + osd_op.rval = -e.value(); + } if ((osd_op.op.flags & CEPH_OSD_OP_FLAG_FAILOK) && e.value() != EAGAIN && e.value() != EINPROGRESS) { return osd_op_errorator::now(); diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index cac17c2f7aad..98cb4e831c66 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -831,6 +831,17 @@ PG::do_osd_ops( m->ops.back().op.flags & CEPH_OSD_OP_FLAG_FAILOK) { reply->set_result(0); } + // For all ops except for CMPEXT, the correct error value is encoded + // in e.value(). For CMPEXT, osdop.rval has the actual error value. + if (e.value() == ct_error::cmp_fail_error_value) { + assert(!m->ops.empty()); + for (auto &osdop : m->ops) { + if (osdop.rval < 0) { + reply->set_result(osdop.rval); + break; + } + } + } reply->set_enoent_reply_versions( peering_state.get_info().last_update, peering_state.get_info().last_user_version); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 74e607bffe64..5adcd112940d 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -422,6 +422,8 @@ PGBackend::cmp_ext(const ObjectState& os, OSDOp& osd_op) 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); + // Unlike other ops, we set osd_op.rval here and return a different + // error code via ct_error::cmp_fail. osd_op.rval = -MAX_ERRNO - index; return crimson::ct_error::cmp_fail::make(); } -- 2.47.3