]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: Monitor: forward_request_leader() taking ops instead
authorJoao Eduardo Luis <joao@suse.de>
Fri, 19 Jun 2015 17:32:37 +0000 (18:32 +0100)
committerJoao Eduardo Luis <joao@suse.de>
Thu, 16 Jul 2015 17:31:22 +0000 (18:31 +0100)
Signed-off-by: Joao Eduardo Luis <joao@suse.de>
src/mon/ConfigKeyService.cc
src/mon/MonOpRequest.h
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/PaxosService.cc

index dc43ce5c7be0d2ec6e0838bb521072ccb73e544a..ba6408bd938938eb82648ea581b2604af3e43616 100644 (file)
@@ -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;
     }
 
index e81eab21d53b279a7709fccfb0a8fde1625972c1..0c59909ca7c16c1c9c249bd0c7eed79d36c356f0 100644 (file)
@@ -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<Message>(); }
 
+  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();
     }
   }
index d5b7fac6784f722cfe2e29401e346b05cb0db595..284af9f4866c1e399d8f29770acef7578fe7278d 100644 (file)
@@ -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<MonSession *>(req->get_connection()->get_priv());
+  MonSession *session = op->get_session();
+  PaxosServiceMessage *req = op->get_req<PaxosServiceMessage>();
+  
   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();
index a2469d5fcbd7e8d11b77c4c7151d5bcd456ea3f0..1b54b0626a02ba1e0ba6375cfaf62d039c64b2da 100644 (file)
@@ -799,7 +799,7 @@ public:
   uint64_t routed_request_tid;
   map<uint64_t, RoutedRequest*> 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);
index 6126970e9407656788cc6e55d1d7db06e0624666..84d63cf2a4c60ed447075521e64976e667cedb36 100644 (file)
@@ -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;
   }