]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: stop stale replayers before starting new replayers
authorJason Dillaman <dillaman@redhat.com>
Wed, 25 May 2016 18:00:34 +0000 (14:00 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 27 May 2016 03:50:04 +0000 (23:50 -0400)
If the connection details are tweaked for a remote peer, stop
the existing replayer before potentially starting a new replayer
against the same remote.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/tools/rbd_mirror/Mirror.cc

index 73e980119d0ebc1354d81870cfb129b48caa16eb..02dda7cdad065354356b82dc8cc59927e6b9abc5 100644 (file)
@@ -342,6 +342,19 @@ void Mirror::update_replayers(const map<peer_t, set<int64_t> > &peer_configs)
 {
   dout(20) << "enter" << dendl;
   assert(m_lock.is_locked());
+
+  // remove stale replayers before creating new replayers
+  for (auto it = m_replayers.begin(); it != m_replayers.end();) {
+    peer_t peer = it->first;
+    if (peer_configs.find(peer) == peer_configs.end()) {
+      dout(20) << "removing replayer for " << peer << dendl;
+      // TODO: make async
+      m_replayers.erase(it++);
+    } else {
+      ++it;
+    }
+  }
+
   for (auto &kv : peer_configs) {
     const peer_t &peer = kv.first;
     if (m_replayers.find(peer) == m_replayers.end()) {
@@ -356,17 +369,6 @@ void Mirror::update_replayers(const map<peer_t, set<int64_t> > &peer_configs)
       m_replayers.insert(std::make_pair(peer, std::move(replayer)));
     }
   }
-
-  // TODO: make async
-  for (auto it = m_replayers.begin(); it != m_replayers.end();) {
-    peer_t peer = it->first;
-    if (peer_configs.find(peer) == peer_configs.end()) {
-      dout(20) << "removing replayer for " << peer << dendl;
-      m_replayers.erase(it++);
-    } else {
-      ++it;
-    }
-  }
 }
 
 } // namespace mirror