]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add "mds traceless replies" debug option
authorGreg Farnum <greg@inktank.com>
Wed, 6 Feb 2013 21:32:53 +0000 (13:32 -0800)
committerGreg Farnum <greg@inktank.com>
Wed, 6 Feb 2013 21:34:02 +0000 (13:34 -0800)
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>
src/common/config_opts.h
src/mds/Server.cc
src/mds/Server.h

index 5e0449e3606ea0b24e49729cc71d99c6d55f39a2..fcd2f8f854094fa8572ce060bb441f2c0336f204 100644 (file)
@@ -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)
index 92f5bf6426838cfe40338f1c1e9c455f14849b3c..8348be7a68ae63cc32d2d5bbb05938584c0c5d45 100644 (file)
@@ -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();
index 79977fc8dd54cf1115b07ce93e854160af97108f..4bf3f8604eb5ec7ed53c751fe95caefe86804899 100644 (file)
@@ -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);