]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: improve detection of blacklisted state 33598/head
authorMykola Golub <mgolub@suse.com>
Wed, 19 Feb 2020 10:17:08 +0000 (10:17 +0000)
committerMykola Golub <mgolub@suse.com>
Fri, 28 Feb 2020 08:18:13 +0000 (10:18 +0200)
Fixes: https://tracker.ceph.com/issues/44159
Signed-off-by: Mykola Golub <mgolub@suse.com>
(cherry picked from commit cfb4f423a42d0265cb78ebb4eb8cc6924d6f45fa)

Conflicts:
src/tools/rbd_mirror/InstanceReplayer.h (ceph::mutex vs Mutex)
        src/tools/rbd_mirror/InstanceReplayer.cc (Mutex::Locker vs  std::lock_guard)
        src/tools/rbd_mirror/LeaderWatcher.cc (Mutex::Locker vs  std::lock_guard)
src/tools/rbd_mirror/NamespaceReplayer.cc (does not exist)
src/tools/rbd_mirror/PoolReplayer.cc (code from NamespaceReplayer is here)
src/test/rbd_mirror/test_mock_PoolReplayer.cc (does not exist)

src/tools/rbd_mirror/InstanceReplayer.cc
src/tools/rbd_mirror/InstanceReplayer.h
src/tools/rbd_mirror/LeaderWatcher.cc
src/tools/rbd_mirror/LeaderWatcher.h
src/tools/rbd_mirror/PoolReplayer.cc

index 0e21bf5f97a356d11c290abde7ec0b665cd978e7..c6401e5a5feaadf9df675bda1ad9b3ff730496ad 100644 (file)
@@ -49,6 +49,12 @@ InstanceReplayer<I>::~InstanceReplayer() {
   assert(m_image_replayers.empty());
 }
 
+template <typename I>
+bool InstanceReplayer<I>::is_blacklisted() const {
+  Mutex::Locker locker(m_lock);
+  return m_blacklisted;
+}
+
 template <typename I>
 int InstanceReplayer<I>::init() {
   C_SaferCond init_ctx;
@@ -303,6 +309,7 @@ void InstanceReplayer<I>::start_image_replayer(
   } else if (image_replayer->is_blacklisted()) {
     derr << "global_image_id=" << global_image_id << ": blacklisted detected "
          << "during image replay" << dendl;
+    m_blacklisted = true;
     return;
   } else if (image_replayer->is_finished()) {
     // TODO temporary until policy integrated
index 96969cb62c9beb55103e3ce7dc0840d051c099d7..c6b936a9d6cf12b4a0cf6ccf38e5f191917a7eea 100644 (file)
@@ -43,6 +43,8 @@ public:
                   int64_t local_pool_id);
   ~InstanceReplayer();
 
+  bool is_blacklisted() const;
+
   int init();
   void shut_down();
 
@@ -87,13 +89,14 @@ private:
   std::string m_local_mirror_uuid;
   int64_t m_local_pool_id;
 
-  Mutex m_lock;
+  mutable Mutex m_lock;
   AsyncOpTracker m_async_op_tracker;
   std::map<std::string, ImageReplayer<ImageCtxT> *> m_image_replayers;
   Peers m_peers;
   Context *m_image_state_check_task = nullptr;
   Context *m_on_shut_down = nullptr;
   bool m_manual_stop = false;
+  bool m_blacklisted = false;
 
   void wait_for_ops();
   void handle_wait_for_ops(int r);
index 861c6073074d7bd368150aa29459b94ca781a101..8146ec9a04b1dd2c40dffa4982051484576def62 100644 (file)
@@ -246,6 +246,13 @@ void LeaderWatcher<I>::handle_wait_for_tasks() {
   m_work_queue->queue(ctx, 0);
 }
 
+template <typename I>
+bool LeaderWatcher<I>::is_blacklisted() const {
+  Mutex::Locker locker(m_lock);
+
+  return m_blacklisted;
+}
+
 template <typename I>
 bool LeaderWatcher<I>::is_leader() const {
   Mutex::Locker locker(m_lock);
@@ -1080,7 +1087,7 @@ void LeaderWatcher<I>::handle_notify(uint64_t notify_id, uint64_t handle,
     bufferlist::iterator iter = bl.begin();
     decode(notify_message, iter);
   } catch (const buffer::error &err) {
-    derr << "error decoding image notification: " << err.what() << dendl;
+    derr << "error decoding image notification: " << err.what() << dendl;
     ctx->complete(0);
     return;
   }
@@ -1092,9 +1099,13 @@ template <typename I>
 void LeaderWatcher<I>::handle_rewatch_complete(int r) {
   dout(5) << "r=" << r << dendl;
 
-  if (r != -EBLACKLISTED) {
-    m_leader_lock->reacquire_lock(nullptr);
+  if (r == -EBLACKLISTED) {
+    dout(1) << "blacklisted detected" << dendl;
+    m_blacklisted = true;
+    return;
   }
+
+  m_leader_lock->reacquire_lock(nullptr);
 }
 
 template <typename I>
index 8b37db0ee066129618be0095ed67d02872c3be08..7e9846ee732002c2fdeb868da619972b9e82be61 100644 (file)
@@ -45,6 +45,7 @@ public:
   void init(Context *on_finish);
   void shut_down(Context *on_finish);
 
+  bool is_blacklisted() const;
   bool is_leader() const;
   bool is_releasing_leader() const;
   bool get_leader_instance_id(std::string *instance_id) const;
@@ -220,6 +221,8 @@ private:
   Instances<ImageCtxT> *m_instances = nullptr;
   librbd::managed_lock::Locker m_locker;
 
+  bool m_blacklisted = false;
+
   AsyncOpTracker m_timer_op_tracker;
   Context *m_timer_task = nullptr;
   C_TimerGate *m_timer_gate = nullptr;
index 995fdc2bda6d1fc5e5280761b3d7af4f35b82d66..ef45334409723558b46c35c482dc2bb9327f2a40 100644 (file)
@@ -521,7 +521,9 @@ void PoolReplayer<I>::run()
     }
 
     Mutex::Locker locker(m_lock);
-    if ((m_local_pool_watcher && m_local_pool_watcher->is_blacklisted()) ||
+    if (m_leader_watcher->is_blacklisted() ||
+        m_instance_replayer->is_blacklisted() ||
+        (m_local_pool_watcher && m_local_pool_watcher->is_blacklisted()) ||
        (m_remote_pool_watcher && m_remote_pool_watcher->is_blacklisted())) {
       m_blacklisted = true;
       m_stopping = true;