From 55f9c625bdf9a910317e45ac60bb321c8c2c1ae2 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Fri, 5 May 2017 11:56:50 +0200 Subject: [PATCH] rbd-mirror: resolve potential recursive lock Would have been possible when release_image had lead to cancel sync (i.e. cancel_sync_request). Signed-off-by: Mykola Golub --- src/tools/rbd_mirror/InstanceWatcher.cc | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/tools/rbd_mirror/InstanceWatcher.cc b/src/tools/rbd_mirror/InstanceWatcher.cc index 4bedf7009065d..c42ee2fc1e07d 100644 --- a/src/tools/rbd_mirror/InstanceWatcher.cc +++ b/src/tools/rbd_mirror/InstanceWatcher.cc @@ -785,8 +785,16 @@ void InstanceWatcher::handle_image_acquire( const std::string &peer_image_id, Context *on_finish) { dout(20) << "global_image_id=" << global_image_id << dendl; - m_instance_replayer->acquire_image(global_image_id, peer_mirror_uuid, - peer_image_id, on_finish); + auto ctx = new FunctionContext( + [this, global_image_id, peer_mirror_uuid, peer_image_id, + on_finish] (int r) { + m_instance_replayer->acquire_image(global_image_id, peer_mirror_uuid, + peer_image_id, on_finish); + m_notify_op_tracker.finish_op(); + }); + + m_notify_op_tracker.start_op(); + m_work_queue->queue(ctx, 0); } template @@ -795,8 +803,17 @@ void InstanceWatcher::handle_image_release( const std::string &peer_image_id, bool schedule_delete, Context *on_finish) { dout(20) << "global_image_id=" << global_image_id << dendl; - m_instance_replayer->release_image(global_image_id, peer_mirror_uuid, - peer_image_id, schedule_delete, on_finish); + auto ctx = new FunctionContext( + [this, global_image_id, peer_mirror_uuid, peer_image_id, schedule_delete, + on_finish] (int r) { + m_instance_replayer->release_image(global_image_id, peer_mirror_uuid, + peer_image_id, schedule_delete, + on_finish); + m_notify_op_tracker.finish_op(); + }); + + m_notify_op_tracker.start_op(); + m_work_queue->queue(ctx, 0); } template -- 2.39.5