std::uniform_int_distribution<unsigned> ranks(0, monmap.size() - 1);
while (monmap.fsid.is_zero()) {
auto rank = ranks(rng);
- auto& pending_con = _add_conn(rank);
+ auto& pending_con = _add_conn(rank, 0);
auto con = pending_con.get_con();
ldout(cct, 10) << "querying mon." << monmap.get_name(rank) << " "
<< con->get_peer_addr() << dendl;
assert(monc_lock.is_locked());
ldout(cct, 10) << __func__ << " rank " << rank << dendl;
+ // save global_id if any before nuking active_con
+ const uint64_t global_id = active_con ? active_con->get_global_id() : 0;
active_con.reset();
pending_cons.clear();
_start_hunting();
if (rank >= 0) {
- _add_conn(rank);
+ _add_conn(rank, global_id);
} else {
- _add_conns();
+ _add_conns(global_id);
}
// throw out old queued messages
_renew_subs();
}
-MonConnection& MonClient::_add_conn(unsigned rank)
+MonConnection& MonClient::_add_conn(unsigned rank, uint64_t global_id)
{
auto peer = monmap.get_addr(rank);
auto conn = messenger->get_connection(monmap.get_inst(rank));
- MonConnection mc(cct, conn);
+ MonConnection mc(cct, conn, global_id);
auto inserted = pending_cons.insert(move(make_pair(peer, move(mc))));
ldout(cct, 10) << "picked mon." << monmap.get_name(rank)
<< " con " << conn
return inserted.first->second;
}
-void MonClient::_add_conns()
+void MonClient::_add_conns(uint64_t global_id)
{
const unsigned num_mons = monmap.size();
vector<unsigned> ranks(num_mons);
n = num_mons;
}
for (unsigned i = 0; i < n; i++) {
- _add_conn(ranks[i]);
+ _add_conn(ranks[i], global_id);
}
}
#undef dout_prefix
#define dout_prefix *_dout << "monclient" << (have_session() ? ": " : "(hunting): ")
-MonConnection::MonConnection(CephContext *cct, ConnectionRef con)
- : cct(cct), con(con)
+MonConnection::MonConnection(CephContext *cct, ConnectionRef con, uint64_t global_id)
+ : cct(cct), con(con), global_id(global_id)
{}
MonConnection::~MonConnection()
class MonConnection {
public:
MonConnection(CephContext *cct,
- ConnectionRef conn);
+ ConnectionRef conn,
+ uint64_t global_id);
~MonConnection();
MonConnection(MonConnection&& rhs) = default;
MonConnection& operator=(MonConnection&&) = default;
ConnectionRef con;
std::unique_ptr<AuthClientHandler> auth;
- uint64_t global_id = 0;
+ uint64_t global_id;
};
class MonClient : public Dispatcher {
void _finish_hunting();
void _finish_auth(int auth_err);
void _reopen_session(int rank = -1);
- MonConnection& _add_conn(unsigned rank);
- void _add_conns();
+ MonConnection& _add_conn(unsigned rank, uint64_t global_id);
+ void _add_conns(uint64_t global_id);
void _send_mon_message(Message *m);
public: