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 CInode::maybe_ephemeral_rand(bool fresh)
+void CInode::maybe_ephemeral_rand(bool fresh, double threshold)
{
if (!mdcache->get_export_ephemeral_random_config()) {
dout(15) << __func__ << " config false: cannot ephemeral random pin " << *this << dendl;
return;
}
- double threshold = get_ephemeral_rand();
+ /* not precomputed? */
+ if (threshold < 0.0) {
+ threshold = get_ephemeral_rand();
+ }
+ if (threshold <= 0.0) {
+ return;
+ }
double n = ceph::util::generate_random_number(0.0, 1.0);
dout(15) << __func__ << " rand " << n << " <?= " << threshold
double get_ephemeral_rand(bool inherit=true) const;
void set_ephemeral_rand(bool yes);
- void maybe_ephemeral_rand(bool fresh=false);
+ void maybe_ephemeral_rand(bool fresh=false, double threshold=-1.0);
void setxattr_ephemeral_rand(double prob=0.0);
bool is_ephemeral_rand() const {
return state_test(STATE_RANDEPHEMERALPIN);