From 7096b6de8571401e73468f697817e40a34b7473d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 12 May 2008 14:47:32 -0700 Subject: [PATCH] mds: mark replication messages unsolicited to avoid confusing discover reply handler --- src/mds/MDCache.cc | 27 +++++++++++++++------------ src/messages/MDiscoverReply.h | 7 ++++++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0eea6d384d29c..be22af1f67170 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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. diff --git a/src/messages/MDiscoverReply.h b/src/messages/MDiscoverReply.h index acd4284cfdf03..1426c35f78930 100644 --- a/src/messages/MDiscoverReply.h +++ b/src/messages/MDiscoverReply.h @@ -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); -- 2.39.5