From: Jason Dillaman Date: Tue, 19 Jul 2016 17:50:20 +0000 (-0400) Subject: rbd-mirror: shut down image replayers in parallel X-Git-Tag: v10.2.3~50^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e4c43190b49e94ccfeda05ac7a7a8835d81b49a5;p=ceph.git rbd-mirror: shut down image replayers in parallel When multiple pools are being replicated, start the shut down process concurrently across all pool replayers. Signed-off-by: Jason Dillaman (cherry picked from commit 73cdd08007c27d2c3c41fe644601e7a144f21c82) --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index bc61a48282a8..5de20db2312f 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -667,7 +667,7 @@ void ImageReplayer::stop(Context *on_finish, bool manual) } if (!running) { - derr << "not running" << dendl; + dout(20) << "not running" << dendl; if (on_finish) { on_finish->complete(-EINVAL); } diff --git a/src/tools/rbd_mirror/Mirror.cc b/src/tools/rbd_mirror/Mirror.cc index 7add4d09b34b..de8e37851a16 100644 --- a/src/tools/rbd_mirror/Mirror.cc +++ b/src/tools/rbd_mirror/Mirror.cc @@ -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); } } diff --git a/src/tools/rbd_mirror/Replayer.cc b/src/tools/rbd_mirror/Replayer.cc index 5afcc6036049..afcb34c7d375 100644 --- a/src/tools/rbd_mirror/Replayer.cc +++ b/src/tools/rbd_mirror/Replayer.cc @@ -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 > &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(), diff --git a/src/tools/rbd_mirror/Replayer.h b/src/tools/rbd_mirror/Replayer.h index c5b975e26bba..81db16222023 100644 --- a/src/tools/rbd_mirror/Replayer.h +++ b/src/tools/rbd_mirror/Replayer.h @@ -48,7 +48,7 @@ public: void print_status(Formatter *f, stringstream *ss); void start(); - void stop(); + void stop(bool manual); void restart(); void flush();