summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/config_opts.h2
-rw-r--r--src/mds/Server.cc15
-rw-r--r--src/mds/Server.h2
3 files changed, 15 insertions, 4 deletions
diff --git a/src/common/config_opts.h b/src/common/config_opts.h
index 5e0449e3606..fcd2f8f8540 100644
--- a/src/common/config_opts.h
+++ b/src/common/config_opts.h
@@ -276,6 +276,8 @@ OPTION(mds_kill_export_at, OPT_INT, 0)
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)
diff --git a/src/mds/Server.cc b/src/mds/Server.cc
index 92f5bf64268..8348be7a68a 100644
--- a/src/mds/Server.cc
+++ b/src/mds/Server.cc
@@ -837,7 +837,7 @@ void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
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);
@@ -918,7 +918,8 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei,
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());
}
}
@@ -975,8 +976,16 @@ void Server::encode_null_lease(bufferlist& bl)
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();
diff --git a/src/mds/Server.h b/src/mds/Server.h
index 79977fc8dd5..4bf3f8604eb 100644
--- a/src/mds/Server.h
+++ b/src/mds/Server.h
@@ -103,7 +103,7 @@ public:
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);