bufferlist &bl,
const int pos,
const std::set<snapid_t> *snaps,
+ double rand_threshold,
bool *force_dirty)
{
auto q = bl.cbegin();
if (in->inode.is_dirty_rstat())
in->mark_dirty_rstat();
- in->maybe_ephemeral_rand(true);
+ in->maybe_ephemeral_rand(true, rand_threshold);
//in->hack_accessed = false;
//in->hack_load_stamp = ceph_clock_now();
//num_new_inodes_loaded++;
}
unsigned pos = omap.size() - 1;
+ double rand_threshold = get_inode()->get_ephemeral_rand();
for (map<string, bufferlist>::reverse_iterator p = omap.rbegin();
p != omap.rend();
++p, --pos) {
try {
dn = _load_dentry(
p->first, dname, last, p->second, pos, snaps,
- &force_dirty);
+ rand_threshold, &force_dirty);
} catch (const buffer::error &err) {
cache->mds->clog->warn() << "Corrupt dentry '" << dname << "' in "
"dir frag " << dirfrag() << ": "
}
}
-void CDir::_go_bad()
-{
- if (get_version() == 0)
- set_version(1);
- state_set(STATE_BADFRAG);
- // mark complete, !fetching
- mark_complete();
- state_clear(STATE_FETCHING);
- auth_unpin(this);
-
- // kick waiters
- finish_waiting(WAIT_COMPLETE, -EIO);
-}
-
void CDir::go_bad_dentry(snapid_t last, std::string_view dname)
{
dout(10) << __func__ << " " << dname << dendl;
ceph_abort(); // unreachable, damaged() respawns us
}
- if (complete)
- _go_bad();
- else
- auth_unpin(this);
+ if (complete) {
+ if (get_version() == 0)
+ set_version(1);
+
+ state_set(STATE_BADFRAG);
+ mark_complete();
+ }
+
+ state_clear(STATE_FETCHING);
+ auth_unpin(this);
+ finish_waiting(WAIT_COMPLETE, -EIO);
}
// -----------------------
op.priority = op_prio;
// don't create new dirfrag blindly
- if (!is_new() && !state_test(CDir::STATE_FRAGMENTING))
+ if (!is_new())
op.stat(NULL, (ceph::real_time*) NULL, NULL);
if (!to_set.empty())
}
};
- if (state_test(CDir::STATE_FRAGMENTING)) {
+ if (state_test(CDir::STATE_FRAGMENTING) && is_new()) {
+ assert(committed_version == 0);
for (auto p = items.begin(); p != items.end(); ) {
CDentry *dn = p->second;
++p;
- if (!dn->is_dirty() && dn->get_linkage()->is_null())
+ if (dn->get_linkage()->is_null())
continue;
write_one(dn);
}
op.priority = op_prio;
// don't create new dirfrag blindly
- if (!is_new() && !state_test(CDir::STATE_FRAGMENTING))
+ if (!is_new())
op.stat(NULL, (ceph::real_time*)NULL, NULL);
/*
}
MEMPOOL_DEFINE_OBJECT_FACTORY(CDir, co_dir, mds_co);
-MEMPOOL_DEFINE_OBJECT_FACTORY(CDir::scrub_info_t, scrub_info_t, mds_co)
\ No newline at end of file
+MEMPOOL_DEFINE_OBJECT_FACTORY(CDir::scrub_info_t, scrub_info_t, mds_co)