From: Sage Weil Date: Wed, 12 Jun 2013 23:36:21 +0000 (-0700) Subject: mon/MonClient: send commands to a specific monitor X-Git-Tag: v0.65~85^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d1b83ff411603a59aaed3bf96f57665d4f221691;p=ceph.git mon/MonClient: send commands to a specific monitor This implementation is limited: we direct our command by reopening a session with the specific monitor. If there is more than one of these queued we will fail to reach either. Signed-off-by: Sage Weil --- diff --git a/src/mon/MonClient.cc b/src/mon/MonClient.cc index 181d06883112..c0d2b5183c56 100644 --- a/src/mon/MonClient.cc +++ b/src/mon/MonClient.cc @@ -479,11 +479,18 @@ string MonClient::_pick_random_mon() } } -void MonClient::_pick_new_mon() +void MonClient::_reopen_session(int rank, string name) { assert(monc_lock.is_locked()); + ldout(cct, 10) << "_reopen_session rank " << rank << " name " << name << dendl; - cur_mon = _pick_random_mon(); + if (rank < 0 && name.length() == 0) { + cur_mon = _pick_random_mon(); + } else if (name.length()) { + cur_mon = name; + } else { + cur_mon = monmap.get_name(rank); + } if (cur_con) { messenger->mark_down(cur_con); @@ -491,18 +498,9 @@ void MonClient::_pick_new_mon() } cur_con = messenger->get_connection(monmap.get_inst(cur_mon)); - ldout(cct, 10) << "_pick_new_mon picked mon." << cur_mon << " con " << cur_con + ldout(cct, 10) << "picked mon." << cur_mon << " con " << cur_con << " addr " << cur_con->get_peer_addr() << dendl; -} - - -void MonClient::_reopen_session() -{ - assert(monc_lock.is_locked()); - ldout(cct, 10) << "_reopen_session" << dendl; - - _pick_new_mon(); // throw out old queued messages while (!waiting_for_session.empty()) { @@ -724,6 +722,37 @@ int MonClient::wait_auth_rotating(double timeout) void MonClient::_send_command(MonCommand *r) { version_t last_seen_version = 0; + + if (r->target_rank >= 0 && + r->target_rank != monmap.get_rank(cur_mon)) { + ldout(cct, 10) << "_send_command " << r->tid << " " << r->cmd + << " wants rank " << r->target_rank + << ", reopening session" + << dendl; + if (r->target_rank >= (int)monmap.size()) { + ldout(cct, 10) << " target " << r->target_rank << " >= max mon " << monmap.size() << dendl; + _finish_command(r, -ENOENT, "mon rank dne"); + return; + } + _reopen_session(r->target_rank, string()); + return; + } + + if (r->target_name.length() && + r->target_name != cur_mon) { + ldout(cct, 10) << "_send_command " << r->tid << " " << r->cmd + << " wants mon " << r->target_name + << ", reopening session" + << dendl; + if (!monmap.contains(r->target_name)) { + ldout(cct, 10) << " target " << r->target_name << " not present in monmap" << dendl; + _finish_command(r, -ENOENT, "mon dne"); + return; + } + _reopen_session(-1, r->target_name); + return; + } + ldout(cct, 10) << "_send_command " << r->tid << " " << r->cmd << dendl; MMonCommand *m = new MMonCommand(monmap.fsid, last_seen_version); m->set_tid(r->tid); @@ -798,6 +827,43 @@ int MonClient::start_mon_command(const vector& cmd, bufferlist& inbl, return 0; } +int MonClient::start_mon_command(string name, + const vector& cmd, bufferlist& inbl, + bufferlist *outbl, string *outs, + Context *onfinish) +{ + Mutex::Locker l(monc_lock); + MonCommand *r = new MonCommand(++last_mon_command_tid); + r->target_name = name; + r->cmd = cmd; + r->inbl = inbl; + r->poutbl = outbl; + r->prs = outs; + r->onfinish = onfinish; + mon_commands[r->tid] = r; + _send_command(r); + // can't fail + return 0; +} + +int MonClient::start_mon_command(int rank, + const vector& cmd, bufferlist& inbl, + bufferlist *outbl, string *outs, + Context *onfinish) +{ + Mutex::Locker l(monc_lock); + MonCommand *r = new MonCommand(++last_mon_command_tid); + r->target_rank = rank; + r->cmd = cmd; + r->inbl = inbl; + r->poutbl = outbl; + r->prs = outs; + r->onfinish = onfinish; + mon_commands[r->tid] = r; + _send_command(r); + return 0; +} + // --------- void MonClient::get_version(string map, version_t *newest, version_t *oldest, Context *onfinish) diff --git a/src/mon/MonClient.h b/src/mon/MonClient.h index 04e6b0e44b5b..7d4a0548f9d0 100644 --- a/src/mon/MonClient.h +++ b/src/mon/MonClient.h @@ -129,8 +129,10 @@ private: string _pick_random_mon(); void _finish_hunting(); - void _reopen_session(); - void _pick_new_mon(); + void _reopen_session(int rank, string name); + void _reopen_session() { + _reopen_session(-1, string()); + } void _send_mon_message(Message *m, bool force=false); public: @@ -270,6 +272,8 @@ public: private: uint64_t last_mon_command_tid; struct MonCommand { + string target_name; + int target_rank; uint64_t tid; vector cmd; bufferlist inbl; @@ -279,7 +283,8 @@ private: Context *onfinish; MonCommand(uint64_t t) - : tid(t), + : target_rank(-1), + tid(t), poutbl(NULL), prs(NULL), prval(NULL), onfinish(NULL) {} }; @@ -294,6 +299,14 @@ public: int start_mon_command(const vector& cmd, bufferlist& inbl, bufferlist *outbl, string *outs, Context *onfinish); + int start_mon_command(int mon_rank, + const vector& cmd, bufferlist& inbl, + bufferlist *outbl, string *outs, + Context *onfinish); + int start_mon_command(const string mon_name, ///< mon name, with mon. prefix + const vector& cmd, bufferlist& inbl, + bufferlist *outbl, string *outs, + Context *onfinish); // version requests public: