If periodic status update (LambdaContext which is queued from
handle_update_mirror_image_replay_status()) races with shutdown and
ends up being the last in-flight operation that shutdown was pending
on, we attempt to recursively acquire m_lock in shut_down() because
m_in_flight_op_tracker.finish_op() is called with m_lock (and also
m_threads->timer_lock) held. These locks are needed only for the call
to schedule_update_mirror_image_replay_status() and should be unlocked
immediately.
Fixes: https://tracker.ceph.com/issues/69978
Co-authored-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: N Balachandran <nithya.balachandran@ibm.com>
(cherry picked from commit
c60514087bc29540d3babd7855c5a4e28f2bf1b0)
auto ctx = new LambdaContext([this](int) {
update_mirror_image_status(false, boost::none);
- std::unique_lock locker{m_lock};
- std::unique_lock timer_locker{m_threads->timer_lock};
+ {
+ std::unique_lock locker{m_lock};
+ std::unique_lock timer_locker{m_threads->timer_lock};
- schedule_update_mirror_image_replay_status();
+ schedule_update_mirror_image_replay_status();
+ }
m_in_flight_op_tracker.finish_op();
});