From ac10aa5d1e20c230f27ee07d9b7c88c11071f681 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Dec 2013 10:59:14 -0800 Subject: [PATCH] mon: fix forwarded request features when requests are resent Pass the features in explicitly so that we can use messages we've just decoded in resend_routed_requests(). Keep the features in struct RoutedRequest. Renamed conn_features -> con_features while we are here. Signed-off-by: Sage Weil --- src/messages/MForward.h | 21 +++++++++++---------- src/mon/Monitor.cc | 10 +++++++--- src/mon/Monitor.h | 2 ++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/messages/MForward.h b/src/messages/MForward.h index 45f59b29d6f67..84970285f1e52 100644 --- a/src/messages/MForward.h +++ b/src/messages/MForward.h @@ -28,26 +28,27 @@ struct MForward : public Message { PaxosServiceMessage *msg; entity_inst_t client; MonCap client_caps; - uint64_t conn_features; + uint64_t con_features; static const int HEAD_VERSION = 2; static const int COMPAT_VERSION = 0; MForward() : Message(MSG_FORWARD, HEAD_VERSION, COMPAT_VERSION), - tid(0), msg(NULL), conn_features(0) {} + tid(0), msg(NULL), con_features(0) {} //the message needs to have caps filled in! - MForward(uint64_t t, PaxosServiceMessage *m) : + MForward(uint64_t t, PaxosServiceMessage *m, uint64_t feat) : Message(MSG_FORWARD, HEAD_VERSION, COMPAT_VERSION), tid(t), msg(m) { client = m->get_source_inst(); client_caps = m->get_session()->caps; - conn_features = m->get_connection()->get_features(); + con_features = feat; } - MForward(uint64_t t, PaxosServiceMessage *m, const MonCap& caps) : + MForward(uint64_t t, PaxosServiceMessage *m, uint64_t feat, + const MonCap& caps) : Message(MSG_FORWARD, HEAD_VERSION, COMPAT_VERSION), tid(t), msg(m), client_caps(caps) { client = m->get_source_inst(); - conn_features = m->get_connection()->get_features(); + con_features = feat; } private: ~MForward() { @@ -60,7 +61,7 @@ public: ::encode(client, payload); ::encode(client_caps, payload, features); encode_message(msg, features, payload); - ::encode(conn_features, payload); + ::encode(con_features, payload); } void decode_payload() { @@ -70,9 +71,9 @@ public: ::decode(client_caps, p); msg = (PaxosServiceMessage *)decode_message(NULL, p); if (header.version >= 2) { - ::decode(conn_features, p); + ::decode(con_features, p); } else { - conn_features = 0; + con_features = 0; } } @@ -81,7 +82,7 @@ public: void print(ostream& o) const { if (msg) o << "forward(" << *msg << " caps " << client_caps - << " conn_features " << conn_features << ") to leader"; + << " con_features " << con_features << ") to leader"; else o << "forward(??? ) to leader"; } }; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index fc3a66e4d0fc6..afaf015f7768c 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -2384,6 +2384,7 @@ void Monitor::forward_request_leader(PaxosServiceMessage *req) rr->tid = ++routed_request_tid; rr->client_inst = req->get_source_inst(); rr->con = req->get_connection(); + rr->con_features = rr->con->get_features(); encode_message(req, CEPH_FEATURES_ALL, rr->request_bl); // for my use only; use all features rr->session = static_cast(session->get()); routed_requests[rr->tid] = rr; @@ -2391,7 +2392,9 @@ void Monitor::forward_request_leader(PaxosServiceMessage *req) dout(10) << "forward_request " << rr->tid << " request " << *req << dendl; - MForward *forward = new MForward(rr->tid, req, rr->session->caps); + MForward *forward = new MForward(rr->tid, req, + rr->con_features, + rr->session->caps); forward->set_priority(req->get_priority()); messenger->send_message(forward, monmap->get_inst(mon)); } else { @@ -2419,7 +2422,7 @@ void Monitor::handle_forward(MForward *m) c->set_priv(s); c->set_peer_addr(m->client.addr); c->set_peer_type(m->client.name.type()); - c->set_features(m->conn_features); + c->set_features(m->con_features); s->caps = m->client_caps; dout(10) << " caps are " << s->caps << dendl; @@ -2583,7 +2586,8 @@ void Monitor::resend_routed_requests() delete rr; } else { dout(10) << " resend to mon." << mon << " tid " << rr->tid << " " << *req << dendl; - MForward *forward = new MForward(rr->tid, req, rr->session->caps); + MForward *forward = new MForward(rr->tid, req, rr->con_features, + rr->session->caps); forward->client = rr->client_inst; forward->set_priority(req->get_priority()); messenger->send_message(forward, monmap->get_inst(mon)); diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index eb6776bd75787..8af2ed1bf18d1 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -659,8 +659,10 @@ public: bufferlist request_bl; MonSession *session; ConnectionRef con; + uint64_t con_features; entity_inst_t client_inst; + RoutedRequest() : tid(0), session(NULL), con_features(0) {} ~RoutedRequest() { if (session) session->put(); -- 2.39.5