]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: service daemon callout for cluster watcher issues
authorJason Dillaman <dillaman@redhat.com>
Sat, 15 Jul 2017 03:06:41 +0000 (23:06 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 18 Jul 2017 14:28:14 +0000 (10:28 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/tools/rbd_mirror/ClusterWatcher.cc
src/tools/rbd_mirror/ClusterWatcher.h

index f17a5ea69280b22a02f4a6173dc0022863c013e3..c4f354419defaa6d521ee4722abf18d740e01634 100644 (file)
@@ -7,6 +7,7 @@
 #include "cls/rbd/cls_rbd_client.h"
 #include "librbd/internal.h"
 #include "librbd/api/Mirror.h"
+#include "tools/rbd_mirror/ServiceDaemon.h"
 
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_rbd_mirror
@@ -63,9 +64,10 @@ void ClusterWatcher::read_pool_peers(PoolPeers *pool_peers,
     return;
   }
 
-  for (auto kv : pools) {
+  std::set<int64_t> service_pool_ids;
+  for (auto& kv : pools) {
     int64_t pool_id = kv.first;
-    string pool_name = kv.second;
+    auto& pool_name = kv.second;
     int64_t base_tier;
     r = m_cluster->pool_get_base_tier(pool_id, &base_tier);
     if (r == -ENOENT) {
@@ -92,16 +94,29 @@ void ClusterWatcher::read_pool_peers(PoolPeers *pool_peers,
 
     cls::rbd::MirrorMode mirror_mode_internal;
     r = librbd::cls_client::mirror_mode_get(&ioctx, &mirror_mode_internal);
+    if (r == 0 && mirror_mode_internal == cls::rbd::MIRROR_MODE_DISABLED) {
+      dout(10) << "mirroring is disabled for pool " << pool_name << dendl;
+      continue;
+    }
+
+    service_pool_ids.insert(pool_id);
+    if (m_service_pools.find(pool_id) == m_service_pools.end()) {
+      m_service_pools[pool_id] = {};
+      m_service_daemon->add_pool(pool_id, pool_name);
+    }
+
     if (r == -EPERM) {
       dout(10) << "access denied querying pool " << pool_name << dendl;
+      m_service_pools[pool_id] = m_service_daemon->add_or_update_callout(
+        pool_id, m_service_pools[pool_id],
+        service_daemon::CALLOUT_LEVEL_WARNING, "access denied");
       continue;
     } else if (r < 0) {
       derr << "could not tell whether mirroring was enabled for " << pool_name
           << " : " << cpp_strerror(r) << dendl;
-      continue;
-    }
-    if (mirror_mode_internal == cls::rbd::MIRROR_MODE_DISABLED) {
-      dout(10) << "mirroring is disabled for pool " << pool_name << dendl;
+      m_service_pools[pool_id] = m_service_daemon->add_or_update_callout(
+        pool_id, m_service_pools[pool_id],
+        service_daemon::CALLOUT_LEVEL_WARNING, "mirroring mode query failed");
       continue;
     }
 
@@ -110,12 +125,28 @@ void ClusterWatcher::read_pool_peers(PoolPeers *pool_peers,
     if (r < 0) {
       derr << "error reading mirroring config for pool " << pool_name
           << cpp_strerror(r) << dendl;
+      m_service_pools[pool_id] = m_service_daemon->add_or_update_callout(
+        pool_id, m_service_pools[pool_id],
+        service_daemon::CALLOUT_LEVEL_ERROR, "mirroring peer list failed");
       continue;
     }
 
+    if (m_service_pools[pool_id] != service_daemon::CALLOUT_ID_NONE) {
+      m_service_daemon->remove_callout(pool_id, m_service_pools[pool_id]);
+      m_service_pools[pool_id] = service_daemon::CALLOUT_ID_NONE;
+    }
+
     pool_peers->insert({pool_id, Peers{configs.begin(), configs.end()}});
     pool_names->insert(pool_name);
   }
+
+  for (auto it = m_service_pools.begin(); it != m_service_pools.end(); ) {
+    auto current_it(it++);
+    if (service_pool_ids.find(current_it->first) == service_pool_ids.end()) {
+      m_service_daemon->remove_pool(current_it->first);
+      m_service_pools.erase(current_it->first);
+    }
+  }
 }
 
 } // namespace mirror
index e49202f2c2a16f34bd0651559f856dfedb95368f..1099db4e0bcc1eacb6f4f09a2b87810ac100e5a4 100644 (file)
@@ -13,6 +13,8 @@
 #include "common/Timer.h"
 #include "include/rados/librados.hpp"
 #include "types.h"
+#include "tools/rbd_mirror/service_daemon/Types.h"
+#include <unordered_map>
 
 namespace librbd { struct ImageCtx; }
 
@@ -42,10 +44,13 @@ public:
   const PoolPeers& get_pool_peers() const;
 
 private:
+  typedef std::unordered_map<int64_t, service_daemon::CalloutId> ServicePools;
+
   RadosRef m_cluster;
   Mutex &m_lock;
   ServiceDaemon<librbd::ImageCtx>* m_service_daemon;
 
+  ServicePools m_service_pools;
   PoolPeers m_pool_peers;
 
   void read_pool_peers(PoolPeers *pool_peers, PoolNames *pool_names);