]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: pass local site name through to namespace replayer
authorJason Dillaman <dillaman@redhat.com>
Wed, 25 Sep 2019 16:40:04 +0000 (12:40 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 8 Oct 2019 15:16:46 +0000 (11:16 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_mock_NamespaceReplayer.cc
src/test/rbd_mirror/test_mock_PoolReplayer.cc
src/tools/rbd_mirror/Mirror.cc
src/tools/rbd_mirror/Mirror.h
src/tools/rbd_mirror/NamespaceReplayer.cc
src/tools/rbd_mirror/NamespaceReplayer.h
src/tools/rbd_mirror/PoolReplayer.cc
src/tools/rbd_mirror/PoolReplayer.h

index 9684bc98c8a24511f683868c58e16a36cbf6ac47..bd52f9218145c95585c47fcce0bebdff2b952709 100644 (file)
@@ -414,7 +414,8 @@ TEST_F(TestMockNamespaceReplayer, Init_MirrorStatusUpdaterError) {
 
   MockNamespaceReplayer namespace_replayer(
       {}, m_local_io_ctx, m_remote_io_ctx, "local mirror uuid",
-      "remote mirror uuid", m_mock_threads, nullptr, nullptr, nullptr, nullptr);
+      "remote mirror uuid", "siteA", m_mock_threads, nullptr, nullptr, nullptr,
+      nullptr);
 
   C_SaferCond on_init;
   namespace_replayer.init(&on_init);
@@ -434,7 +435,8 @@ TEST_F(TestMockNamespaceReplayer, Init_InstanceReplayerError) {
 
   MockNamespaceReplayer namespace_replayer(
       {}, m_local_io_ctx, m_remote_io_ctx, "local mirror uuid",
-      "remote mirror uuid", m_mock_threads, nullptr, nullptr, nullptr, nullptr);
+      "remote mirror uuid", "siteA", m_mock_threads, nullptr, nullptr, nullptr,
+      nullptr);
 
   C_SaferCond on_init;
   namespace_replayer.init(&on_init);
@@ -460,7 +462,8 @@ TEST_F(TestMockNamespaceReplayer, Init_InstanceWatcherError) {
 
   MockNamespaceReplayer namespace_replayer(
       {}, m_local_io_ctx, m_remote_io_ctx, "local mirror uuid",
-      "remote mirror uuid", m_mock_threads, nullptr, nullptr, nullptr, nullptr);
+      "remote mirror uuid", "siteA", m_mock_threads, nullptr, nullptr, nullptr,
+      nullptr);
 
   C_SaferCond on_init;
   namespace_replayer.init(&on_init);
@@ -487,7 +490,7 @@ TEST_F(TestMockNamespaceReplayer, Init) {
 
   MockNamespaceReplayer namespace_replayer(
       {}, m_local_io_ctx, m_remote_io_ctx, "local mirror uuid",
-      "remote mirror uuid", m_mock_threads, nullptr, nullptr,
+      "remote mirror uuid", "siteA", m_mock_threads, nullptr, nullptr,
       &mock_service_daemon, nullptr);
 
   C_SaferCond on_init;
@@ -526,7 +529,7 @@ TEST_F(TestMockNamespaceReplayer, AcuqireLeader) {
 
   MockNamespaceReplayer namespace_replayer(
       {}, m_local_io_ctx, m_remote_io_ctx, "local mirror uuid",
-      "remote mirror uuid", m_mock_threads, nullptr, nullptr,
+      "remote mirror uuid", "siteA", m_mock_threads, nullptr, nullptr,
       &mock_service_daemon, nullptr);
 
   C_SaferCond on_init;
index 3b952eda738a22b4bf054b811f3f78c4b9b60fb4..039ab7292e4c00d1eb0e723b6179cecd87c1fc8c 100644 (file)
@@ -132,6 +132,7 @@ struct NamespaceReplayer<librbd::MockTestImageCtx> {
       librados::IoCtx &remote_ioctx,
       const std::string &local_mirror_uuid,
       const std::string &remote_mirror_uuid,
+      const std::string &site_name,
       Threads<librbd::MockTestImageCtx> *threads,
       Throttler<librbd::MockTestImageCtx> *image_sync_throttler,
       Throttler<librbd::MockTestImageCtx> *image_deletion_throttler,
@@ -486,7 +487,7 @@ TEST_F(TestMockPoolReplayer, ConfigKeyOverride) {
   MockServiceDaemon mock_service_daemon;
   MockPoolReplayer pool_replayer(&mock_threads, &mock_service_daemon, nullptr,
                                  m_local_io_ctx.get_id(), peer_spec, {});
-  pool_replayer.init();
+  pool_replayer.init("siteA");
 
   ASSERT_TRUE(remote_cct != nullptr);
   ASSERT_EQ("123", remote_cct->_conf.get_val<std::string>("mon_host"));
@@ -538,7 +539,7 @@ TEST_F(TestMockPoolReplayer, AcquireReleaseLeader) {
   MockServiceDaemon mock_service_daemon;
   MockPoolReplayer pool_replayer(&mock_threads, &mock_service_daemon, nullptr,
                                  m_local_io_ctx.get_id(), peer_spec, {});
-  pool_replayer.init();
+  pool_replayer.init("siteA");
 
   expect_service_daemon_add_or_update_attribute(
       mock_service_daemon, SERVICE_DAEMON_LEADER_KEY, true);
@@ -616,7 +617,7 @@ TEST_F(TestMockPoolReplayer, Namespaces) {
   MockServiceDaemon mock_service_daemon;
   MockPoolReplayer pool_replayer(&mock_threads, &mock_service_daemon, nullptr,
                                  m_local_io_ctx.get_id(), peer_spec, {});
-  pool_replayer.init();
+  pool_replayer.init("siteA");
 
   C_SaferCond on_ns1_init;
   expect_namespace_replayer_init(*mock_ns1_namespace_replayer, 0);
@@ -720,7 +721,7 @@ TEST_F(TestMockPoolReplayer, NamespacesError) {
   MockServiceDaemon mock_service_daemon;
   MockPoolReplayer pool_replayer(&mock_threads, &mock_service_daemon, nullptr,
                                  m_local_io_ctx.get_id(), peer_spec, {});
-  pool_replayer.init();
+  pool_replayer.init("siteA");
 
   // test namespace replayer init fails for non leader
 
index 9b2596bbf732fe8a374919a172eeabe4bf1f94a9..1a6604484f47417d21344503cefd104392ba46ba 100644 (file)
@@ -548,7 +548,8 @@ void Mirror::run()
     std::unique_lock l{m_lock};
     if (!m_manual_stop) {
       if (refresh_pools) {
-        update_pool_replayers(m_local_cluster_watcher->get_pool_peers());
+        update_pool_replayers(m_local_cluster_watcher->get_pool_peers(),
+                              m_local_cluster_watcher->get_site_name());
       }
       m_cache_manager_handler->run_cache_manager();
     }
@@ -658,7 +659,8 @@ void Mirror::release_leader()
   }
 }
 
-void Mirror::update_pool_replayers(const PoolPeers &pool_peers)
+void Mirror::update_pool_replayers(const PoolPeers &pool_peers,
+                                   const std::string& site_name)
 {
   dout(20) << "enter" << dendl;
   ceph_assert(ceph_mutex_is_locked(m_lock));
@@ -685,16 +687,23 @@ void Mirror::update_pool_replayers(const PoolPeers &pool_peers)
       auto pool_replayers_it = m_pool_replayers.find(pool_peer);
       if (pool_replayers_it != m_pool_replayers.end()) {
         auto& pool_replayer = pool_replayers_it->second;
-        if (pool_replayer->is_blacklisted()) {
+        if (!m_site_name.empty() && !site_name.empty() &&
+            m_site_name != site_name) {
+          dout(0) << "restarting pool replayer for " << peer << " due to "
+                  << "updated site name" << dendl;
+          // TODO: make async
+          pool_replayer->shut_down();
+          pool_replayer->init(site_name);
+        } else if (pool_replayer->is_blacklisted()) {
           derr << "restarting blacklisted pool replayer for " << peer << dendl;
           // TODO: make async
           pool_replayer->shut_down();
-          pool_replayer->init();
+          pool_replayer->init(site_name);
         } else if (!pool_replayer->is_running()) {
           derr << "restarting failed pool replayer for " << peer << dendl;
           // TODO: make async
           pool_replayer->shut_down();
-          pool_replayer->init();
+          pool_replayer->init(site_name);
         }
       } else {
         dout(20) << "starting pool replayer for " << peer << dendl;
@@ -704,13 +713,15 @@ void Mirror::update_pool_replayers(const PoolPeers &pool_peers)
                                m_args));
 
         // TODO: make async
-        pool_replayer->init();
+        pool_replayer->init(site_name);
         m_pool_replayers.emplace(pool_peer, std::move(pool_replayer));
       }
     }
 
     // TODO currently only support a single peer
   }
+
+  m_site_name = site_name;
 }
 
 } // namespace mirror
index 9b1496285adb4f8e8288b653f6a15854a8973b35..28f71c54dc2dd5e35c404dd3e0defc72d8b528a9 100644 (file)
@@ -57,7 +57,8 @@ private:
   typedef ClusterWatcher::PoolPeers PoolPeers;
   typedef std::pair<int64_t, PeerSpec> PoolPeer;
 
-  void update_pool_replayers(const PoolPeers &pool_peers);
+  void update_pool_replayers(const PoolPeers &pool_peers,
+                             const std::string& site_name);
 
   void create_cache_manager();
   void run_cache_manager(utime_t *next_run_interval);
@@ -77,6 +78,7 @@ private:
   std::atomic<bool> m_stopping = { false };
   bool m_manual_stop = false;
   MirrorAdminSocketHook *m_asok_hook;
+  std::string m_site_name;
 };
 
 } // namespace mirror
index 7ed94cac01a186cc7e115a48f507a3b8e42fece3..8919945cad1345d1616c99c3814cb74b60f1a78f 100644 (file)
@@ -40,11 +40,13 @@ NamespaceReplayer<I>::NamespaceReplayer(
     const std::string &name,
     librados::IoCtx &local_io_ctx, librados::IoCtx &remote_io_ctx,
     const std::string &local_mirror_uuid, const std::string &remote_mirror_uuid,
-    Threads<I> *threads, Throttler<I> *image_sync_throttler,
-    Throttler<I> *image_deletion_throttler, ServiceDaemon<I> *service_daemon,
+    const std::string &local_site_name, Threads<I> *threads,
+    Throttler<I> *image_sync_throttler, Throttler<I> *image_deletion_throttler,
+    ServiceDaemon<I> *service_daemon,
     journal::CacheManagerHandler *cache_manager_handler) :
   m_local_mirror_uuid(local_mirror_uuid),
   m_remote_mirror_uuid(remote_mirror_uuid),
+  m_local_site_name(local_site_name),
   m_threads(threads), m_image_sync_throttler(image_sync_throttler),
   m_image_deletion_throttler(image_deletion_throttler),
   m_service_daemon(service_daemon),
index 3455f59fd8fb7870a6256a3a4df4acc40014b410..20a5659c82a9fa3388cedb34601c93d580b6514a 100644 (file)
@@ -48,15 +48,17 @@ public:
       librados::IoCtx &remote_ioctx,
       const std::string &local_mirror_uuid,
       const std::string &remote_mirror_uuid,
+      const std::string &local_site_name,
       Threads<ImageCtxT> *threads,
       Throttler<ImageCtxT> *image_sync_throttler,
       Throttler<ImageCtxT> *image_deletion_throttler,
       ServiceDaemon<ImageCtxT> *service_daemon,
       journal::CacheManagerHandler *cache_manager_handler) {
     return new NamespaceReplayer(name, local_ioctx, remote_ioctx,
-                                 local_mirror_uuid, remote_mirror_uuid, threads,
-                                 image_sync_throttler, image_deletion_throttler,
-                                 service_daemon, cache_manager_handler);
+                                 local_mirror_uuid, remote_mirror_uuid,
+                                 local_site_name, threads, image_sync_throttler,
+                                 image_deletion_throttler, service_daemon,
+                                 cache_manager_handler);
   }
 
   NamespaceReplayer(const std::string &name,
@@ -64,6 +66,7 @@ public:
                     librados::IoCtx &remote_ioctx,
                     const std::string &local_mirror_uuid,
                     const std::string &remote_mirror_uuid,
+                    const std::string &local_site_name,
                     Threads<ImageCtxT> *threads,
                     Throttler<ImageCtxT> *image_sync_throttler,
                     Throttler<ImageCtxT> *image_deletion_throttler,
@@ -252,6 +255,7 @@ private:
   librados::IoCtx m_remote_io_ctx;
   std::string m_local_mirror_uuid;
   std::string m_remote_mirror_uuid;
+  std::string m_local_site_name;
   Threads<ImageCtxT> *m_threads;
   Throttler<ImageCtxT> *m_image_sync_throttler;
   Throttler<ImageCtxT> *m_image_deletion_throttler;
index e518f2d4f95aa48e85baddfae027ab391eb010ed..e4c6e857f9d36c86a6a9672086aab48f98c6a93c 100644 (file)
@@ -246,12 +246,13 @@ bool PoolReplayer<I>::is_running() const {
 }
 
 template <typename I>
-void PoolReplayer<I>::init() {
+void PoolReplayer<I>::init(const std::string& site_name) {
   ceph_assert(!m_pool_replayer_thread.is_started());
 
   // reset state
   m_stopping = false;
   m_blacklisted = false;
+  m_site_name = site_name;
 
   dout(10) << "replaying for " << m_peer << dendl;
   int r = init_rados(g_ceph_context->_conf->cluster,
@@ -317,8 +318,9 @@ void PoolReplayer<I>::init() {
 
   m_default_namespace_replayer.reset(NamespaceReplayer<I>::create(
       "", m_local_io_ctx, m_remote_io_ctx, m_local_mirror_uuid, m_peer.uuid,
-      m_threads, m_image_sync_throttler.get(), m_image_deletion_throttler.get(),
-      m_service_daemon, m_cache_manager_handler));
+      m_site_name, m_threads, m_image_sync_throttler.get(),
+      m_image_deletion_throttler.get(), m_service_daemon,
+      m_cache_manager_handler));
 
   C_SaferCond on_init;
   m_default_namespace_replayer->init(&on_init);
@@ -595,7 +597,7 @@ void PoolReplayer<I>::update_namespace_replayers() {
   for (auto &name : mirroring_namespaces) {
     auto namespace_replayer = NamespaceReplayer<I>::create(
         name, m_local_io_ctx, m_remote_io_ctx, m_local_mirror_uuid, m_peer.uuid,
-        m_threads, m_image_sync_throttler.get(),
+        m_site_name, m_threads, m_image_sync_throttler.get(),
         m_image_deletion_throttler.get(), m_service_daemon,
         m_cache_manager_handler);
     auto on_init = new LambdaContext(
index 9534d755c5f8005baaf22e325b2ec733012e8fbe..312de1f443999fbfb57e39a871c848f8aeed4cad 100644 (file)
@@ -53,7 +53,7 @@ public:
   bool is_leader() const;
   bool is_running() const;
 
-  void init();
+  void init(const std::string& site_name);
   void shut_down();
 
   void run();
@@ -190,6 +190,7 @@ private:
 
   mutable ceph::mutex m_lock;
   ceph::condition_variable m_cond;
+  std::string m_site_name;
   bool m_stopping = false;
   bool m_manual_stop = false;
   bool m_blacklisted = false;