]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: when possible, fill PaxosServiceMap::caps before exiting ms_dispatch
authorGreg Farnum <gregf@hq.newdream.net>
Wed, 17 Mar 2010 17:56:42 +0000 (10:56 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Wed, 17 Mar 2010 21:57:12 +0000 (14:57 -0700)
src/mon/Monitor.cc
src/mon/Monitor.h

index 6fc5820ff15eaf03db2eedcc8227deed5948b033..ed3c8244bf181acda0fe4ff0acf9d938769883e8 100644 (file)
@@ -608,6 +608,7 @@ do { \
         reply_command((MMonCommand *)m, -EACCES, rs, 0);
         EXIT_NOT_ADMIN;
       }
+      fill_caps(m);
       handle_command((MMonCommand*)m);
       break;
 
@@ -625,11 +626,13 @@ do { \
     case MSG_OSD_PGTEMP:
       ALLOW_MESSAGES_FROM(CEPH_ENTITY_TYPE_OSD);
       ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_R);
+      fill_caps(m);
       paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
       break;
 
     case MSG_REMOVE_SNAPS:
       ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_RW);
+      fill_caps(m);
       paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
       break;
 
@@ -637,6 +640,7 @@ do { \
     case MSG_MDS_BEACON:
     case MSG_MDS_OFFLOAD_TARGETS:
       ALLOW_CAPS(PAXOS_MDSMAP, MON_CAP_RW);
+      fill_caps(m);
       paxos_service[PAXOS_MDSMAP]->dispatch((PaxosServiceMessage*)m);
       break;
 
@@ -644,6 +648,7 @@ do { \
     case MSG_MON_GLOBAL_ID:
     case CEPH_MSG_AUTH:
       /* no need to check caps here */
+      fill_caps(m);
       paxos_service[PAXOS_AUTH]->dispatch((PaxosServiceMessage*)m);
       break;
 
@@ -652,17 +657,20 @@ do { \
     case MSG_PGSTATS:
     case MSG_GETPOOLSTATS:
       ALLOW_CAPS(PAXOS_PGMAP, MON_CAP_R);
+      fill_caps(m);
       paxos_service[PAXOS_PGMAP]->dispatch((PaxosServiceMessage*)m);
       break;
 
     case MSG_POOLOP:
       ALLOW_CAPS(PAXOS_OSDMAP, MON_CAP_RX);
+      fill_caps(m);
       paxos_service[PAXOS_OSDMAP]->dispatch((PaxosServiceMessage*)m);
       break;
 
       // log
     case MSG_LOG:
       ALLOW_CAPS(PAXOS_LOG, MON_CAP_RW);
+      fill_caps(m);
       paxos_service[PAXOS_LOG]->dispatch((PaxosServiceMessage*)m);
       break;
 
@@ -696,6 +704,7 @@ do { \
       if (IS_NOT_ADMIN) {
         EXIT_NOT_ADMIN;
       }
+      fill_caps(m);
       handle_observe((MMonObserve *)m);
       break;
 
@@ -728,6 +737,18 @@ out:
   return ret;
 }
 
+//if we can, fill in the PaxosServiceMessage's caps field.
+void Monitor::fill_caps(Message *m)
+{
+  PaxosServiceMessage *msg = (PaxosServiceMessage *) m;
+  if (msg->caps) return; //already filled in!
+  Session *s = NULL;
+  if (m->get_connection()) {
+    s = (Session *) m->get_connection()->get_priv();
+  }
+  if (s) msg->caps = &s->caps;
+}
+
 void Monitor::handle_subscribe(MMonSubscribe *m)
 {
   dout(10) << "handle_subscribe " << *m << dendl;
index c1e0ee852b2eb51aa12d00a92bf7d1223f872bf8..f7e693b38eeaad4740a8f02d685d64248b1d4f20 100644 (file)
@@ -210,7 +210,9 @@ public:
   //ms_dispatch handles a lot of logic and we want to reuse it
   //on forwarded messages, so we let it be non-locking as well
   bool ms_dispatch(Message *m, bool do_lock=true);
-  bool ms_dispatch(Message *m) { ms_dispatch(m, true); }
+  bool ms_dispatch(Message *m) { return ms_dispatch(m, true); }
+  //fill in caps field if possible
+  void fill_caps(Message *m);
   bool ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer, bool force_new);
   bool ms_verify_authorizer(Connection *con, int peer_type,
                            int protocol, bufferlist& authorizer_data, bufferlist& authorizer_reply,