diff options
author | Greg Farnum <greg@inktank.com> | 2013-02-06 13:32:53 -0800 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-02-06 13:34:02 -0800 |
commit | 08b82b3ef6b43283e35fd4e56eb5c78651345bea (patch) | |
tree | 26746be50815a42a2a7c85f81698af77167a7789 | |
parent | 9871cf275177d75d095e4341e71df841a4ef9618 (diff) | |
download | ceph-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.h | 2 | ||||
-rw-r--r-- | src/mds/Server.cc | 15 | ||||
-rw-r--r-- | src/mds/Server.h | 2 |
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); |