From: Joao Eduardo Luis Date: Fri, 19 Jun 2015 17:32:37 +0000 (+0100) Subject: mon: Monitor: forward_request_leader() taking ops instead X-Git-Tag: v9.1.0~535^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=39851dfe8a6b93f18b233c60229e935ba11a82dc;p=ceph.git mon: Monitor: forward_request_leader() taking ops instead Signed-off-by: Joao Eduardo Luis --- diff --git a/src/mon/ConfigKeyService.cc b/src/mon/ConfigKeyService.cc index dc43ce5c7be0..ba6408bd9389 100644 --- a/src/mon/ConfigKeyService.cc +++ b/src/mon/ConfigKeyService.cc @@ -131,7 +131,7 @@ bool ConfigKeyService::service_dispatch(MonOpRequestRef op) } else if (prefix == "config-key put") { if (!mon->is_leader()) { - mon->forward_request_leader(cmd); + mon->forward_request_leader(op); // we forward the message; so return now. return true; } @@ -160,7 +160,7 @@ bool ConfigKeyService::service_dispatch(MonOpRequestRef op) } else if (prefix == "config-key del") { if (!mon->is_leader()) { - mon->forward_request_leader(cmd); + mon->forward_request_leader(op); return true; } diff --git a/src/mon/MonOpRequest.h b/src/mon/MonOpRequest.h index e81eab21d53b..0c59909ca7c1 100644 --- a/src/mon/MonOpRequest.h +++ b/src/mon/MonOpRequest.h @@ -34,6 +34,10 @@ struct MonOpRequest : public TrackedOp { void mark_zap() { mark_event("monitor_zap"); } + void mark_forwarded() { + mark_event("forwarded"); + forwarded_to_leader = true; + } void mark_svc_event(const string &service, const string &event) { string s = service; @@ -65,12 +69,14 @@ private: utime_t dequeued_time; MonSession *session; ConnectionRef con; + bool forwarded_to_leader; MonOpRequest(Message *req, OpTracker *tracker) : TrackedOp(tracker, req->get_recv_stamp()), request(req->get()), session(NULL), - con(NULL) + con(NULL), + forwarded_to_leader(false) { tracker->mark_event(this, "header_read", request->get_recv_stamp()); tracker->mark_event(this, "throttled", request->get_throttle_stamp()); @@ -109,6 +115,12 @@ public: Message *get_req() const { return get_req(); } + int get_req_type() const { + if (!request) + return 0; + return request->get_type(); + } + ConnectionRef get_connection() { return con; } void set_session(MonSession *s) { @@ -148,6 +160,7 @@ public: f->dump_int("seq", seq); f->dump_bool("src_is_mon", is_src_mon()); f->dump_stream("source") << request->get_source_inst(); + f->dump_bool("forwarded_to_leader", forwarded_to_leader); f->close_section(); } } diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index d5b7fac6784f..284af9f4866c 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -2636,7 +2636,7 @@ void Monitor::handle_command(MonOpRequestRef op) } dout(10) << "Command not locally supported, forwarding request " << m << dendl; - forward_request_leader(m); + forward_request_leader(op); return; } else if (!mon_cmd->is_compat(leader_cmd)) { if (mon_cmd->is_noforward()) { @@ -2647,7 +2647,7 @@ void Monitor::handle_command(MonOpRequestRef op) } dout(10) << "Command not compatible with leader, forwarding request " << m << dendl; - forward_request_leader(m); + forward_request_leader(op); return; } } @@ -2756,7 +2756,7 @@ void Monitor::handle_command(MonOpRequestRef op) int r = scrub_start(); reply_command(op, r, "", rdata, 0); } else if (is_peon()) { - forward_request_leader(m); + forward_request_leader(op); } else { reply_command(op, -EAGAIN, "no quorum", rdata, 0); } @@ -3032,18 +3032,18 @@ void Monitor::reply_command(MonOpRequestRef op, int rc, const string &rs, // back via the correct monitor and back to them. (the monitor will not // initiate any connections.) -void Monitor::forward_request_leader(PaxosServiceMessage *req) +void Monitor::forward_request_leader(MonOpRequestRef op) { + op->mark_event(__func__); + int mon = get_leader(); - MonSession *session = 0; - if (req->get_connection()) - session = static_cast(req->get_connection()->get_priv()); + MonSession *session = op->get_session(); + PaxosServiceMessage *req = op->get_req(); + if (req->get_source().is_mon() && req->get_source_addr() != messenger->get_myaddr()) { dout(10) << "forward_request won't forward (non-local) mon request " << *req << dendl; - req->put(); } else if (session && session->proxy_con) { dout(10) << "forward_request won't double fwd request " << *req << dendl; - req->put(); } else if (session && !session->closed) { RoutedRequest *rr = new RoutedRequest; rr->tid = ++routed_request_tid; @@ -3069,9 +3069,9 @@ void Monitor::forward_request_leader(PaxosServiceMessage *req) forward->entity_name.set_type(CEPH_ENTITY_TYPE_MON); } messenger->send_message(forward, monmap->get_inst(mon)); + op->mark_forwarded(); } else { dout(10) << "forward_request no session for request " << *req << dendl; - req->put(); } if (session) session->put(); diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index a2469d5fcbd7..1b54b0626a02 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -799,7 +799,7 @@ public: uint64_t routed_request_tid; map routed_requests; - void forward_request_leader(PaxosServiceMessage *req); + void forward_request_leader(MonOpRequestRef op); void handle_forward(MonOpRequestRef op); void try_send_message(Message *m, const entity_inst_t& to); void send_reply(PaxosServiceMessage *req, Message *reply); diff --git a/src/mon/PaxosService.cc b/src/mon/PaxosService.cc index 6126970e9407..84d63cf2a4c6 100644 --- a/src/mon/PaxosService.cc +++ b/src/mon/PaxosService.cc @@ -78,7 +78,7 @@ bool PaxosService::dispatch(MonOpRequestRef op) // leader? if (!mon->is_leader()) { - mon->forward_request_leader(m); + mon->forward_request_leader(op); return true; }