diff options
author | Anand Avati <avati@gluster.com> | 2011-06-18 03:53:46 +0000 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-06-19 02:16:10 -0700 |
commit | 4c81f6268d254f452b861bcd63608982c3ddb560 (patch) | |
tree | b9bfef7c88905197783d1d45157dfed3295b030b /libglusterfs/src | |
parent | 50001216d26a16736691ab06758049c22e664936 (diff) |
stack: make process state dump more debug friendly
store points of stack wind and unwind (function names) for each
frame and dump them in process state dump
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 1059 (enhancements for getting statistics from performance translators)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1059
Diffstat (limited to 'libglusterfs/src')
-rw-r--r-- | libglusterfs/src/stack.c | 16 | ||||
-rw-r--r-- | libglusterfs/src/stack.h | 14 |
2 files changed, 30 insertions, 0 deletions
diff --git a/libglusterfs/src/stack.c b/libglusterfs/src/stack.c index ebaf814ad..1fccd8813 100644 --- a/libglusterfs/src/stack.c +++ b/libglusterfs/src/stack.c @@ -76,6 +76,22 @@ gf_proc_dump_call_frame (call_frame_t *call_frame, const char *key_buf,...) gf_proc_dump_build_key(key, prefix,"parent"); gf_proc_dump_write(key, "%s", my_frame.parent->this->name); } + if (my_frame.wind_from) { + gf_proc_dump_build_key(key, prefix, "wind_from"); + gf_proc_dump_write(key, "%s", my_frame.wind_from); + } + if (my_frame.wind_to) { + gf_proc_dump_build_key(key, prefix, "wind_to"); + gf_proc_dump_write(key, "%s", my_frame.wind_to); + } + if (my_frame.unwind_from) { + gf_proc_dump_build_key(key, prefix, "unwind_from"); + gf_proc_dump_write(key, "%s", my_frame.unwind_from); + } + if (my_frame.unwind_to) { + gf_proc_dump_build_key(key, prefix, "unwind_to"); + gf_proc_dump_write(key, "%s", my_frame.unwind_to); + } } diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h index 63b14ca46..323c64c66 100644 --- a/libglusterfs/src/stack.h +++ b/libglusterfs/src/stack.h @@ -83,6 +83,10 @@ struct _call_frame_t { glusterfs_fop_t op; struct timeval begin; /* when this frame was created */ struct timeval end; /* when this frame completed */ + const char *wind_from; + const char *wind_to; + const char *unwind_from; + const char *unwind_to; }; struct _call_stack_t { @@ -223,6 +227,9 @@ STACK_DESTROY (call_stack_t *stack) _new->parent = frame; \ _new->cookie = _new; \ LOCK_INIT (&_new->lock); \ + _new->wind_from = __FUNCTION__; \ + _new->wind_to = #fn; \ + _new->unwind_to = #rfn; \ frame->ref_count++; \ old_THIS = THIS; \ THIS = obj; \ @@ -254,6 +261,9 @@ STACK_DESTROY (call_stack_t *stack) _new->parent = frame; \ _new->cookie = cky; \ LOCK_INIT (&_new->lock); \ + _new->wind_from = __FUNCTION__; \ + _new->wind_to = #fn; \ + _new->unwind_to = #rfn; \ frame->ref_count++; \ fn##_cbk = rfn; \ old_THIS = THIS; \ @@ -279,6 +289,7 @@ STACK_DESTROY (call_stack_t *stack) old_THIS = THIS; \ THIS = _parent->this; \ frame->complete = _gf_true; \ + frame->unwind_from = __FUNCTION__; \ fn (_parent, frame->cookie, _parent->this, params); \ THIS = old_THIS; \ } while (0) @@ -301,6 +312,7 @@ STACK_DESTROY (call_stack_t *stack) old_THIS = THIS; \ THIS = _parent->this; \ frame->complete = _gf_true; \ + frame->unwind_from = __FUNCTION__; \ fn (_parent, frame->cookie, _parent->this, params); \ THIS = old_THIS; \ } while (0) @@ -327,6 +339,8 @@ copy_frame (call_frame_t *frame) newstack->gid = oldstack->gid; newstack->pid = oldstack->pid; newstack->ngrps = oldstack->ngrps; + newstack->op = oldstack->op; + newstack->type = oldstack->type; memcpy (newstack->groups, oldstack->groups, sizeof (uint32_t) * GF_REQUEST_MAXGROUPS); newstack->unique = oldstack->unique; |