From f6c031de9c166822746390b39aaf0b50899c13e2 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Thu, 10 Apr 2025 13:44:45 +0200 Subject: [PATCH] rbd-mirror: don't reset m_on_start_finish in GroupReplayer::restart() If restart() is called while a previous start() is still in progress, resetting m_on_start_finish before calling stop() from inside restart() causes on_finish that was passed to start() to be leaked. One of the ways this manifests in is a hang in InstanceReplayer::stop() on any kind of shutdown -- due to InstanceReplayer::start_group_replayer() keeping track of its start() invocations through C_TrackedOp group_replayer->start(new C_TrackedOp(m_async_op_tracker, nullptr), false, false); and flushing m_async_op_tracker in InstanceReplayer::stop(). Signed-off-by: Ilya Dryomov --- src/tools/rbd_mirror/GroupReplayer.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tools/rbd_mirror/GroupReplayer.cc b/src/tools/rbd_mirror/GroupReplayer.cc index d97a3511decf6..b21e6edbf8c00 100644 --- a/src/tools/rbd_mirror/GroupReplayer.cc +++ b/src/tools/rbd_mirror/GroupReplayer.cc @@ -452,7 +452,6 @@ void GroupReplayer::restart(Context *on_finish) { { std::lock_guard locker{m_lock}; m_restart_requested = true; - m_on_start_finish = nullptr; } auto ctx = new LambdaContext( -- 2.39.5