From 71d5bcfd9698ec4bddc34273d3d77bca0d65ca9b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 8 Oct 2009 10:02:22 -0700 Subject: [PATCH] msgr: do not require bind() on client apps --- src/ceph.cc | 1 - src/cfuse.cc | 3 +-- src/csyn.cc | 3 +-- src/librados.cc | 3 +-- src/msg/SimpleMessenger.cc | 29 ++++++++++++++++++++++------- src/msg/SimpleMessenger.h | 12 +++++++----- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/ceph.cc b/src/ceph.cc index 8a280544db8e6..95df478cb6390 100644 --- a/src/ceph.cc +++ b/src/ceph.cc @@ -605,7 +605,6 @@ int main(int argc, const char **argv, const char *envp[]) // start up network SimpleMessenger rank; - rank.bind(); messenger = rank.register_entity(entity_name_t::ADMIN()); messenger->add_dispatcher_head(&dispatcher); diff --git a/src/cfuse.cc b/src/cfuse.cc index b8db144241a99..f7420df4c9964 100644 --- a/src/cfuse.cc +++ b/src/cfuse.cc @@ -69,8 +69,7 @@ int main(int argc, const char **argv, const char *envp[]) { // start up network SimpleMessenger rank; - rank.bind(); - cout << "bound to " << rank.get_rank_addr() << ", mounting ceph" << std::endl; + cout << "mounting ceph" << std::endl; Client *client = new Client(rank.register_entity(entity_name_t::CLIENT()), &mc); diff --git a/src/csyn.cc b/src/csyn.cc index 88b87b7dd8737..f42281b9d935e 100644 --- a/src/csyn.cc +++ b/src/csyn.cc @@ -56,8 +56,7 @@ int main(int argc, const char **argv, char *envp[]) // start up network SimpleMessenger rank; - rank.bind(); - cout << "starting csyn at " << rank.get_rank_addr() << std::endl; + cout << "starting csyn" << std::endl; rank.set_policy(entity_name_t::TYPE_MON, SimpleMessenger::Policy::lossy_fail_after(2.0)); rank.set_policy(entity_name_t::TYPE_MDS, SimpleMessenger::Policy::lossless()); diff --git a/src/librados.cc b/src/librados.cc index 030cdba0f36c5..d29c039523da1 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -281,8 +281,7 @@ bool RadosClient::init() if (monclient.build_initial_monmap() < 0) return false; - rank.bind(); - dout(1) << "starting at " << rank.get_rank_addr() << dendl; + dout(1) << "starting msgr at " << rank.get_rank_addr() << dendl; messenger = rank.register_entity(entity_name_t::CLIENT(-1)); assert_warn(messenger); diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index dc7e0156ce4e8..91a770b1d9800 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -148,6 +148,7 @@ int SimpleMessenger::Accepter::bind(int64_t force_nonce) rank->rank_addr.v.erank = 0; dout(1) << "accepter.bind rank_addr is " << rank->rank_addr << " need_addr=" << rank->need_addr << dendl; + rank->did_bind = true; return 0; } @@ -162,8 +163,6 @@ int SimpleMessenger::Accepter::start() sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - sigaction(SIGPIPE, &sa, NULL); // mask SIGPIPE too. FIXME: i'm quite certain this is a roundabout way to do that. // start thread create(); @@ -1999,7 +1998,10 @@ int SimpleMessenger::start(bool nodaemon) return 0; } - dout(1) << "rank.start at " << rank_addr << dendl; + if (!did_bind) + rank_addr.v.nonce = getpid(); + + dout(1) << "rank.start" << dendl; started = true; lock.Unlock(); @@ -2041,8 +2043,18 @@ int SimpleMessenger::start(bool nodaemon) if (g_conf.kill_after) g_timer.add_event_after(g_conf.kill_after, new C_Die); + // set noop handlers for SIGUSR2, SIGPIPE + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = noop_signal_handler; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(SIGUSR2, &sa, NULL); + sigaction(SIGPIPE, &sa, NULL); // mask SIGPIPE too. FIXME: i'm quite certain this is a roundabout way to do that. + // go! - accepter.start(); + if (did_bind) + accepter.start(); return 0; } @@ -2254,9 +2266,11 @@ void SimpleMessenger::wait() lock.Unlock(); // done! clean up. - dout(0) << "wait: stopping accepter thread" << dendl; - accepter.stop(); - dout(20) << "wait: stopped accepter thread" << dendl; + if (did_bind) { + dout(0) << "wait: stopping accepter thread" << dendl; + accepter.stop(); + dout(20) << "wait: stopped accepter thread" << dendl; + } // close+reap all pipes lock.Lock(); @@ -2289,6 +2303,7 @@ void SimpleMessenger::wait() dout(0) << "shutdown complete." << dendl; remove_pid_file(); started = false; + did_bind = false; my_type = -1; } diff --git a/src/msg/SimpleMessenger.h b/src/msg/SimpleMessenger.h index b8ecea1dc293b..8543d8fbd4d6f 100644 --- a/src/msg/SimpleMessenger.h +++ b/src/msg/SimpleMessenger.h @@ -405,6 +405,7 @@ private: Mutex lock; Cond wait_cond; // for wait() bool started; + bool did_bind; // where i listen bool need_addr; @@ -444,11 +445,12 @@ private: } public: - SimpleMessenger() : accepter(this), - lock("SimpleMessenger::lock"), started(false), need_addr(true), - max_local(0), num_local(0), - my_type(-1), - global_seq_lock("SimpleMessenger::global_seq_lock"), global_seq(0) { } + SimpleMessenger() : + accepter(this), + lock("SimpleMessenger::lock"), started(false), did_bind(false), need_addr(true), + max_local(0), num_local(0), + my_type(-1), + global_seq_lock("SimpleMessenger::global_seq_lock"), global_seq(0) { } ~SimpleMessenger() { } //void set_listen_addr(tcpaddr_t& a); -- 2.39.5