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;
}
} 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 ) );
<< 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.
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;
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]); }
::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);
::encode(no_base_dentry, payload);
::encode(error_dentry, payload);
::encode(dir_auth_hint, payload);
+ ::encode(unsolicited, payload);
::encode(dirs, payload);
::encode(inodes, payload);