summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-02-06 13:32:53 -0800
committerGreg Farnum <greg@inktank.com>2013-02-06 13:34:02 -0800
commit08b82b3ef6b43283e35fd4e56eb5c78651345bea (patch)
tree26746be50815a42a2a7c85f81698af77167a7789
parent9871cf275177d75d095e4341e71df841a4ef9618 (diff)
downloadceph-08b82b3ef6b43283e35fd4e56eb5c78651345bea.tar.gz
mds: add "mds traceless replies" debug option
This option specifies (in the range 0-1) the percentage of modifying operations that should be responded to without including a trace for the dentries. In order to implement it, we add a "modify" parameter to set_trace_dist(), and the callers fill that with mdr->req->may_write(). Signed-off-by: Greg Farnum <greg@inktank.com> Reviewed-by: Sam Lang <sam.lang@inktank.com>
-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);