]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix forwarded request features when requests are resent 990/head
authorSage Weil <sage@inktank.com>
Mon, 23 Dec 2013 18:59:14 +0000 (10:59 -0800)
committerSage Weil <sage@inktank.com>
Mon, 23 Dec 2013 18:59:14 +0000 (10:59 -0800)
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 <sage@inktank.com>
src/messages/MForward.h
src/mon/Monitor.cc
src/mon/Monitor.h

index 45f59b29d6f67d7ec815789479a0e1ad0463e187..84970285f1e52585e675e345b4c570c4a5516f32 100644 (file)
@@ -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";
   }
 };
index fc3a66e4d0fc642aaae709bfa56eca0bf1924b40..afaf015f7768c469e50695765bd122531708047a 100644 (file)
@@ -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<MonSession *>(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));
index eb6776bd7578798f93df75c54685bf485749f0ed..8af2ed1bf18d1b483d38d3354aaafd3ee536f435 100644 (file)
@@ -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();