Skip to content

Commit

Permalink
rbd-mirror: fix long termination due to 30sec wait in Mirror::run loop
Browse files Browse the repository at this point in the history
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
  • Loading branch information
Mykola Golub committed Mar 17, 2016
1 parent 809df6e commit a13cf7b
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 9 deletions.
18 changes: 15 additions & 3 deletions src/tools/rbd_mirror/Mirror.cc
Expand Up @@ -30,15 +30,25 @@ namespace mirror {
Mirror::Mirror(CephContext *cct) :
m_cct(cct),
m_lock("rbd::mirror::Mirror"),
m_local(new librados::Rados())
m_local(new librados::Rados()),
m_mirror_thread(this)
{
cct->lookup_or_create_singleton_object<Threads>(m_threads,
"rbd_mirror::threads");
}

void Mirror::handle_signal(int signum)
Mirror::~Mirror()
{
dout(20) << "terminating" << dendl;

m_stopping.set(1);
{
Mutex::Locker l(m_lock);
m_cond.Signal();
}
if (m_mirror_thread.is_started()) {
m_mirror_thread.join();
}
}

int Mirror::init()
Expand All @@ -58,7 +68,9 @@ int Mirror::init()
// TODO: make interval configurable
m_local_cluster_watcher.reset(new ClusterWatcher(m_local, m_lock));

return r;
m_mirror_thread.create("mirror");

return 0;
}

void Mirror::run()
Expand Down
12 changes: 11 additions & 1 deletion src/tools/rbd_mirror/Mirror.h
Expand Up @@ -32,10 +32,10 @@ class Mirror {
Mirror(CephContext *cct);
Mirror(const Mirror&) = delete;
Mirror& operator=(const Mirror&) = delete;
~Mirror();

int init();
void run();
void handle_signal(int signum);

private:
void refresh_peers(const set<peer_t> &peers);
Expand All @@ -51,6 +51,16 @@ class Mirror {
std::unique_ptr<ClusterWatcher> m_local_cluster_watcher;
std::map<peer_t, std::unique_ptr<Replayer> > m_replayers;
atomic_t m_stopping;

class MirrorThread : public Thread {
Mirror *m_mirror;
public:
MirrorThread(Mirror *mirror) : m_mirror(mirror) {}
void *entry() {
m_mirror->run();
return 0;
}
} m_mirror_thread;
};

} // namespace mirror
Expand Down
14 changes: 9 additions & 5 deletions src/tools/rbd_mirror/main.cc
Expand Up @@ -7,11 +7,12 @@
#include "common/errno.h"
#include "global/global_init.h"
#include "global/signal_handler.h"
#include "include/atomic.h"
#include "Mirror.h"

#include <vector>

rbd::mirror::Mirror *mirror = nullptr;
atomic_t stopping;

void usage() {
std::cout << "usage: rbd-mirror [options...]" << std::endl;
Expand All @@ -25,8 +26,7 @@ void usage() {

static void handle_signal(int signum)
{
if (mirror)
mirror->handle_signal(signum);
stopping.set(1);
}

int main(int argc, const char **argv)
Expand Down Expand Up @@ -58,14 +58,18 @@ int main(int argc, const char **argv)
register_async_signal_handler_oneshot(SIGINT, handle_signal);
register_async_signal_handler_oneshot(SIGTERM, handle_signal);

mirror = new rbd::mirror::Mirror(g_ceph_context);
rbd::mirror::Mirror *mirror =
new rbd::mirror::Mirror(g_ceph_context);
int r = mirror->init();
if (r < 0) {
std::cerr << "failed to initialize: " << cpp_strerror(r) << std::endl;
goto cleanup;
}

mirror->run();
while (!stopping.read()) {
struct timeval sleep_time{1, 0};
::select(0, NULL, NULL, NULL, &sleep_time);
}

cleanup:
unregister_async_signal_handler(SIGHUP, sighup_handler);
Expand Down

0 comments on commit a13cf7b

Please sign in to comment.