]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add source/dest information to EImportStart/EExport
authorYan, Zheng <zyan@redhat.com>
Tue, 9 May 2017 09:14:34 +0000 (17:14 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 11 May 2017 06:13:24 +0000 (14:13 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/Migrator.cc
src/mds/events/EExport.h
src/mds/events/EImportStart.h
src/mds/journal.cc

index f15e7d03c3deca235f4cb034ba0457a44c719429..bc20ad6796817034a91c9662e183a05aabe6b032 100644 (file)
@@ -1691,7 +1691,7 @@ void Migrator::handle_export_ack(MExportDirAck *m)
 
   // log completion. 
   //  include export bounds, to ensure they're in the journal.
-  EExport *le = new EExport(mds->mdlog, dir);
+  EExport *le = new EExport(mds->mdlog, dir, it->second.peer);;
   mds->mdlog->start_entry(le);
 
   le->metablob.add_dir_context(dir, EMetaBlob::TO_ROOT);
@@ -2160,6 +2160,7 @@ void Migrator::handle_export_prep(MExportDirPrep *m)
   if (!m->did_assim()) {
     assert(it != import_state.end());
     assert(it->second.state == IMPORT_DISCOVERED);
+    assert(it->second.peer == oldauth);
     diri = cache->get_inode(m->get_dirfrag().ino);
     assert(diri);
     bufferlist::iterator p = m->basedir.begin();
@@ -2174,6 +2175,7 @@ void Migrator::handle_export_prep(MExportDirPrep *m)
       return;
     }
     assert(it->second.state == IMPORT_PREPPING);
+    assert(it->second.peer == oldauth);
 
     dir = cache->get_dirfrag(m->get_dirfrag());
     assert(dir);
@@ -2366,27 +2368,29 @@ void Migrator::handle_export_dir(MExportDir *m)
   assert (g_conf->mds_kill_import_at != 5);
   CDir *dir = cache->get_dirfrag(m->dirfrag);
   assert(dir);
+
+  mds_rank_t oldauth = mds_rank_t(m->get_source().num());
+  dout(7) << "handle_export_dir importing " << *dir << " from " << oldauth << dendl;
+
+  assert(!dir->is_auth());
   
   map<dirfrag_t,import_state_t>::iterator it = import_state.find(m->dirfrag);
   assert(it != import_state.end());
   assert(it->second.state == IMPORT_PREPPED);
   assert(it->second.tid == m->get_tid());
+  assert(it->second.peer == oldauth);
 
   utime_t now = ceph_clock_now();
-  mds_rank_t oldauth = mds_rank_t(m->get_source().num());
-  dout(7) << "handle_export_dir importing " << *dir << " from " << oldauth << dendl;
-  assert(dir->is_auth() == false);
 
   if (!dir->get_inode()->dirfragtree.is_leaf(dir->get_frag()))
     dir->get_inode()->dirfragtree.force_to_leaf(g_ceph_context, dir->get_frag());
 
   cache->show_subtrees();
 
-  C_MDS_ImportDirLoggedStart *onlogged = new C_MDS_ImportDirLoggedStart(
-      this, dir, mds_rank_t(m->get_source().num()));
+  C_MDS_ImportDirLoggedStart *onlogged = new C_MDS_ImportDirLoggedStart(this, dir, oldauth);
 
   // start the journal entry
-  EImportStart *le = new EImportStart(mds->mdlog, dir->dirfrag(), m->bounds);
+  EImportStart *le = new EImportStart(mds->mdlog, dir->dirfrag(), m->bounds, oldauth);
   mds->mdlog->start_entry(le);
 
   le->metablob.add_dir_context(dir);
index 6021240129e13a91239f95e04c4fa28d138194ec..9c53c447a909da97ce4d07f1271eb84d673bb314 100644 (file)
@@ -29,17 +29,19 @@ public:
 protected:
   dirfrag_t      base;
   set<dirfrag_t> bounds;
+  mds_rank_t target;
   
 public:
-  EExport() : LogEvent(EVENT_EXPORT) { }
-  EExport(MDLog *mdlog, CDir *dir) : 
+  EExport() :
+    LogEvent(EVENT_EXPORT), target(MDS_RANK_NONE) { }
+  EExport(MDLog *mdlog, CDir *dir, mds_rank_t t) :
     LogEvent(EVENT_EXPORT), metablob(mdlog),
-    base(dir->dirfrag()) { }
+    base(dir->dirfrag()), target(t) { }
   
   set<dirfrag_t> &get_bounds() { return bounds; }
   
   void print(ostream& out) const override {
-    out << "EExport " << base << " " << metablob;
+    out << "EExport " << base << " to mds." << target << " " << metablob;
   }
 
   EMetaBlob *get_metablob() override { return &metablob; }
index 36f07b4510f953eae877e2a91e99f47738c3a026..9d446b629e187e6eb271ce2c7e063c3427b6c0aa 100644 (file)
@@ -28,21 +28,21 @@ class EImportStart : public LogEvent {
 protected:
   dirfrag_t base;
   vector<dirfrag_t> bounds;
+  mds_rank_t from;
 
- public:
+public:
   EMetaBlob metablob;
   bufferlist client_map;  // encoded map<__u32,entity_inst_t>
   version_t cmapv;
 
-  EImportStart(MDLog *log,
-              dirfrag_t di,
-              vector<dirfrag_t>& b) : LogEvent(EVENT_IMPORTSTART), 
-                                      base(di), bounds(b),
-                                      metablob(log) { }
-  EImportStart() : LogEvent(EVENT_IMPORTSTART) { }
+  EImportStart(MDLog *log, dirfrag_t di, vector<dirfrag_t>& b, mds_rank_t f) :
+    LogEvent(EVENT_IMPORTSTART),
+    base(di), bounds(b), from(f), metablob(log) { }
+  EImportStart() :
+    LogEvent(EVENT_IMPORTSTART), from(MDS_RANK_NONE) { }
   
   void print(ostream& out) const override {
-    out << "EImportStart " << base << " " << metablob;
+    out << "EImportStart " << base << " from mds." << from << " " << metablob;
   }
 
   EMetaBlob *get_metablob() override { return &metablob; }
index dfb4b03ffa8763b8d5825bf26f6eff87721e51c6..9af81f035d6959f59a7d9750a52c35900b723048 100644 (file)
@@ -2872,11 +2872,12 @@ void EExport::replay(MDSRank *mds)
 
 void EExport::encode(bufferlist& bl, uint64_t features) const
 {
-  ENCODE_START(3, 3, bl);
+  ENCODE_START(4, 3, bl);
   ::encode(stamp, bl);
   ::encode(metablob, bl, features);
   ::encode(base, bl);
   ::encode(bounds, bl);
+  ::encode(target, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -2888,6 +2889,8 @@ void EExport::decode(bufferlist::iterator &bl)
   ::decode(metablob, bl);
   ::decode(base, bl);
   ::decode(bounds, bl);
+  if (struct_v >= 4)
+    ::decode(target, bl);
   DECODE_FINISH(bl);
 }
 
@@ -2966,13 +2969,14 @@ void EImportStart::replay(MDSRank *mds)
 }
 
 void EImportStart::encode(bufferlist &bl, uint64_t features) const {
-  ENCODE_START(3, 3, bl);
+  ENCODE_START(4, 3, bl);
   ::encode(stamp, bl);
   ::encode(base, bl);
   ::encode(metablob, bl, features);
   ::encode(bounds, bl);
   ::encode(cmapv, bl);
   ::encode(client_map, bl);
+  ::encode(from, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -2985,6 +2989,8 @@ void EImportStart::decode(bufferlist::iterator &bl) {
   ::decode(bounds, bl);
   ::decode(cmapv, bl);
   ::decode(client_map, bl);
+  if (struct_v >= 4)
+    ::decode(from, bl);
   DECODE_FINISH(bl);
 }