]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: mark replication messages unsolicited to avoid confusing discover reply handler
authorSage Weil <sage@newdream.net>
Mon, 12 May 2008 21:47:32 +0000 (14:47 -0700)
committerSage Weil <sage@newdream.net>
Mon, 12 May 2008 21:47:32 +0000 (14:47 -0700)
src/mds/MDCache.cc
src/messages/MDiscoverReply.h

index 0eea6d384d29cd1ffb886902897b5204735ea4c3..be22af1f67170c35ee30e69e65fbc505bb3abd24 100644 (file)
@@ -3884,8 +3884,8 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req,     // who
     else if (MDS_INO_IS_STRAY(origpath.get_ino())) 
       open_foreign_stray(origpath.get_ino() - MDS_INO_STRAY_OFFSET, _get_waiter(mdr, req));
     else {
-      assert(0);  // hrm.. broken
-      return -EIO;
+      //assert(0);  // hrm.. broken
+      return -ESTALE;
     }
     return 1;
   }
@@ -4059,6 +4059,7 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req,     // who
          } else {
            dout(10) << "traverse: REP replicating to " << req->get_source() << " dn " << *dn << dendl;
            MDiscoverReply *reply = new MDiscoverReply(curdir->dirfrag());
+           reply->mark_unsolicited();
            reply->add_dentry( dn->replicate_to( from ) );
            if (dn->is_primary())
              reply->add_inode( dn->inode->replicate_to( from ) );
@@ -5499,16 +5500,18 @@ void MDCache::handle_discover_reply(MDiscoverReply *m)
           << dendl;
   
   // decrement discover counters
-  if (m->get_wanted_base_dir()) {
-    inodeno_t ino = m->get_base_ino();
-    assert(discover_dir[from].count(ino));
-    if (--discover_dir[from][ino] == 0)
-      discover_dir[from].erase(ino);
-  } else if (m->get_base_ino() >= MDS_INO_BASE) {
-    dirfrag_t df(m->get_base_ino(), m->get_base_dir_frag());
-    assert(discover_dir_sub[from].count(df));
-    if (--discover_dir_sub[from][df] == 0)
-      discover_dir_sub[from].erase(df);
+  if (!m->is_unsolicited()) {
+    if (m->get_wanted_base_dir()) {
+      inodeno_t ino = m->get_base_ino();
+      assert(discover_dir[from].count(ino));
+      if (--discover_dir[from][ino] == 0)
+       discover_dir[from].erase(ino);
+    } else if (m->get_base_ino() >= MDS_INO_BASE) {
+      dirfrag_t df(m->get_base_ino(), m->get_base_dir_frag());
+      assert(discover_dir_sub[from].count(df));
+      if (--discover_dir_sub[from][df] == 0)
+       discover_dir_sub[from].erase(df);
+    }
   }
 
   // loop over discover results.
index acd4284cfdf03521837dcee1dc8662f01e761974..1426c35f78930bd96d9db434d954aadc9ede8948 100644 (file)
@@ -83,6 +83,7 @@ class MDiscoverReply : public Message {
   bool no_base_dir;     // no base dir (but IS dentry+inode)
   bool no_base_dentry;  // no base dentry (but IS inode)
   string error_dentry;   // dentry that was not found (to trigger waiters on asker)
+  bool unsolicited;
 
   __s32 dir_auth_hint;
 
@@ -124,6 +125,8 @@ class MDiscoverReply : public Message {
 
   int get_dir_auth_hint() { return dir_auth_hint; }
 
+  bool is_unsolicited() { return unsolicited; }
+  void mark_unsolicited() { unsolicited = true; }
 
   // these index _arguments_ are aligned to each ([[dir, ] dentry, ] inode) set.
   CInodeDiscover& get_inode(int n) { return *(inodes[n]); }
@@ -231,7 +234,8 @@ class MDiscoverReply : public Message {
     ::decode(no_base_dentry, p);
     ::decode(error_dentry, p);
     ::decode(dir_auth_hint, p);
-    
+    ::decode(unsolicited, p);
+
     ::decode(dirs, p);
     ::decode(inodes, p);
     ::decode(dentries, p);
@@ -248,6 +252,7 @@ class MDiscoverReply : public Message {
     ::encode(no_base_dentry, payload);
     ::encode(error_dentry, payload);
     ::encode(dir_auth_hint, payload);
+    ::encode(unsolicited, payload);
 
     ::encode(dirs, payload);
     ::encode(inodes, payload);