]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: add msgref cast method
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 14 Aug 2018 20:00:38 +0000 (13:00 -0700)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 15 Aug 2018 20:36:38 +0000 (13:36 -0700)
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mds/Beacon.cc
src/mds/Locker.cc
src/mds/MDBalancer.cc
src/mds/MDCache.cc
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/Migrator.cc
src/mds/Server.cc
src/msg/Message.h

index 6603ca3eb6ba60adec620a44a9cb52197878be61..18562976b80a115bd74bbd96173f69cf663d04b3 100644 (file)
@@ -92,7 +92,7 @@ bool Beacon::ms_dispatch2(const Message::ref& m)
 {
   if (m->get_type() == MSG_MDS_BEACON) {
     if (m->get_connection()->get_peer_type() == CEPH_ENTITY_TYPE_MON) {
-      handle_mds_beacon(boost::static_pointer_cast<MMDSBeacon::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+      handle_mds_beacon(MMDSBeacon::msgref_cast(m));
     }
     return true;
   }
index 97f92c1938b69591a62cbdcf528bd790b7975735..84eaa75311858132001a226bfb1bc60bc7ac7f8a 100644 (file)
@@ -95,21 +95,21 @@ void Locker::dispatch(const Message::const_ref &m)
   switch (m->get_type()) {
     // inter-mds locking
   case MSG_MDS_LOCK:
-    handle_lock(boost::static_pointer_cast<MLock::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_lock(MLock::msgref_cast(m));
     break;
     // inter-mds caps
   case MSG_MDS_INODEFILECAPS:
-    handle_inode_file_caps(boost::static_pointer_cast<MInodeFileCaps::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_inode_file_caps(MInodeFileCaps::msgref_cast(m));
     break;
     // client sync
   case CEPH_MSG_CLIENT_CAPS:
-    handle_client_caps(boost::static_pointer_cast<MClientCaps::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_caps(MClientCaps::msgref_cast(m));
     break;
   case CEPH_MSG_CLIENT_CAPRELEASE:
-    handle_client_cap_release(boost::static_pointer_cast<MClientCapRelease::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_cap_release(MClientCapRelease::msgref_cast(m));
     break;
   case CEPH_MSG_CLIENT_LEASE:
-    handle_client_lease(boost::static_pointer_cast<MClientLease::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_lease(MClientLease::msgref_cast(m));
     break;
   default:
     derr << "locker unknown message " << m->get_type() << dendl;
@@ -2644,7 +2644,7 @@ void Locker::handle_client_caps(const MClientCaps::const_ref &m)
          << " op " << ceph_cap_op_name(op)
          << " flags 0x" << std::hex << m->flags << std::dec << dendl;
 
-  Session *session = mds->get_session(boost::static_pointer_cast<Message::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+  Session *session = mds->get_session(m);
   if (!mds->is_clientreplay() && !mds->is_active() && !mds->is_stopping()) {
     if (!session) {
       dout(5) << " no session, dropping " << *m << dendl;
@@ -3371,7 +3371,7 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
   if (!dirty && !change_max)
     return false;
 
-  Session *session = mds->get_session(boost::static_pointer_cast<Message::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+  Session *session = mds->get_session(m);
   if (session->check_access(in, MAY_WRITE,
                            m->caller_uid, m->caller_gid, NULL, 0, 0) < 0) {
     dout(10) << "check_access failed, dropping cap update on " << *in << dendl;
@@ -3466,7 +3466,7 @@ void Locker::handle_client_cap_release(const MClientCapRelease::const_ref &m)
     mds->set_osd_epoch_barrier(m->osd_epoch_barrier);
   }
 
-  Session *session = mds->get_session(boost::static_pointer_cast<Message::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+  Session *session = mds->get_session(m);
 
   for (const auto &cap : m->caps) {
     _do_cap_release(client, inodeno_t((uint64_t)cap.ino) , cap.cap_id, cap.migrate_seq, cap.seq);
index c5374999b3229e687ac2d77173ca0a5968ad6403..66ddbd69fe9c60abf519f90839604eb3c915baaf 100644 (file)
@@ -64,7 +64,7 @@ int MDBalancer::proc_message(const Message::const_ref &m)
   switch (m->get_type()) {
 
   case MSG_MDS_HEARTBEAT:
-    handle_heartbeat(boost::static_pointer_cast<MHeartbeat::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_heartbeat(MHeartbeat::msgref_cast(m));
     break;
 
   default:
index c797d7e9f78ee0b267c1731b87ea0c18a184bdfd..d7a44f5f11f9798f185e791ab95aba0fbad17b7d 100644 (file)
@@ -7854,59 +7854,59 @@ void MDCache::dispatch(const Message::const_ref &m)
 
     // RESOLVE
   case MSG_MDS_RESOLVE:
-    handle_resolve(boost::static_pointer_cast<MMDSResolve::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_resolve(MMDSResolve::msgref_cast(m));
     break;
   case MSG_MDS_RESOLVEACK:
-    handle_resolve_ack(boost::static_pointer_cast<MMDSResolveAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_resolve_ack(MMDSResolveAck::msgref_cast(m));
     break;
 
     // REJOIN
   case MSG_MDS_CACHEREJOIN:
-    handle_cache_rejoin(boost::static_pointer_cast<MMDSCacheRejoin::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_cache_rejoin(MMDSCacheRejoin::msgref_cast(m));
     break;
 
   case MSG_MDS_DISCOVER:
-    handle_discover(boost::static_pointer_cast<MDiscover::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_discover(MDiscover::msgref_cast(m));
     break;
   case MSG_MDS_DISCOVERREPLY:
-    handle_discover_reply(boost::static_pointer_cast<MDiscoverReply::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_discover_reply(MDiscoverReply::msgref_cast(m));
     break;
 
   case MSG_MDS_DIRUPDATE:
-    handle_dir_update(boost::static_pointer_cast<MDirUpdate::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_dir_update(MDirUpdate::msgref_cast(m));
     break;
 
   case MSG_MDS_CACHEEXPIRE:
-    handle_cache_expire(boost::static_pointer_cast<MCacheExpire::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_cache_expire(MCacheExpire::msgref_cast(m));
     break;
 
   case MSG_MDS_DENTRYLINK:
-    handle_dentry_link(boost::static_pointer_cast<MDentryLink::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_dentry_link(MDentryLink::msgref_cast(m));
     break;
   case MSG_MDS_DENTRYUNLINK:
-    handle_dentry_unlink(boost::static_pointer_cast<MDentryUnlink::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_dentry_unlink(MDentryUnlink::msgref_cast(m));
     break;
 
   case MSG_MDS_FRAGMENTNOTIFY:
-    handle_fragment_notify(boost::static_pointer_cast<MMDSFragmentNotify::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_fragment_notify(MMDSFragmentNotify::msgref_cast(m));
     break;
 
   case MSG_MDS_FINDINO:
-    handle_find_ino(boost::static_pointer_cast<MMDSFindIno::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_find_ino(MMDSFindIno::msgref_cast(m));
     break;
   case MSG_MDS_FINDINOREPLY:
-    handle_find_ino_reply(boost::static_pointer_cast<MMDSFindInoReply::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_find_ino_reply(MMDSFindInoReply::msgref_cast(m));
     break;
 
   case MSG_MDS_OPENINO:
-    handle_open_ino(boost::static_pointer_cast<MMDSOpenIno::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_open_ino(MMDSOpenIno::msgref_cast(m));
     break;
   case MSG_MDS_OPENINOREPLY:
-    handle_open_ino_reply(boost::static_pointer_cast<MMDSOpenInoReply::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_open_ino_reply(MMDSOpenInoReply::msgref_cast(m));
     break;
 
   case MSG_MDS_SNAPUPDATE:
-    handle_snap_update(boost::static_pointer_cast<MMDSSnapUpdate::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_snap_update(MMDSSnapUpdate::msgref_cast(m));
     break;
     
   default:
index 9422e165e200e6fd7a8abf4df8b7b6ff3519e030..763b3b2d0330820335a37e6c5d565b05566b646b 100644 (file)
@@ -1184,12 +1184,12 @@ bool MDSDaemon::handle_core_message(const Message::const_ref &m)
     // MDS
   case CEPH_MSG_MDS_MAP:
     ALLOW_MESSAGES_FROM(CEPH_ENTITY_TYPE_MON | CEPH_ENTITY_TYPE_MDS);
-    handle_mds_map(boost::static_pointer_cast<MMDSMap::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_mds_map(MMDSMap::msgref_cast(m));
     break;
 
     // OSD
   case MSG_COMMAND:
-    handle_command(boost::static_pointer_cast<MCommand::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_command(MCommand::msgref_cast(m));
     break;
   case CEPH_MSG_OSD_MAP:
     ALLOW_MESSAGES_FROM(CEPH_ENTITY_TYPE_MON | CEPH_ENTITY_TYPE_OSD);
index 97fcef51b177e71c3858fc7600a534f3d25e5003..5563d33245afb867893ab70377423abd43463d86 100644 (file)
@@ -769,7 +769,7 @@ bool MDSRank::handle_deferrable_message(const Message::const_ref &m)
     case MSG_MDS_TABLE_REQUEST:
       ALLOW_MESSAGES_FROM(CEPH_ENTITY_TYPE_MDS);
       {
-        const MMDSTableRequest::const_ref &req = boost::static_pointer_cast<MMDSTableRequest::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m);
+        const MMDSTableRequest::const_ref &req = MMDSTableRequest::msgref_cast(m);
         if (req->op < 0) {
           MDSTableClient *client = get_table_client(req->table);
           client->handle_request(req);
index 1150ff31b0d814d2ebe7d0a6366444eeadfebc9e..d529645c3381df3bd8c431d69ab399f2db1e2a48 100644 (file)
@@ -96,54 +96,54 @@ void Migrator::dispatch(const Message::const_ref &m)
   switch (m->get_type()) {
     // import
   case MSG_MDS_EXPORTDIRDISCOVER:
-    handle_export_discover(boost::static_pointer_cast<MExportDirDiscover::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_discover(MExportDirDiscover::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIRPREP:
-    handle_export_prep(boost::static_pointer_cast<MExportDirPrep::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_prep(MExportDirPrep::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIR:
     if (unlikely(inject_session_race)) {
       dout(0) << "waiting for inject_session_race" << dendl;
       mds->wait_for_any_client_connection(new C_MDS_RetryMessage(mds, m));
     } else {
-      handle_export_dir(boost::static_pointer_cast<MExportDir::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+      handle_export_dir(MExportDir::msgref_cast(m));
     }
     break;
   case MSG_MDS_EXPORTDIRFINISH:
-    handle_export_finish(boost::static_pointer_cast<MExportDirFinish::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_finish(MExportDirFinish::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIRCANCEL:
-    handle_export_cancel(boost::static_pointer_cast<MExportDirCancel::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_cancel(MExportDirCancel::msgref_cast(m));
     break;
 
     // export 
   case MSG_MDS_EXPORTDIRDISCOVERACK:
-    handle_export_discover_ack(boost::static_pointer_cast<MExportDirDiscoverAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_discover_ack(MExportDirDiscoverAck::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIRPREPACK:
-    handle_export_prep_ack(boost::static_pointer_cast<MExportDirPrepAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_prep_ack(MExportDirPrepAck::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIRACK:
-    handle_export_ack(boost::static_pointer_cast<MExportDirAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_ack(MExportDirAck::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTDIRNOTIFYACK:
-    handle_export_notify_ack(boost::static_pointer_cast<MExportDirNotifyAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_notify_ack(MExportDirNotifyAck::msgref_cast(m));
     break;
 
     // export 3rd party (dir_auth adjustments)
   case MSG_MDS_EXPORTDIRNOTIFY:
-    handle_export_notify(boost::static_pointer_cast<MExportDirNotify::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_notify(MExportDirNotify::msgref_cast(m));
     break;
 
     // caps
   case MSG_MDS_EXPORTCAPS:
-    handle_export_caps(boost::static_pointer_cast<MExportCaps::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_caps(MExportCaps::msgref_cast(m));
     break;
   case MSG_MDS_EXPORTCAPSACK:
-    handle_export_caps_ack(boost::static_pointer_cast<MExportCapsAck::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_export_caps_ack(MExportCapsAck::msgref_cast(m));
     break;
   case MSG_MDS_GATHERCAPS:
-    handle_gather_caps(boost::static_pointer_cast<MGatherCaps::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_gather_caps(MGatherCaps::msgref_cast(m));
     break;
 
   default:
index e9ff4a5278b9692baae643bc35b6c1d19780fbde..008a1ebacc87b85606d5eab265e42b5293dccaf2 100644 (file)
@@ -184,14 +184,14 @@ void Server::dispatch(const Message::const_ref &m)
 {
   switch (m->get_type()) {
   case CEPH_MSG_CLIENT_RECONNECT:
-    handle_client_reconnect(boost::static_pointer_cast<MClientReconnect::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_reconnect(MClientReconnect::msgref_cast(m));
     return;
   }
 
   // active?
   // handle_slave_request()/handle_client_session() will wait if necessary
   if (m->get_type() == CEPH_MSG_CLIENT_REQUEST && !mds->is_active()) {
-    const auto &req = boost::static_pointer_cast<MClientRequest::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m);
+    const auto &req = MClientRequest::msgref_cast(m);
     if (mds->is_reconnect() || mds->get_want_state() == CEPH_MDS_STATE_RECONNECT) {
       Session *session = mds->get_session(req);
       if (!session || session->is_closed()) {
@@ -242,13 +242,13 @@ void Server::dispatch(const Message::const_ref &m)
 
   switch (m->get_type()) {
   case CEPH_MSG_CLIENT_SESSION:
-    handle_client_session(boost::static_pointer_cast<MClientSession::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_session(MClientSession::msgref_cast(m));
     return;
   case CEPH_MSG_CLIENT_REQUEST:
-    handle_client_request(boost::static_pointer_cast<MClientRequest::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_client_request(MClientRequest::msgref_cast(m));
     return;
   case MSG_MDS_SLAVE_REQUEST:
-    handle_slave_request(boost::static_pointer_cast<MMDSSlaveRequest::const_ref::element_type, std::remove_reference<decltype(m)>::type::element_type>(m));
+    handle_slave_request(MMDSSlaveRequest::msgref_cast(m));
     return;
   default:
     derr << "server unknown message " << m->get_type() << dendl;
index b0005ff470bbdd2c268464f527024997312cf075..008723c7557edde0a52b8328aa536de30f20398a 100644 (file)
@@ -534,6 +534,13 @@ public:
   typedef boost::intrusive_ptr<T> ref;
   typedef boost::intrusive_ptr<T const> const_ref;
 
+  static auto msgref_cast(typename M::ref const& m) {
+    return boost::static_pointer_cast<typename T::const_ref::element_type, typename std::remove_reference<decltype(m)>::type::element_type>(m);
+  }
+  static auto msgref_cast(typename M::const_ref const& m) {
+    return boost::static_pointer_cast<typename T::ref::element_type, typename std::remove_reference<decltype(m)>::type::element_type>(m);
+  }
+
 protected:
 template<typename... Args>
   MessageSubType(Args&&... args) : M(std::forward<Args>(args)...) {}
@@ -546,6 +553,13 @@ class MessageInstance : public MessageSubType<T, M> {
 public:
   using factory = MessageFactory<T>;
 
+  static auto msgref_cast(typename Message::ref const& m) {
+    return boost::static_pointer_cast<typename T::ref::element_type, typename std::remove_reference<decltype(m)>::type::element_type>(m);
+  }
+  static auto msgref_cast(typename Message::const_ref const& m) {
+    return boost::static_pointer_cast<typename T::const_ref::element_type, typename std::remove_reference<decltype(m)>::type::element_type>(m);
+  }
+
 protected:
 template<typename... Args>
   MessageInstance(Args&&... args) : MessageSubType<T,M>(std::forward<Args>(args)...) {}