diff options
-rw-r--r-- | libglusterfs/src/fd.c | 7 | ||||
-rw-r--r-- | libglusterfs/src/statedump.c | 14 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.c | 103 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.h | 3 |
4 files changed, 98 insertions, 29 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 246539b75..03e8f9394 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -960,6 +960,13 @@ fd_dump (fd_t *fd, char *prefix) gf_proc_dump_write("pid", "%llu", fd->pid); gf_proc_dump_write("refcount", "%d", fd->refcount); gf_proc_dump_write("flags", "%d", fd->flags); + + if (fd->inode) { + gf_proc_dump_build_key (key, "inode", NULL); + gf_proc_dump_add_section(key); + inode_dump (fd->inode, key); + } + } diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 8eac72872..8e7e905fb 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -435,8 +435,6 @@ gf_proc_dump_xlator_info (xlator_t *top) (trav->itable)) { snprintf (itable_key, 1024, "%d.%s.itable", ctx->graph_id, trav->name); - - inode_table_dump (trav->itable, itable_key); } if (!trav->dumpops) { @@ -470,24 +468,20 @@ static void gf_proc_dump_oldgraph_xlator_info (xlator_t *top) { xlator_t *trav = NULL; - glusterfs_ctx_t *ctx = NULL; - char itable_key[1024] = {0,}; if (!top) return; - ctx = top->ctx; - trav = top; while (trav) { gf_proc_dump_xlator_mem_info_only_in_use (trav); if (GF_PROC_DUMP_IS_XL_OPTION_ENABLED (inode) && (trav->itable)) { - snprintf (itable_key, 1024, "%d.%s.itable", - ctx->graph_id, trav->name); - - inode_table_dump (trav->itable, itable_key); + /*TODO: dump inode table info if necessary by + printing the graph id (taken by glusterfs_cbtx_t) + in the key + */ } if (!trav->dumpops) { diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 9b1bd7cf5..908f62a7b 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -297,6 +297,81 @@ out: return ret; } +void +ltable_dump (server_connection_t *trav) +{ + char key[GF_DUMP_MAX_BUF_LEN] = {0,}; + struct _locker *locker = NULL; + char locker_data[GF_MAX_LOCK_OWNER_LEN] = {0,}; + int count = 0; + + gf_proc_dump_build_key(key, + "conn","bound_xl.ltable.inodelk.%s", + trav->bound_xl?trav->bound_xl->name:""); + gf_proc_dump_add_section(key); + + list_for_each_entry (locker, &trav->ltable->inodelk_lockers, lockers) { + count++; + gf_proc_dump_write("volume", "%s", locker->volume); + if (locker->fd) { + gf_proc_dump_write("fd", "%p", locker->fd); + gf_proc_dump_write("gfid", "%s", + uuid_utoa (locker->fd->inode->gfid)); + } else { + gf_proc_dump_write("fd", "%s", locker->loc.path); + gf_proc_dump_write("gfid", "%s", + uuid_utoa (locker->loc.inode->gfid)); + } + gf_proc_dump_write("pid", "%d", locker->pid); + gf_proc_dump_write("lock length", "%d", locker->owner.len); + lkowner_unparse (&locker->owner, locker_data, + locker->owner.len); + gf_proc_dump_write("lock owner", "%s", locker_data); + memset (locker_data, 0, sizeof (locker_data)); + + gf_proc_dump_build_key (key, "inode", "%d", count); + gf_proc_dump_add_section (key); + if (locker->fd) + inode_dump (locker->fd->inode, key); + else + inode_dump (locker->loc.inode, key); + } + + count = 0; + locker = NULL; + gf_proc_dump_build_key(key, + "conn","bound_xl.ltable.entrylk.%s", + trav->bound_xl?trav->bound_xl->name:""); + gf_proc_dump_add_section(key); + + list_for_each_entry (locker, &trav->ltable->entrylk_lockers, + lockers) { + count++; + gf_proc_dump_write("volume", "%s", locker->volume); + if (locker->fd) { + gf_proc_dump_write("fd", "%p", locker->fd); + gf_proc_dump_write("gfid", "%s", + uuid_utoa (locker->fd->inode->gfid)); + } else { + gf_proc_dump_write("fd", "%s", locker->loc.path); + gf_proc_dump_write("gfid", "%s", + uuid_utoa (locker->loc.inode->gfid)); + } + gf_proc_dump_write("pid", "%d", locker->pid); + gf_proc_dump_write("lock length", "%d", locker->owner.len); + lkowner_unparse (&locker->owner, locker_data, locker->owner.len); + gf_proc_dump_write("lock data", "%s", locker_data); + memset (locker_data, 0, sizeof (locker_data)); + + gf_proc_dump_build_key (key, "inode", "%d", count); + gf_proc_dump_add_section (key); + if (locker->fd) + inode_dump (locker->fd->inode, key); + else + inode_dump (locker->loc.inode, key); + } +} + int server_priv_to_dict (xlator_t *this, dict_t *dict) { @@ -461,7 +536,6 @@ server_inode (xlator_t *this) char key[GF_DUMP_MAX_BUF_LEN]; int i = 1; int ret = -1; - xlator_t *prev_bound_xl = NULL; GF_VALIDATE_OR_GOTO ("server", this, out); @@ -477,31 +551,24 @@ server_inode (xlator_t *this) goto out; list_for_each_entry (trav, &conf->conns, list) { - if (trav->bound_xl && trav->bound_xl->itable) { - /* Presently every brick contains only one - * bound_xl for all connections. This will lead - * to duplicating of the inode lists, if listing - * is done for every connection. This simple check - * prevents duplication in the present case. If - * need arises the check can be improved. - */ - if (trav->bound_xl == prev_bound_xl) - continue; - prev_bound_xl = trav->bound_xl; - + ret = pthread_mutex_trylock (&trav->lock); + if (!ret) + { gf_proc_dump_build_key(key, - "conn","%d.bound_xl.%s", - i, trav->bound_xl->name); - inode_table_dump(trav->bound_xl->itable,key); + "conn","%d.ltable", i); + gf_proc_dump_add_section(key); + ltable_dump (trav); i++; - } + pthread_mutex_unlock (&trav->lock); + }else + continue; } pthread_mutex_unlock (&conf->mutex); ret = 0; out: if (ret) - gf_proc_dump_write ("Unable to dump the inode table", + gf_proc_dump_write ("Unable to dump the lock table", "(Lock acquisition failed) %s", this?this->name:"server"); diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h index f3b97891a..750196e1b 100644 --- a/xlators/protocol/server/src/server.h +++ b/xlators/protocol/server/src/server.h @@ -54,7 +54,6 @@ struct _locker { struct _lock_table { struct list_head inodelk_lockers; struct list_head entrylk_lockers; - size_t count; }; /* private structure per connection (transport object) @@ -214,4 +213,6 @@ server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg, int gf_server_check_setxattr_cmd (call_frame_t *frame, dict_t *dict); int gf_server_check_getxattr_cmd (call_frame_t *frame, const char *name); +void ltable_dump (server_connection_t *conn); + #endif /* !_SERVER_H */ |