From: Jason Dillaman Date: Thu, 31 May 2018 18:09:30 +0000 (-0400) Subject: rbd-mirror: attempt to re-acquire leader lock if watcher recovered X-Git-Tag: v12.2.9~14^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95d3c5437f88ff9a15e7adcba43db920d5588406;p=ceph.git 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) --- diff --git a/src/test/rbd_mirror/test_mock_LeaderWatcher.cc b/src/test/rbd_mirror/test_mock_LeaderWatcher.cc index 2141a00f7a01..2588db43c6d8 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 46f555252f0e..51351e0b8d04 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 980e2e6826ad..38b99d4d035b 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);