// FIXME: to fetch a snap dentry, we need to get omap key in range
// [(name, last), (name, CEPH_NOSNAP))
- if (!dname.empty() && last == CEPH_NOSNAP) {
+ if (!dname.empty() && last == CEPH_NOSNAP && !g_conf().get_val<bool>("mds_dir_prefetch")) {
dentry_key_t key(last, dname, inode->hash_dentry_name(dname));
fetch_keys({key}, c);
return;
void CDir::fetch_keys(const std::vector<dentry_key_t>& keys, MDSContext *c)
{
- dout(10) << "fetch " << keys.size() << " keys on " << *this << dendl;
+ dout(10) << __func__ << " " << keys.size() << " keys on " << *this << dendl;
ceph_assert(is_auth());
ceph_assert(!is_complete());
for (auto p = omap.rbegin(); p != omap.rend(); ++p, --pos) {
string_snap_t key;
dentry_key_t::decode_helper(p->first, key.name, key.snapid);
- bool touch;
+ bool touch = false;
if (key.snapid == CEPH_NOSNAP) {
if (complete) {
touch = proc_nulls_and_waiters(p->first, key);
}
last_name = std::string_view(p->first.c_str(), key.name.length());
- } else {
- touch = false;
}
CDentry *dn = nullptr;
map<CDir*, pair<bool, std::vector<dentry_key_t> > > fetch_queue;
for (auto& dir : rejoin_undef_dirfrags) {
ceph_assert(dir->get_version() == 0);
- (void)fetch_queue[dir];
+ fetch_queue.emplace(std::piecewise_construct, std::make_tuple(dir), std::make_tuple());
}
- for (auto& in : rejoin_undef_inodes) {
- assert(!in->is_base());
- CDentry *dn = in->get_parent_dn();
- auto& p = fetch_queue[dn->get_dir()];
- if (dn->last != CEPH_NOSNAP) {
- p.first = true;
- p.second.clear();
- } else if (!p.first) {
- p.second.push_back(dn->key());
+ if (g_conf().get_val<bool>("mds_dir_prefetch")) {
+ for (auto& in : rejoin_undef_inodes) {
+ ceph_assert(!in->is_base());
+ ceph_assert(in->get_parent_dir());
+ fetch_queue.emplace(std::piecewise_construct, std::make_tuple(in->get_parent_dir()), std::make_tuple());
}
+ } else {
+ for (auto& in : rejoin_undef_inodes) {
+ assert(!in->is_base());
+ CDentry *dn = in->get_parent_dn();
+ auto& p = fetch_queue[dn->get_dir()];
+
+ if (dn->last != CEPH_NOSNAP) {
+ p.first = true;
+ p.second.clear();
+ } else if (!p.first) {
+ p.second.push_back(dn->key());
+ }
+ }
}
if (fetch_queue.empty())