}
void MDCache::open_ino(inodeno_t ino, int64_t pool, MDSContext* fin,
- bool want_replica, bool want_xlocked)
+ bool want_replica, bool want_xlocked,
+ vector<inode_backpointer_t> *ancestors_hint,
+ mds_rank_t auth_hint)
{
dout(10) << "open_ino " << ino << " pool " << pool << " want_replica "
<< want_replica << dendl;
info.tid = ++open_ino_last_tid;
info.pool = pool >= 0 ? pool : default_file_layout.pool_id;
info.waiters.push_back(fin);
- if (mds->is_rejoin() &&
- open_file_table.get_ancestors(ino, info.ancestors, info.auth_hint)) {
+ if (auth_hint != MDS_RANK_NONE)
+ info.auth_hint = auth_hint;
+ if (ancestors_hint) {
+ info.ancestors = std::move(*ancestors_hint);
info.fetch_backtrace = false;
info.checking = mds->get_nodeid();
_open_ino_traverse_dir(ino, info, 0);
void kick_open_ino_peers(mds_rank_t who);
void open_ino(inodeno_t ino, int64_t pool, MDSContext *fin,
- bool want_replica=true, bool want_xlocked=false);
+ bool want_replica=true, bool want_xlocked=false,
+ vector<inode_backpointer_t> *ancestors_hint=nullptr,
+ mds_rank_t auth_hint=MDS_RANK_NONE);
void find_ino_peers(inodeno_t ino, MDSContext *c,
mds_rank_t hint=MDS_RANK_NONE, bool path_locked=false);
new C_OnFinisher(c, mds->finisher));
}
-bool OpenFileTable::get_ancestors(inodeno_t ino, vector<inode_backpointer_t>& ancestors,
- mds_rank_t& auth_hint)
+void OpenFileTable::_get_ancestors(const Anchor& parent,
+ vector<inode_backpointer_t>& ancestors,
+ mds_rank_t& auth_hint)
{
- auto p = loaded_anchor_map.find(ino);
- if (p == loaded_anchor_map.end())
- return false;
-
- inodeno_t dirino = p->second.dirino;
- if (dirino == inodeno_t(0))
- return false;
+ inodeno_t dirino = parent.dirino;
+ std::string_view d_name = parent.d_name;
bool first = true;
ancestors.clear();
while (true) {
- ancestors.push_back(inode_backpointer_t(dirino, p->second.d_name, 0));
+ ancestors.push_back(inode_backpointer_t(dirino, string{d_name}, 0));
- p = loaded_anchor_map.find(dirino);
+ auto p = loaded_anchor_map.find(dirino);
if (p == loaded_anchor_map.end())
break;
auth_hint = p->second.auth;
dirino = p->second.dirino;
+ d_name = p->second.d_name;
if (dirino == inodeno_t(0))
break;
first = false;
}
- return true;
}
class C_OFT_OpenInoFinish: public MDSContext {
continue;
num_opening_inodes++;
- mdcache->open_ino(it.first, pool, new C_OFT_OpenInoFinish(this, it.first), false);
+
+ auto fin = new C_OFT_OpenInoFinish(this, it.first);
+ if (it.second.dirino != inodeno_t(0)) {
+ vector<inode_backpointer_t> ancestors;
+ mds_rank_t auth_hint = MDS_RANK_NONE;
+ _get_ancestors(it.second, ancestors, auth_hint);
+ mdcache->open_ino(it.first, pool, fin, false, false, &ancestors, auth_hint);
+ } else {
+ mdcache->open_ino(it.first, pool, fin, false);
+ }
if (!(num_opening_inodes % 1000))
mds->heartbeat_reset();
waiting_for_load.push_back(c);
}
- bool get_ancestors(inodeno_t ino, vector<inode_backpointer_t>& ancestors,
- mds_rank_t& auth_hint);
-
bool prefetch_inodes();
bool is_prefetched() const { return prefetch_state == DONE; }
void wait_for_prefetch(MDSContext *c) {
void _prefetch_inodes();
void _prefetch_dirfrags();
+ void _get_ancestors(const Anchor& parent,
+ vector<inode_backpointer_t>& ancestors,
+ mds_rank_t& auth_hint);
+
MDSRank *mds;
version_t omap_version = 0;