]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: guarantee message ordering when importing non-auth caps
authorYan, Zheng <zheng.z.yan@intel.com>
Thu, 10 Apr 2014 08:03:51 +0000 (16:03 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Thu, 10 Apr 2014 11:46:56 +0000 (19:46 +0800)
Current code allow importing non-auth caps when inode is being exported.
This can breaks message ordering because the corresponding cap import
messages are sent after the flush session messages. So they can arrive
at clients after clients have already received cap import messages from
new auth MDS of the inode.

The quick fix is ignore MExportCaps when inode is frozen.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Migrator.cc

index 9f0e3d8bc430320b5905ba1e78b858527a80c882..84c0a0e3d29f2d1dcf6b981636f3401c92d7e5c5 100644 (file)
@@ -2993,10 +2993,10 @@ void Migrator::handle_export_caps(MExportCaps *ex)
   
   assert(in);
   assert(in->is_auth());
-  /*
-   * note: i may be frozen, but i won't have been encoded for export (yet)!
-   *  see export_go() vs export_go_synced().
-   */
+
+  // FIXME
+  if (in->is_frozen())
+    return;
 
   C_M_LoggedImportCaps *finish = new C_M_LoggedImportCaps(this, in, ex->get_source().num());
   finish->client_map = ex->client_map;
@@ -3026,6 +3026,8 @@ void Migrator::logged_import_caps(CInode *in,
                                  map<client_t,uint64_t>& sseqmap) 
 {
   dout(10) << "logged_import_caps on " << *in << dendl;
+  // see export_go() vs export_go_synced()
+  assert(in->is_auth());
 
   // force open client sessions and finish cap import
   mds->server->finish_force_open_sessions(client_map, sseqmap);