From 95d3c5437f88ff9a15e7adcba43db920d5588406 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 31 May 2018 14:09:30 -0400 Subject: [PATCH] rbd-mirror: attempt to re-acquire leader lock if watcher recovered Signed-off-by: Jason Dillaman (cherry picked from commit 69645f5433ce48281d3c6b70d979356c7ede2f88) (cherry picked from commit a44e583fda52edceb0b20d78f1683a14d0e00f7b) --- src/test/rbd_mirror/test_mock_LeaderWatcher.cc | 5 +++++ src/tools/rbd_mirror/LeaderWatcher.cc | 7 +++++++ src/tools/rbd_mirror/LeaderWatcher.h | 2 ++ 3 files changed, 14 insertions(+) diff --git a/src/test/rbd_mirror/test_mock_LeaderWatcher.cc b/src/test/rbd_mirror/test_mock_LeaderWatcher.cc index 2141a00f7a01d..2588db43c6d8e 100644 --- a/src/test/rbd_mirror/test_mock_LeaderWatcher.cc +++ b/src/test/rbd_mirror/test_mock_LeaderWatcher.cc @@ -42,6 +42,7 @@ struct MockManagedLock { MOCK_METHOD1(shut_down, void(Context *)); MOCK_METHOD1(try_acquire_lock, void(Context *)); MOCK_METHOD1(release_lock, void(Context *)); + MOCK_METHOD0(reacquire_lock, void()); MOCK_METHOD3(break_lock, void(const managed_lock::Locker &, bool, Context *)); MOCK_METHOD2(get_locker, void(managed_lock::Locker *, Context *)); @@ -126,6 +127,10 @@ struct ManagedLock { m_work_queue->queue(pre_release_ctx, 0); } + void reacquire_lock() { + MockManagedLock::get_instance().reacquire_lock(); + } + void get_locker(managed_lock::Locker *locker, Context *on_finish) { MockManagedLock::get_instance().get_locker(locker, on_finish); } diff --git a/src/tools/rbd_mirror/LeaderWatcher.cc b/src/tools/rbd_mirror/LeaderWatcher.cc index 46f555252f0e4..51351e0b8d04b 100644 --- a/src/tools/rbd_mirror/LeaderWatcher.cc +++ b/src/tools/rbd_mirror/LeaderWatcher.cc @@ -1089,6 +1089,13 @@ void LeaderWatcher::handle_notify(uint64_t notify_id, uint64_t handle, apply_visitor(HandlePayloadVisitor(this, ctx), notify_message.payload); } +template +void LeaderWatcher::handle_rewatch_complete(int r) { + dout(5) << "r=" << r << dendl; + + m_leader_lock->reacquire_lock(); +} + template void LeaderWatcher::handle_payload(const HeartbeatPayload &payload, Context *on_notify_ack) { diff --git a/src/tools/rbd_mirror/LeaderWatcher.h b/src/tools/rbd_mirror/LeaderWatcher.h index 980e2e6826add..38b99d4d035b0 100644 --- a/src/tools/rbd_mirror/LeaderWatcher.h +++ b/src/tools/rbd_mirror/LeaderWatcher.h @@ -282,6 +282,8 @@ private: void handle_notify(uint64_t notify_id, uint64_t handle, uint64_t notifier_id, bufferlist &bl) override; + void handle_rewatch_complete(int r) override; + void handle_heartbeat(Context *on_ack); void handle_lock_acquired(Context *on_ack); void handle_lock_released(Context *on_ack); -- 2.39.5