]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: shut down image replayers in parallel
authorJason Dillaman <dillaman@redhat.com>
Tue, 19 Jul 2016 17:50:20 +0000 (13:50 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 17 Aug 2016 17:22:06 +0000 (13:22 -0400)
When multiple pools are being replicated, start the shut down
process concurrently across all pool replayers.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 73cdd08007c27d2c3c41fe644601e7a144f21c82)

src/tools/rbd_mirror/ImageReplayer.cc
src/tools/rbd_mirror/Mirror.cc
src/tools/rbd_mirror/Replayer.cc
src/tools/rbd_mirror/Replayer.h

index bc61a48282a891096a7e7e3d70dc04b817fbd136..5de20db2312fde451089791942bcd21895e79de3 100644 (file)
@@ -667,7 +667,7 @@ void ImageReplayer<I>::stop(Context *on_finish, bool manual)
   }
 
   if (!running) {
-    derr << "not running" << dendl;
+    dout(20) << "not running" << dendl;
     if (on_finish) {
       on_finish->complete(-EINVAL);
     }
index 7add4d09b34baccc125b88d6a4e43f73272edf70..de8e37851a164e7a3721978e6065cb362ed1cd08 100644 (file)
@@ -239,6 +239,13 @@ void Mirror::run()
     // TODO: make interval configurable
     m_cond.WaitInterval(g_ceph_context, m_lock, seconds(30));
   }
+
+  // stop all replayers in parallel
+  Mutex::Locker locker(m_lock);
+  for (auto it = m_replayers.begin(); it != m_replayers.end(); it++) {
+    auto &replayer = it->second;
+    replayer->stop(false);
+  }
   dout(20) << "return" << dendl;
 }
 
@@ -313,7 +320,7 @@ void Mirror::stop()
 
   for (auto it = m_replayers.begin(); it != m_replayers.end(); it++) {
     auto &replayer = it->second;
-    replayer->stop();
+    replayer->stop(true);
   }
 }
 
index 5afcc6036049e89c520d3c76ec7becebac3955de..afcb34c7d3754d928757b4c53d5d76c18f3fd461 100644 (file)
@@ -73,7 +73,7 @@ public:
   explicit StopCommand(Replayer *replayer) : replayer(replayer) {}
 
   bool call(Formatter *f, stringstream *ss) {
-    replayer->stop();
+    replayer->stop(true);
     return true;
   }
 
@@ -513,18 +513,20 @@ void Replayer::start()
   }
 }
 
-void Replayer::stop()
+void Replayer::stop(bool manual)
 {
-  dout(20) << "enter" << dendl;
+  dout(20) << "enter: manual=" << manual << dendl;
 
   Mutex::Locker l(m_lock);
-
-  if (m_stopping.read()) {
+  if (!manual) {
+    m_stopping.set(1);
+    m_cond.Signal();
+    return;
+  } else if (m_stopping.read()) {
     return;
   }
 
   m_manual_stop = true;
-
   for (auto &kv : m_image_replayers) {
     auto &image_replayer = kv.second;
     image_replayer->stop(nullptr, true);
@@ -767,7 +769,7 @@ bool Replayer::stop_image_replayer(unique_ptr<ImageReplayer<> > &image_replayer)
     }
     FunctionContext *ctx = new FunctionContext(
         [&image_replayer, this] (int r) {
-          if (!m_stopping.read()) {
+          if (!m_stopping.read() && r >= 0) {
             m_image_deleter->schedule_image_delete(
               m_local_rados,
               image_replayer->get_local_pool_id(),
index c5b975e26bba49461e84d6f881562ba56c91fa02..81db16222023453c57daa0c6e5f5703e8f7a0528 100644 (file)
@@ -48,7 +48,7 @@ public:
 
   void print_status(Formatter *f, stringstream *ss);
   void start();
-  void stop();
+  void stop(bool manual);
   void restart();
   void flush();