From f1c495b7a220ed2bd67d19f5b88a2c31e8c82ddd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 15 Sep 2021 19:06:02 -0400 Subject: [PATCH] osdc/Objecter: return EIO for existing ops and linger ops Signed-off-by: Sage Weil --- src/osdc/Objecter.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 04acefb335b5b..a9f87b5bdff80 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1066,6 +1066,13 @@ void Objecter::_scan_requests( unregister_lingers.push_back(op); } break; + case RECALC_OP_TARGET_POOL_EIO: + _check_linger_pool_eio(op); + ldout(cct, 10) << " need to unregister linger op " + << op->linger_id << dendl; + op->get(); + unregister_lingers.push_back(op); + break; } } @@ -1095,6 +1102,9 @@ void Objecter::_scan_requests( case RECALC_OP_TARGET_POOL_DNE: _check_op_pool_dne(op, &sl); break; + case RECALC_OP_TARGET_POOL_EIO: + _check_op_pool_eio(op, &sl); + break; } } @@ -1565,6 +1575,37 @@ void Objecter::_check_op_pool_dne(Op *op, std::unique_lock *s } } +// sl may be unlocked. +void Objecter::_check_op_pool_eio(Op *op, std::unique_lock *sl) +{ + // rwlock is locked unique + + // we had a new enough map + ldout(cct, 10) << "check_op_pool_eio tid " << op->tid + << " concluding pool " << op->target.base_pgid.pool() + << " has eio" << dendl; + if (op->has_completion()) { + num_in_flight--; + op->complete(osdc_errc::pool_eio, -EIO); + } + + OSDSession *s = op->session; + if (s) { + ceph_assert(s != NULL); + ceph_assert(sl->mutex() == &s->lock); + bool session_locked = sl->owns_lock(); + if (!session_locked) { + sl->lock(); + } + _finish_op(op, 0); + if (!session_locked) { + sl->unlock(); + } + } else { + _finish_op(op, 0); // no session + } +} + void Objecter::_send_op_map_check(Op *op) { // rwlock is locked unique @@ -1659,6 +1700,23 @@ void Objecter::_check_linger_pool_dne(LingerOp *op, bool *need_unregister) } } +void Objecter::_check_linger_pool_eio(LingerOp *op) +{ + // rwlock is locked unique + + std::unique_lock wl{op->watch_lock}; + if (op->on_reg_commit) { + op->on_reg_commit->defer(std::move(op->on_reg_commit), + osdc_errc::pool_dne, cb::list{}); + op->on_reg_commit = nullptr; + } + if (op->on_notify_finish) { + op->on_notify_finish->defer(std::move(op->on_notify_finish), + osdc_errc::pool_dne, cb::list{}); + op->on_notify_finish = nullptr; + } +} + void Objecter::_send_linger_map_check(LingerOp *op) { // ask the monitor -- 2.39.5