From: Greg Farnum Date: Wed, 6 Feb 2013 21:32:53 +0000 (-0800) Subject: mds: add "mds traceless replies" debug option X-Git-Tag: v0.58~134 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=08b82b3ef6b43283e35fd4e56eb5c78651345bea;p=ceph.git 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 Reviewed-by: Sam Lang --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 5e0449e3606e..fcd2f8f85409 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 92f5bf642683..8348be7a68ae 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 79977fc8dd54..4bf3f8604eb5 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);