ceph: additional debugfs output
authorJohn Spray <john.spray@redhat.com>
Fri, 12 Sep 2014 15:58:49 +0000 (16:58 +0100)
committerSage Weil <sage@redhat.com>
Tue, 14 Oct 2014 19:57:01 +0000 (12:57 -0700)
MDS session state and client global ID is
useful instrumentation when testing.

Signed-off-by: John Spray <john.spray@redhat.com>
fs/ceph/debugfs.c
fs/ceph/super.h

index 5a743ac141ab1e745063ba09974c098703c9b5b7..5d5a4c8c8496588c0c749abdb53ebf0b1be2e31e 100644 (file)
@@ -158,10 +158,47 @@ static int dentry_lru_show(struct seq_file *s, void *ptr)
        return 0;
 }
 
+static int mds_sessions_show(struct seq_file *s, void *ptr)
+{
+       struct ceph_fs_client *fsc = s->private;
+       struct ceph_mds_client *mdsc = fsc->mdsc;
+       struct ceph_auth_client *ac = fsc->client->monc.auth;
+       struct ceph_options *opt = fsc->client->options;
+       int mds = -1;
+
+       mutex_lock(&mdsc->mutex);
+
+       /* The 'num' portion of an 'entity name' */
+       seq_printf(s, "global_id %llu\n", ac->global_id);
+
+       /* The -o name mount argument */
+       seq_printf(s, "name \"%s\"\n", opt->name ? opt->name : "");
+
+       /* The list of MDS session rank+state */
+       for (mds = 0; mds < mdsc->max_sessions; mds++) {
+               struct ceph_mds_session *session =
+                       __ceph_lookup_mds_session(mdsc, mds);
+               if (!session) {
+                       continue;
+               }
+               mutex_unlock(&mdsc->mutex);
+               seq_printf(s, "mds.%d %s\n",
+                               session->s_mds,
+                               ceph_session_state_name(session->s_state));
+
+               ceph_put_mds_session(session);
+               mutex_lock(&mdsc->mutex);
+       }
+       mutex_unlock(&mdsc->mutex);
+
+       return 0;
+}
+
 CEPH_DEFINE_SHOW_FUNC(mdsmap_show)
 CEPH_DEFINE_SHOW_FUNC(mdsc_show)
 CEPH_DEFINE_SHOW_FUNC(caps_show)
 CEPH_DEFINE_SHOW_FUNC(dentry_lru_show)
+CEPH_DEFINE_SHOW_FUNC(mds_sessions_show)
 
 
 /*
@@ -193,6 +230,7 @@ void ceph_fs_debugfs_cleanup(struct ceph_fs_client *fsc)
        debugfs_remove(fsc->debugfs_bdi);
        debugfs_remove(fsc->debugfs_congestion_kb);
        debugfs_remove(fsc->debugfs_mdsmap);
+       debugfs_remove(fsc->debugfs_mds_sessions);
        debugfs_remove(fsc->debugfs_caps);
        debugfs_remove(fsc->debugfs_mdsc);
        debugfs_remove(fsc->debugfs_dentry_lru);
@@ -231,6 +269,14 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
        if (!fsc->debugfs_mdsmap)
                goto out;
 
+       fsc->debugfs_mds_sessions = debugfs_create_file("mds_sessions",
+                                       0600,
+                                       fsc->client->debugfs_dir,
+                                       fsc,
+                                       &mds_sessions_show_fops);
+       if (!fsc->debugfs_mds_sessions)
+               goto out;
+
        fsc->debugfs_mdsc = debugfs_create_file("mdsc",
                                                0600,
                                                fsc->client->debugfs_dir,
index f62a09863ff1919780903b04b4db548cad820e76..b82f507979b82acf064da98ef180db8b65014929 100644 (file)
@@ -95,6 +95,7 @@ struct ceph_fs_client {
        struct dentry *debugfs_congestion_kb;
        struct dentry *debugfs_bdi;
        struct dentry *debugfs_mdsc, *debugfs_mdsmap;
+       struct dentry *debugfs_mds_sessions;
 #endif
 
 #ifdef CONFIG_CEPH_FSCACHE