From: Sage Weil Date: Wed, 15 Sep 2021 23:05:35 +0000 (-0400) Subject: osdc/Objecter: return EIO for new ops X-Git-Tag: v17.1.0~797^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=45ffdda22142943fe35af4f4827a7f3faa70f24e;p=ceph.git osdc/Objecter: return EIO for new ops Signed-off-by: Sage Weil --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9565f4326cac..04acefb335b5 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -2316,11 +2316,21 @@ void Objecter::_op_submit(Op *op, shunique_lock& sul, ceph_t ceph_assert(op->session == NULL); OSDSession *s = NULL; - bool check_for_latest_map = _calc_target(&op->target, nullptr) - == RECALC_OP_TARGET_POOL_DNE; + bool check_for_latest_map = false; + int r = _calc_target(&op->target, nullptr); + switch(r) { + case RECALC_OP_TARGET_POOL_DNE: + check_for_latest_map = true; + break; + case RECALC_OP_TARGET_POOL_EIO: + if (op->has_completion()) { + op->complete(osdc_errc::pool_eio, -EIO); + } + return; + } // Try to get a session, including a retry if we need to take write lock - int r = _get_session(op->target.osd, &s, sul); + r = _get_session(op->target.osd, &s, sul); if (r == -EAGAIN || (check_for_latest_map && sul.owns_lock_shared()) || cct->_conf->objecter_debug_inject_relock_delay) { @@ -2707,6 +2717,11 @@ int Objecter::_calc_target(op_target_t *t, Connection *con, bool any_change) t->osd = -1; return RECALC_OP_TARGET_POOL_DNE; } + + if (pi->has_flag(pg_pool_t::FLAG_EIO)) { + return RECALC_OP_TARGET_POOL_EIO; + } + ldout(cct,30) << __func__ << " base pi " << pi << " pg_num " << pi->get_pg_num() << dendl; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index cd7bd2ab59d5..582ce8c19789 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -2467,6 +2467,7 @@ public: RECALC_OP_TARGET_POOL_DNE, RECALC_OP_TARGET_OSD_DNE, RECALC_OP_TARGET_OSD_DOWN, + RECALC_OP_TARGET_POOL_EIO, }; bool _osdmap_full_flag() const; bool _osdmap_has_pool_full() const; @@ -2517,9 +2518,11 @@ public: private: void _check_op_pool_dne(Op *op, std::unique_lock *sl); + void _check_op_pool_eio(Op *op, std::unique_lock *sl); void _send_op_map_check(Op *op); void _op_cancel_map_check(Op *op); void _check_linger_pool_dne(LingerOp *op, bool *need_unregister); + void _check_linger_pool_eio(LingerOp *op); void _send_linger_map_check(LingerOp *op); void _linger_cancel_map_check(LingerOp *op); void _check_command_map_dne(CommandOp *op); diff --git a/src/osdc/error_code.cc b/src/osdc/error_code.cc index 5dc548385e8d..7823e8b088c4 100644 --- a/src/osdc/error_code.cc +++ b/src/osdc/error_code.cc @@ -70,6 +70,9 @@ const char* osdc_error_category::message(int ev, char*, case osdc_errc::timed_out: return "Operation timed out"; + + case osdc_errc::pool_eio: + return "Pool EIO flag set"; } return "Unknown error"; @@ -96,6 +99,8 @@ osdc_error_category::default_error_condition(int ev) const noexcept { return ceph::errc::does_not_exist; case osdc_errc::timed_out: return bs::errc::timed_out; + case osdc_errc::pool_eio: + return bs::errc::io_error; } return { ev, *this }; @@ -149,6 +154,8 @@ int osdc_error_category::from_code(int ev) const noexcept { return -ENOENT; case osdc_errc::timed_out: return -ETIMEDOUT; + case osdc_errc::pool_eio: + return -EIO; } return -EDOM; } diff --git a/src/osdc/error_code.h b/src/osdc/error_code.h index 53c9e3c3a2a8..eb78a5110b01 100644 --- a/src/osdc/error_code.h +++ b/src/osdc/error_code.h @@ -29,7 +29,8 @@ enum class osdc_errc { not_supported, snapshot_exists, snapshot_dne, - timed_out + timed_out, + pool_eio }; namespace boost::system {