diff options
Diffstat (limited to 'libglusterfs/src/latency.c')
| -rw-r--r-- | libglusterfs/src/latency.c | 126 |
1 files changed, 51 insertions, 75 deletions
diff --git a/libglusterfs/src/latency.c b/libglusterfs/src/latency.c index d0039a1f730..ce4b0e8255d 100644 --- a/libglusterfs/src/latency.c +++ b/libglusterfs/src/latency.c @@ -8,101 +8,77 @@ cases as published by the Free Software Foundation. */ - /* * This file contains functions to support dumping of * latencies of FOPs broken down by subvolumes. */ -#include "glusterfs.h" -#include "stack.h" -#include "xlator.h" -#include "common-utils.h" -#include "statedump.h" -#include "libglusterfs-messages.h" +#include "glusterfs/glusterfs.h" +#include "glusterfs/statedump.h" -void -gf_update_latency (call_frame_t *frame) +gf_latency_t * +gf_latency_new(size_t n) { - double elapsed; - struct timespec *begin, *end; - - fop_latency_t *lat; - - begin = &frame->begin; - end = &frame->end; - - if (!(begin->tv_sec && end->tv_sec)) - goto out; - - elapsed = (end->tv_sec - begin->tv_sec) * 1e9 - + (end->tv_nsec - begin->tv_nsec); + int i = 0; + gf_latency_t *lat = NULL; - /* Can happen mostly at initiator xlator, as STACK_WIND/UNWIND macros - set it right anyways for those frames */ - if (!frame->op) - frame->op = frame->root->op; + lat = GF_MALLOC(n * sizeof(*lat), gf_common_mt_latency_t); + if (!lat) + return NULL; - lat = &frame->this->stats.interval.latencies[frame->op]; - - if (lat->max < elapsed) - lat->max = elapsed; - - if (lat->min > elapsed) - lat->min = elapsed; - - lat->total += elapsed; - lat->count++; -out: - return; + for (i = 0; i < n; i++) { + gf_latency_reset(lat + i); + } + return lat; } - void -gf_proc_dump_latency_info (xlator_t *xl) +gf_latency_update(gf_latency_t *lat, struct timespec *begin, + struct timespec *end) { - char key_prefix[GF_DUMP_MAX_BUF_LEN]; - char key[GF_DUMP_MAX_BUF_LEN]; - int i; - - snprintf (key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.latency", xl->name); - gf_proc_dump_add_section (key_prefix); - - for (i = 0; i < GF_FOP_MAXVALUE; i++) { - gf_proc_dump_build_key (key, key_prefix, "%s", - (char *)gf_fop_list[i]); - - fop_latency_t *lat = &xl->stats.interval.latencies[i]; + if (!(begin->tv_sec && end->tv_sec)) { + /*Measure latency might have been enabled/disabled during the op*/ + return; + } - /* Doesn't make sense to continue if there are no fops - came in the given interval */ - if (!lat->count) - continue; + double elapsed = gf_tsdiff(begin, end); - gf_proc_dump_write (key, "%.03f,%"PRId64",%.03f", - (lat->total / lat->count), lat->count, - lat->total); - } + if (lat->max < elapsed) + lat->max = elapsed; - memset (xl->stats.interval.latencies, 0, - sizeof (xl->stats.interval.latencies)); + if (lat->min > elapsed) + lat->min = elapsed; - /* make sure 'min' is set to high value, so it would be - properly set later */ - for (i = 0; i < GF_FOP_MAXVALUE; i++) { - xl->stats.interval.latencies[i].min = 0xffffffff; - } + lat->total += elapsed; + lat->count++; } +void +gf_latency_reset(gf_latency_t *lat) +{ + if (!lat) + return; + memset(lat, 0, sizeof(*lat)); + lat->min = ULLONG_MAX; + /* make sure 'min' is set to high value, so it would be + properly set later */ +} void -gf_latency_toggle (int signum, glusterfs_ctx_t *ctx) +gf_frame_latency_update(call_frame_t *frame) { - if (ctx) { - ctx->measure_latency = !ctx->measure_latency; - gf_msg ("[core]", GF_LOG_INFO, 0, - LG_MSG_LATENCY_MEASUREMENT_STATE, - "Latency measurement turned %s", - ctx->measure_latency ? "on" : "off"); - } + gf_latency_t *lat; + /* Can happen mostly at initiator xlator, as STACK_WIND/UNWIND macros + set it right anyways for those frames */ + if (!frame->op) + frame->op = frame->root->op; + + if (frame->op < 0 || frame->op >= GF_FOP_MAXVALUE) { + gf_log("[core]", GF_LOG_WARNING, "Invalid frame op value: %d", + frame->op); + return; + } + + lat = &frame->this->stats.interval.latencies[frame->op]; + gf_latency_update(lat, &frame->begin, &frame->end); } |
