From c1aacdd85e04b7b69e1013d8bb378e6cf2f8502c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 20 Jan 2019 17:09:56 -0600 Subject: [PATCH] mon/Session: separate session creation, peer ident, and registration - We can now construct a session before we know who it is - We can later call _ident to identify it - and also later register it in the session map Signed-off-by: Sage Weil --- src/mon/Monitor.cc | 6 +++--- src/mon/Session.h | 39 ++++++++++++++++++++++++--------------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 1d481ee9b89..0c16a482012 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -3898,9 +3898,9 @@ void Monitor::handle_forward(MonOpRequestRef op) ceph_assert(req != NULL); ConnectionRef c(new AnonConnection(cct, m->client_socket_addr)); - MonSession *s = new MonSession(req->get_source(), - req->get_source_addrs(), - static_cast(c.get())); + MonSession *s = new MonSession(static_cast(c.get())); + s->_ident(req->get_source(), + req->get_source_addrs()); c->set_priv(RefCountedPtr{s, false}); c->set_peer_addrs(m->client_addrs); c->set_peer_type(m->client_type); diff --git a/src/mon/Session.h b/src/mon/Session.h index 8d7bbcf2ff1..8981599573a 100644 --- a/src/mon/Session.h +++ b/src/mon/Session.h @@ -67,19 +67,22 @@ struct MonSession : public RefCountedObject { map last_config; ///< most recently shared config bool any_config = false; - MonSession(const entity_name_t& n, const entity_addrvec_t& av, Connection *c) : - RefCountedObject(g_ceph_context), - con(c), - con_type(c->get_peer_type()), - name(n), - addrs(av), - socket_addr(c->get_peer_socket_addr()), - item(this) { - if (c->get_messenger()) { + MonSession(Connection *c) + : RefCountedObject(g_ceph_context), + con(c), + item(this) { } + + void _ident(const entity_name_t& n, const entity_addrvec_t& av) { + con_type = con->get_peer_type(); + name = n; + addrs = av; + socket_addr = con->get_peer_socket_addr(); + if (con->get_messenger()) { // only fill in features if this is a non-anonymous connection - con_features = c->get_features(); + con_features = con->get_features(); } } + ~MonSession() override { //generic_dout(0) << "~MonSession " << this << dendl; // we should have been removed before we get destructed; see MonSessionMap::remove_session() @@ -151,16 +154,22 @@ struct MonSessionMap { MonSession *new_session(const entity_name_t& n, const entity_addrvec_t& av, Connection *c) { - MonSession *s = new MonSession(n, av, c); + MonSession *s = new MonSession(c); ceph_assert(s); + s->_ident(n, av); + add_session(s); + return s; + } + + void add_session(MonSession *s) { sessions.push_back(&s->item); - if (n.is_osd()) - by_osd.insert(pair(n.num(), s)); + s->get(); + if (s->name.is_osd()) { + by_osd.insert(pair(s->name.num(), s)); + } if (s->con_features) { feature_map.add(s->con_type, s->con_features); } - s->get(); // caller gets a ref - return s; } MonSession *get_random_osd_session(OSDMap *osdmap) { -- 2.39.5