Skip to content

Commit

Permalink
mon: fix forwarded request features when requests are resent
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sage Weil committed Dec 23, 2013
1 parent 9ffe9dd commit ac10aa5
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
21 changes: 11 additions & 10 deletions src/messages/MForward.h
Expand Up @@ -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() {
Expand All @@ -60,7 +61,7 @@ struct MForward : public Message {
::encode(client, payload);
::encode(client_caps, payload, features);
encode_message(msg, features, payload);
::encode(conn_features, payload);
::encode(con_features, payload);
}

void decode_payload() {
Expand All @@ -70,9 +71,9 @@ struct MForward : public Message {
::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;
}

}
Expand All @@ -81,7 +82,7 @@ struct MForward : public Message {
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";
}
};
Expand Down
10 changes: 7 additions & 3 deletions src/mon/Monitor.cc
Expand Up @@ -2384,14 +2384,17 @@ 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;
session->routed_request_tids.insert(rr->tid);

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 {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand Down
2 changes: 2 additions & 0 deletions src/mon/Monitor.h
Expand Up @@ -659,8 +659,10 @@ class Monitor : public Dispatcher {
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();
Expand Down

0 comments on commit ac10aa5

Please sign in to comment.