OPTION(mds_kill_import_at, OPT_INT, 0)
OPTION(mds_kill_link_at, OPT_INT, 0)
OPTION(mds_kill_rename_at, OPT_INT, 0)
+OPTION(mds_traceless_replies, OPT_DOUBLE, 0) /* [0-1] amount of time MDS
+ should skip sending the client a trace */
OPTION(mds_wipe_sessions, OPT_BOOL, 0)
OPTION(mds_wipe_ino_prealloc, OPT_BOOL, 0)
OPTION(mds_skip_ino, OPT_INT, 0)
mdr->cap_releases.erase(tracedn->get_dir()->get_inode()->vino());
set_trace_dist(mdr->session, reply, tracei, tracedn, mdr->snapid,
- mdr->client_request->get_dentry_wanted());
+ mdr->client_request->get_dentry_wanted(), req->may_write());
}
reply->set_extra_bl(mdr->reply_extra_bl);
mdcache->try_reconnect_cap(tracei, session);
} else {
// include metadata in reply
- set_trace_dist(session, reply, tracei, tracedn, snapid, dentry_wanted);
+ set_trace_dist(session, reply, tracei, tracedn,
+ snapid, dentry_wanted, req->may_write());
}
}
void Server::set_trace_dist(Session *session, MClientReply *reply,
CInode *in, CDentry *dn,
snapid_t snapid,
- int dentry_wanted)
+ int dentry_wanted,
+ bool modified)
{
+ // skip doing this for debugging purposes?
+ if (modified && g_conf->mds_traceless_replies &&
+ (rand() % 10000 < g_conf->mds_traceless_replies * 10000.0)) {
+ dout(5) << "deliberately skipping trace for " << *reply << dendl;
+ return;
+ }
+
// inode, dentry, dir, ..., inode
bufferlist bl;
int whoami = mds->get_nodeid();
void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
snapid_t snapid,
- int num_dentries_wanted);
+ int num_dentries_wanted, bool modified);
void encode_empty_dirstat(bufferlist& bl);
void encode_infinite_lease(bufferlist& bl);