]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: attempt to re-acquire leader lock if watcher recovered
authorJason Dillaman <dillaman@redhat.com>
Thu, 31 May 2018 18:09:30 +0000 (14:09 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 3 Oct 2018 15:08:13 +0000 (11:08 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 69645f5433ce48281d3c6b70d979356c7ede2f88)
(cherry picked from commit a44e583fda52edceb0b20d78f1683a14d0e00f7b)

src/test/rbd_mirror/test_mock_LeaderWatcher.cc
src/tools/rbd_mirror/LeaderWatcher.cc
src/tools/rbd_mirror/LeaderWatcher.h

index 2141a00f7a01d3d9df43240a5dca228b155056ba..2588db43c6d8e387aacd7bef5a0b22b379c23801 100644 (file)
@@ -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<MockTestImageCtx> {
     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);
   }
index 46f555252f0e48e0c7e6dcdfc61479058fc74066..51351e0b8d04bf1de6201b09df62cc5e287dbee1 100644 (file)
@@ -1089,6 +1089,13 @@ void LeaderWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
   apply_visitor(HandlePayloadVisitor(this, ctx), notify_message.payload);
 }
 
+template <typename I>
+void LeaderWatcher<I>::handle_rewatch_complete(int r) {
+  dout(5) << "r=" << r << dendl;
+
+  m_leader_lock->reacquire_lock();
+}
+
 template <typename I>
 void LeaderWatcher<I>::handle_payload(const HeartbeatPayload &payload,
                                       Context *on_notify_ack) {
index 980e2e6826add2c0fa9c73d29c7992aa2a660191..38b99d4d035b0dfaa5a20560077f96c7fc0e1d6d 100644 (file)
@@ -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);