diff options
Diffstat (limited to 'xlators/debug')
| -rw-r--r-- | xlators/debug/delay-gen/src/delay-gen-mem-types.h | 2 | ||||
| -rw-r--r-- | xlators/debug/delay-gen/src/delay-gen-messages.h | 2 | ||||
| -rw-r--r-- | xlators/debug/delay-gen/src/delay-gen.c | 19 | ||||
| -rw-r--r-- | xlators/debug/delay-gen/src/delay-gen.h | 6 | ||||
| -rw-r--r-- | xlators/debug/error-gen/src/error-gen-mem-types.h | 2 | ||||
| -rw-r--r-- | xlators/debug/error-gen/src/error-gen.c | 86 | ||||
| -rw-r--r-- | xlators/debug/error-gen/src/error-gen.h | 1 | ||||
| -rw-r--r-- | xlators/debug/io-stats/src/io-stats-mem-types.h | 2 | ||||
| -rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 450 | ||||
| -rw-r--r-- | xlators/debug/sink/src/sink.c | 16 | ||||
| -rw-r--r-- | xlators/debug/trace/src/trace-mem-types.h | 2 | ||||
| -rw-r--r-- | xlators/debug/trace/src/trace.c | 42 | ||||
| -rw-r--r-- | xlators/debug/trace/src/trace.h | 18 |
13 files changed, 403 insertions, 245 deletions
diff --git a/xlators/debug/delay-gen/src/delay-gen-mem-types.h b/xlators/debug/delay-gen/src/delay-gen-mem-types.h index 63a15a70da3..c89a9217193 100644 --- a/xlators/debug/delay-gen/src/delay-gen-mem-types.h +++ b/xlators/debug/delay-gen/src/delay-gen-mem-types.h @@ -11,7 +11,7 @@ #ifndef __DELAY_GEN_MEM_TYPES_H__ #define __DELAY_GEN_MEM_TYPES_H__ -#include "mem-types.h" +#include <glusterfs/mem-types.h> enum gf_delay_gen_mem_types_ { gf_delay_gen_mt_dg_t = gf_common_mt_end + 1, diff --git a/xlators/debug/delay-gen/src/delay-gen-messages.h b/xlators/debug/delay-gen/src/delay-gen-messages.h index a9046ca14bf..bc98cec2885 100644 --- a/xlators/debug/delay-gen/src/delay-gen-messages.h +++ b/xlators/debug/delay-gen/src/delay-gen-messages.h @@ -11,7 +11,7 @@ #ifndef __DELAY_GEN_MESSAGES_H__ #define __DELAY_GEN_MESSAGES_H__ -#include "glfs-message-id.h" +#include <glusterfs/glfs-message-id.h> /* To add new message IDs, append new identifiers at the end of the list. * diff --git a/xlators/debug/delay-gen/src/delay-gen.c b/xlators/debug/delay-gen/src/delay-gen.c index a2d02527f23..4698f1fd785 100644 --- a/xlators/debug/delay-gen/src/delay-gen.c +++ b/xlators/debug/delay-gen/src/delay-gen.c @@ -27,7 +27,7 @@ delay_gen(xlator_t *this, int fop) return 0; if ((rand() % DELAY_GRANULARITY) < dg->delay_ppm) - usleep(dg->delay_duration); + gf_nanosleep(dg->delay_duration * GF_US_IN_NS); return 0; } @@ -679,4 +679,19 @@ struct volume_options options[] = { .default_value = "", }, - {.key = {NULL}}}; + {.key = {NULL}}, +}; + +xlator_api_t xlator_api = { + .init = init, + .fini = fini, + .notify = notify, + .reconfigure = reconfigure, + .mem_acct_init = mem_acct_init, + .op_version = {GD_OP_VERSION_3_12_0}, + .fops = &fops, + .cbks = &cbks, + .options = options, + .identifier = "delay-gen", + .category = GF_TECH_PREVIEW, +}; diff --git a/xlators/debug/delay-gen/src/delay-gen.h b/xlators/debug/delay-gen/src/delay-gen.h index 5e4d179f0b4..afa95e5eb2d 100644 --- a/xlators/debug/delay-gen/src/delay-gen.h +++ b/xlators/debug/delay-gen/src/delay-gen.h @@ -13,9 +13,9 @@ #include "delay-gen-mem-types.h" #include "delay-gen-messages.h" -#include "glusterfs.h" -#include "xlator.h" -#include "defaults.h" +#include <glusterfs/glusterfs.h> +#include <glusterfs/xlator.h> +#include <glusterfs/defaults.h> typedef struct { int enable[GF_FOP_MAXVALUE]; diff --git a/xlators/debug/error-gen/src/error-gen-mem-types.h b/xlators/debug/error-gen/src/error-gen-mem-types.h index 2facd6b27cb..b9b713af8fc 100644 --- a/xlators/debug/error-gen/src/error-gen-mem-types.h +++ b/xlators/debug/error-gen/src/error-gen-mem-types.h @@ -11,7 +11,7 @@ #ifndef __ERROR_GEN_MEM_TYPES_H__ #define __ERROR_GEN_MEM_TYPES_H__ -#include "mem-types.h" +#include <glusterfs/mem-types.h> enum gf_error_gen_mem_types_ { gf_error_gen_mt_eg_t = gf_common_mt_end + 1, diff --git a/xlators/debug/error-gen/src/error-gen.c b/xlators/debug/error-gen/src/error-gen.c index c6595b4c0e4..d45655ef4c3 100644 --- a/xlators/debug/error-gen/src/error-gen.c +++ b/xlators/debug/error-gen/src/error-gen.c @@ -7,10 +7,10 @@ later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ -#include "xlator.h" +#include <glusterfs/xlator.h> #include "error-gen.h" -#include "statedump.h" -#include "defaults.h" +#include <glusterfs/statedump.h> +#include <glusterfs/defaults.h> /* * The user can specify an error probability as a float percentage, but we @@ -31,9 +31,9 @@ sys_error_t error_no_list[] = { [GF_FOP_LOOKUP] = {.error_no_count = 4, .error_no = {ENOENT, ENOTDIR, ENAMETOOLONG, EAGAIN}}, - [GF_FOP_STAT] = {.error_no_count = 7, - .error_no = {EACCES, EBADF, EFAULT, ENAMETOOLONG, ENOENT, - ENOMEM, ENOTDIR}}, + [GF_FOP_STAT] = {.error_no_count = 6, + .error_no = {EACCES, EFAULT, ENAMETOOLONG, ENOENT, ENOMEM, + ENOTDIR}}, [GF_FOP_READLINK] = {.error_no_count = 8, .error_no = {EACCES, EFAULT, EINVAL, EIO, ENAMETOOLONG, ENOENT, ENOMEM, ENOTDIR}}, @@ -79,21 +79,20 @@ sys_error_t error_no_list[] = { [GF_FOP_WRITE] = {.error_no_count = 7, .error_no = {EINVAL, EBADF, EFAULT, EISDIR, ENAMETOOLONG, ENOSPC, GF_ERROR_SHORT_WRITE}}, - [GF_FOP_STATFS] = {.error_no_count = 10, - .error_no = {EACCES, EBADF, EFAULT, EINTR, EIO, - ENAMETOOLONG, ENOENT, ENOMEM, ENOSYS, - ENOTDIR}}, + [GF_FOP_STATFS] = {.error_no_count = 9, + .error_no = {EACCES, EFAULT, EINTR, EIO, ENAMETOOLONG, + ENOENT, ENOMEM, ENOSYS, ENOTDIR}}, [GF_FOP_FLUSH] = {.error_no_count = 5, .error_no = {EACCES, EFAULT, ENAMETOOLONG, ENOSYS, ENOENT}}, [GF_FOP_FSYNC] = {.error_no_count = 4, .error_no = {EBADF, EIO, EROFS, EINVAL}}, - [GF_FOP_SETXATTR] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}}, - [GF_FOP_GETXATTR] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}}, - [GF_FOP_REMOVEXATTR] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}}, + [GF_FOP_SETXATTR] = {.error_no_count = 3, + .error_no = {EACCES, EINTR, ENAMETOOLONG}}, + [GF_FOP_GETXATTR] = {.error_no_count = 3, + .error_no = {EACCES, ENAMETOOLONG, EINTR}}, + [GF_FOP_REMOVEXATTR] = {.error_no_count = 3, + .error_no = {EACCES, ENAMETOOLONG, EINTR}}, [GF_FOP_FSETXATTR] = {.error_no_count = 4, .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}}, [GF_FOP_FGETXATTR] = {.error_no_count = 4, @@ -125,26 +124,25 @@ sys_error_t error_no_list[] = { ENOENT}}, [GF_FOP_FXATTROP] = {.error_no_count = 4, .error_no = {EBADF, EIO, EROFS, EINVAL}}, - [GF_FOP_INODELK] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}}, + [GF_FOP_INODELK] = {.error_no_count = 3, + .error_no = {EACCES, EINTR, ENAMETOOLONG}}, [GF_FOP_FINODELK] = {.error_no_count = 4, .error_no = {EACCES, EBADF, EINTR, ENAMETOOLONG}}, - [GF_FOP_ENTRYLK] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}}, + [GF_FOP_ENTRYLK] = {.error_no_count = 3, + .error_no = {EACCES, ENAMETOOLONG, EINTR}}, [GF_FOP_FENTRYLK] = {.error_no_count = 10, .error_no = {EACCES, EEXIST, EFAULT, EISDIR, EMFILE, ENAMETOOLONG, ENFILE, ENODEV, ENOENT, ENOMEM}}, - [GF_FOP_SETATTR] = {.error_no_count = 11, + [GF_FOP_SETATTR] = {.error_no_count = 10, .error_no = {EACCES, EFAULT, EIO, ENAMETOOLONG, ENOENT, - ENOMEM, ENOTDIR, EPERM, EROFS, EBADF, - EIO}}, + ENOMEM, ENOTDIR, EPERM, EROFS, EIO}}, [GF_FOP_FSETATTR] = {.error_no_count = 11, .error_no = {EACCES, EFAULT, EIO, ENAMETOOLONG, ENOENT, ENOMEM, ENOTDIR, EPERM, EROFS, EBADF, EIO}}, - [GF_FOP_GETSPEC] = {.error_no_count = 4, - .error_no = {EACCES, EBADF, ENAMETOOLONG, EINTR}}}; + [GF_FOP_GETSPEC] = {.error_no_count = 3, + .error_no = {EACCES, ENAMETOOLONG, EINTR}}}; int generate_rand_no(int op_no) @@ -761,6 +759,7 @@ error_gen_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, */ shortvec = iov_dup(vector, 1); shortvec->iov_len /= 2; + count = 1; goto wind; } else if (op_errno) { GF_ERROR(this, "unwind(-1, %s)", strerror(op_errno)); @@ -1396,7 +1395,7 @@ error_gen_priv_dump(xlator_t *this) gf_proc_dump_write("op_count", "%d", conf->op_count); gf_proc_dump_write("failure_iter_no", "%d", conf->failure_iter_no); - gf_proc_dump_write("error_no", "%s", conf->error_no); + gf_proc_dump_write("error_no", "%d", conf->error_no_int); gf_proc_dump_write("random_failure", "%d", conf->random_failure); UNLOCK(&conf->lock); @@ -1430,6 +1429,7 @@ reconfigure(xlator_t *this, dict_t *options) eg_t *pvt = NULL; int32_t ret = 0; char *error_enable_fops = NULL; + char *error_no = NULL; double failure_percent_dbl = 0.0; if (!this || !this->private) @@ -1439,10 +1439,10 @@ reconfigure(xlator_t *this, dict_t *options) ret = -1; - GF_OPTION_RECONF("error-no", pvt->error_no, options, str, out); + GF_OPTION_RECONF("error-no", error_no, options, str, out); - if (pvt->error_no) - pvt->error_no_int = conv_errno_to_int(&pvt->error_no); + if (error_no) + pvt->error_no_int = conv_errno_to_int(&error_no); GF_OPTION_RECONF("failure", failure_percent_dbl, options, percent, out); @@ -1466,6 +1466,7 @@ init(xlator_t *this) eg_t *pvt = NULL; int32_t ret = 0; char *error_enable_fops = NULL; + char *error_no = NULL; double failure_percent_dbl = 0.0; if (!this->children || this->children->next) { @@ -1490,10 +1491,10 @@ init(xlator_t *this) ret = -1; - GF_OPTION_INIT("error-no", pvt->error_no, str, out); + GF_OPTION_INIT("error-no", error_no, str, out); - if (pvt->error_no) - pvt->error_no_int = conv_errno_to_int(&pvt->error_no); + if (error_no) + pvt->error_no_int = conv_errno_to_int(&error_no); GF_OPTION_INIT("failure", failure_percent_dbl, percent, out); @@ -1506,8 +1507,8 @@ init(xlator_t *this) this->private = pvt; - /* Give some seed value here */ - srand(time(NULL)); + /* Give some seed value here. */ + srand(gf_time()); ret = 0; out: @@ -1644,4 +1645,19 @@ struct volume_options options[] = { .flags = OPT_FLAG_SETTABLE, }, - {.key = {NULL}}}; + {.key = {NULL}}, +}; + +xlator_api_t xlator_api = { + .init = init, + .fini = fini, + .reconfigure = reconfigure, + .mem_acct_init = mem_acct_init, + .op_version = {1}, + .dumpops = &dumpops, + .fops = &fops, + .cbks = &cbks, + .options = options, + .identifier = "error-gen", + .category = GF_TECH_PREVIEW, +}; diff --git a/xlators/debug/error-gen/src/error-gen.h b/xlators/debug/error-gen/src/error-gen.h index ffa09252d0f..2478cd5b21c 100644 --- a/xlators/debug/error-gen/src/error-gen.h +++ b/xlators/debug/error-gen/src/error-gen.h @@ -36,7 +36,6 @@ typedef struct { * It's just not worth blowing up the diff by changing it. */ int failure_iter_no; - char *error_no; int error_no_int; gf_boolean_t random_failure; gf_lock_t lock; diff --git a/xlators/debug/io-stats/src/io-stats-mem-types.h b/xlators/debug/io-stats/src/io-stats-mem-types.h index bc25fd2ca4e..51d38d8b97c 100644 --- a/xlators/debug/io-stats/src/io-stats-mem-types.h +++ b/xlators/debug/io-stats/src/io-stats-mem-types.h @@ -11,7 +11,7 @@ #ifndef __IO_STATS_MEM_TYPES_H__ #define __IO_STATS_MEM_TYPES_H__ -#include "mem-types.h" +#include <glusterfs/mem-types.h> extern const char *__progname; diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index 3ea0ccdf3d6..aa00c446e5a 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -7,8 +7,8 @@ later), or the GNU General Public License, version 2 (GPLv2), in all cases as published by the Free Software Foundation. */ -#include "xlator.h" -#include "syscall.h" +#include <glusterfs/xlator.h> +#include <glusterfs/syscall.h> /** * xlators/debug/io_stats : @@ -28,18 +28,18 @@ #include <fnmatch.h> #include <errno.h> -#include "glusterfs.h" -#include "xlator.h" +#include <glusterfs/glusterfs.h> +#include <glusterfs/xlator.h> #include "io-stats-mem-types.h" #include <stdarg.h> -#include "defaults.h" -#include "logging.h" -#include "cli1-xdr.h" -#include "statedump.h" -#include "syncop.h" +#include <glusterfs/defaults.h> +#include <glusterfs/logging.h> +#include <glusterfs/statedump.h> +#include <glusterfs/syncop.h> #include <pwd.h> #include <grp.h> -#include "upcall-utils.h" +#include <glusterfs/upcall-utils.h> +#include <glusterfs/async.h> #define MAX_LIST_MEMBERS 100 #define DEFAULT_PWD_BUF_SZ 16384 @@ -66,6 +66,17 @@ typedef enum { IOS_STATS_THRU_MAX, } ios_stats_thru_t; +/* This is same as gf1_cli_info_op */ +/* had to be defined here again, so we have modularity between + xdr, xlator, and library functions */ +typedef enum ios_info_op { + GF_IOS_INFO_NONE = 0, + GF_IOS_INFO_ALL = 1, + GF_IOS_INFO_INCREMENTAL = 2, + GF_IOS_INFO_CUMULATIVE = 3, + GF_IOS_INFO_CLEAR = 4, +} ios_info_op_t; + struct ios_stat_lat { struct timeval time; double throughput; @@ -124,7 +135,7 @@ struct ios_global_stats { gf_atomic_t block_count_read[IOS_BLOCK_COUNT_SIZE]; gf_atomic_t fop_hits[GF_FOP_MAXVALUE]; gf_atomic_t upcall_hits[GF_UPCALL_FLAGS_MAXVALUE]; - struct timeval started_at; + time_t started_at; struct ios_lat latency[GF_FOP_MAXVALUE]; uint64_t nr_opens; uint64_t max_nr_opens; @@ -173,7 +184,6 @@ struct ios_conf { */ char *unique_id; ios_dump_type_t dump_format; - char *dump_format_str; }; struct ios_fd { @@ -275,21 +285,24 @@ is_fop_latency_started(call_frame_t *frame) struct timespec *begin, *end; \ double throughput; \ int flag = 0; \ + struct timeval tv = { \ + 0, \ + }; \ \ begin = &frame->begin; \ end = &frame->end; \ \ - elapsed = ((end->tv_sec - begin->tv_sec) * 1e9 + \ - (end->tv_nsec - begin->tv_nsec)) / \ - 1000; \ + elapsed = gf_tsdiff(begin, end) / 1000.0; \ throughput = op_ret / elapsed; \ \ conf = this->private; \ + gettimeofday(&tv, NULL); \ LOCK(&iosstat->lock); \ { \ if (iosstat->thru_counters[type].throughput <= throughput) { \ iosstat->thru_counters[type].throughput = throughput; \ - gettimeofday(&iosstat->thru_counters[type].time, NULL); \ + memcpy(&iosstat->thru_counters[type].time, &tv, \ + sizeof(struct timeval)); \ flag = 1; \ } \ } \ @@ -663,10 +676,7 @@ ios_dump_throughput_stats(struct ios_stat_head *list_head, xlator_t *this, FILE *logfp, ios_stats_thru_t type) { struct ios_stat_list *entry = NULL; - struct timeval time = { - 0, - }; - char timestr[256] = { + char timestr[GF_TIMESTR_SIZE] = { 0, }; @@ -674,12 +684,9 @@ ios_dump_throughput_stats(struct ios_stat_head *list_head, xlator_t *this, { list_for_each_entry(entry, &list_head->iosstats->list, list) { - gf_time_fmt(timestr, sizeof timestr, - entry->iosstat->thru_counters[type].time.tv_sec, - gf_timefmt_FT); - snprintf(timestr + strlen(timestr), - sizeof timestr - strlen(timestr), ".%" GF_PRI_SUSECONDS, - time.tv_usec); + gf_time_fmt_tv(timestr, sizeof timestr, + &entry->iosstat->thru_counters[type].time, + gf_timefmt_FT); ios_log(this, logfp, "%s \t %-10.2f \t %s", timestr, entry->value, entry->iosstat->filename); @@ -758,9 +765,8 @@ err: int io_stats_dump_global_to_json_logfp(xlator_t *this, - struct ios_global_stats *stats, - struct timeval *now, int interval, - FILE *logfp) + struct ios_global_stats *stats, time_t now, + int interval, FILE *logfp) { int i = 0; int j = 0; @@ -786,10 +792,7 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, }; dict_t *xattr = NULL; - interval_sec = ((now->tv_sec * 1000000.0 + now->tv_usec) - - (stats->started_at.tv_sec * 1000000.0 + - stats->started_at.tv_usec)) / - 1000000.0; + interval_sec = (double)(now - stats->started_at); conf = this->private; @@ -819,19 +822,18 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, } if (interval == -1) { - ios_log(this, logfp, "\"%s.%s.read_%d%s\": \"%" GF_PRI_ATOMIC "\",", + ios_log(this, logfp, "\"%s.%s.read_%d%s\": %" GF_PRI_ATOMIC ",", key_prefix, str_prefix, rw_size, rw_unit, GF_ATOMIC_GET(stats->block_count_read[i])); - ios_log(this, logfp, - "\"%s.%s.write_%d%s\": \"%" GF_PRI_ATOMIC "\",", key_prefix, - str_prefix, rw_size, rw_unit, + ios_log(this, logfp, "\"%s.%s.write_%d%s\": %" GF_PRI_ATOMIC ",", + key_prefix, str_prefix, rw_size, rw_unit, GF_ATOMIC_GET(stats->block_count_write[i])); } else { - ios_log(this, logfp, "\"%s.%s.read_%d%s_per_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.read_%d%s_per_sec\": %0.2lf,", key_prefix, str_prefix, rw_size, rw_unit, (double)(GF_ATOMIC_GET(stats->block_count_read[i]) / interval_sec)); - ios_log(this, logfp, "\"%s.%s.write_%d%s_per_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.write_%d%s_per_sec\": %0.2lf,", key_prefix, str_prefix, rw_size, rw_unit, (double)(GF_ATOMIC_GET(stats->block_count_write[i]) / interval_sec)); @@ -839,9 +841,9 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, } if (interval == -1) { - ios_log(this, logfp, "\"%s.%s.fds.open_count\": \"%" PRId64 "\",", + ios_log(this, logfp, "\"%s.%s.fds.open_count\": %" PRId64 ",", key_prefix, str_prefix, conf->cumulative.nr_opens); - ios_log(this, logfp, "\"%s.%s.fds.max_open_count\": \"%" PRId64 "\",", + ios_log(this, logfp, "\"%s.%s.fds.max_open_count\": %" PRId64 ",", key_prefix, str_prefix, conf->cumulative.max_nr_opens); } @@ -863,20 +865,19 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, } } if (interval == -1) { - ios_log(this, logfp, - "\"%s.%s.fop.%s.count\": \"%" GF_PRI_ATOMIC "\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.count\": %" GF_PRI_ATOMIC ",", key_prefix, str_prefix, lc_fop_name, fop_hits); } else { - ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": %0.2lf,", key_prefix, str_prefix, lc_fop_name, (double)(fop_hits / interval_sec)); } - ios_log(this, logfp, "\"%s.%s.fop.%s.latency_ave_usec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.latency_ave_usec\": %0.2lf,", key_prefix, str_prefix, lc_fop_name, fop_lat_ave); - ios_log(this, logfp, "\"%s.%s.fop.%s.latency_min_usec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.latency_min_usec\": %0.2lf,", key_prefix, str_prefix, lc_fop_name, fop_lat_min); - ios_log(this, logfp, "\"%s.%s.fop.%s.latency_max_usec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.latency_max_usec\": %0.2lf,", key_prefix, str_prefix, lc_fop_name, fop_lat_max); fop_ave_usec_sum += fop_lat_ave; @@ -891,18 +892,17 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, */ ios_log(this, logfp, "\"%s.%s.fop.weighted_latency_ave_usec_nozerofill\": " - "\"%0.4lf\",", + "%0.4lf,", key_prefix, str_prefix, weighted_fop_ave_usec); } - ios_log(this, logfp, "\"%s.%s.fop.weighted_latency_ave_usec\": \"%0.4lf\",", + ios_log(this, logfp, "\"%s.%s.fop.weighted_latency_ave_usec\": %0.4lf,", key_prefix, str_prefix, weighted_fop_ave_usec); - ios_log(this, logfp, "\"%s.%s.fop.weighted_fop_count\": \"%ld\",", - key_prefix, str_prefix, total_fop_hits); + ios_log(this, logfp, "\"%s.%s.fop.weighted_fop_count\": %ld,", key_prefix, + str_prefix, total_fop_hits); fop_ave_usec = fop_ave_usec_sum / GF_FOP_MAXVALUE; - ios_log(this, logfp, - "\"%s.%s.fop.unweighted_latency_ave_usec\":\"%0.4lf\",", key_prefix, - str_prefix, fop_ave_usec); + ios_log(this, logfp, "\"%s.%s.fop.unweighted_latency_ave_usec\":%0.4lf,", + key_prefix, str_prefix, fop_ave_usec); for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { lc_fop_name = strdupa(gf_upcall_list[i]); @@ -911,11 +911,10 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, } fop_hits = GF_ATOMIC_GET(stats->upcall_hits[i]); if (interval == -1) { - ios_log(this, logfp, - "\"%s.%s.fop.%s.count\": \"%" GF_PRI_ATOMIC "\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.count\": %" GF_PRI_ATOMIC ",", key_prefix, str_prefix, lc_fop_name, fop_hits); } else { - ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.fop.%s.per_sec\": %0.2lf,", key_prefix, str_prefix, lc_fop_name, (double)(fop_hits / interval_sec)); } @@ -932,7 +931,7 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, dict_foreach_inline(xattr, curr) { - ios_log(this, logfp, "\"%s.%s.%s.queue_size\": \"%d\",", key_prefix, + ios_log(this, logfp, "\"%s.%s.%s.queue_size\": %d,", key_prefix, str_prefix, curr->key, data_to_int32(curr->value)); } @@ -945,23 +944,23 @@ io_stats_dump_global_to_json_logfp(xlator_t *this, } if (interval == -1) { - ios_log(this, logfp, "\"%s.%s.uptime\": \"%" PRId64 "\",", key_prefix, - str_prefix, (uint64_t)(now->tv_sec - stats->started_at.tv_sec)); + ios_log(this, logfp, "\"%s.%s.uptime\": %" PRIu64 ",", key_prefix, + str_prefix, (uint64_t)(now - stats->started_at)); ios_log(this, logfp, - "\"%s.%s.bytes_read\": \"" - "%" GF_PRI_ATOMIC "\",", + "\"%s.%s.bytes_read\": " + "%" GF_PRI_ATOMIC ",", key_prefix, str_prefix, GF_ATOMIC_GET(stats->data_read)); ios_log(this, logfp, - "\"%s.%s.bytes_written\": \"" - "%" GF_PRI_ATOMIC "\"", + "\"%s.%s.bytes_written\": " + "%" GF_PRI_ATOMIC "", key_prefix, str_prefix, GF_ATOMIC_GET(stats->data_written)); } else { - ios_log(this, logfp, "\"%s.%s.sample_interval_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.sample_interval_sec\": %0.2lf,", key_prefix, str_prefix, interval_sec); - ios_log(this, logfp, "\"%s.%s.bytes_read_per_sec\": \"%0.2lf\",", + ios_log(this, logfp, "\"%s.%s.bytes_read_per_sec\": %0.2lf,", key_prefix, str_prefix, (double)(GF_ATOMIC_GET(stats->data_read) / interval_sec)); - ios_log(this, logfp, "\"%s.%s.bytes_written_per_sec\": \"%0.2lf\"", + ios_log(this, logfp, "\"%s.%s.bytes_written_per_sec\": %0.2lf", key_prefix, str_prefix, (double)(GF_ATOMIC_GET(stats->data_written) / interval_sec)); } @@ -1198,14 +1197,14 @@ out: int io_stats_dump_global_to_logfp(xlator_t *this, struct ios_global_stats *stats, - struct timeval *now, int interval, FILE *logfp) + time_t now, int interval, FILE *logfp) { int i = 0; int per_line = 0; int index = 0; struct ios_stat_head *list_head = NULL; struct ios_conf *conf = NULL; - char timestr[256] = { + char timestr[GF_TIMESTR_SIZE] = { 0, }; char str_header[128] = {0}; @@ -1221,8 +1220,8 @@ io_stats_dump_global_to_logfp(xlator_t *this, struct ios_global_stats *stats, ios_log(this, logfp, "\n=== Cumulative stats ==="); else ios_log(this, logfp, "\n=== Interval %d stats ===", interval); - ios_log(this, logfp, " Duration : %" PRId64 " secs", - (uint64_t)(now->tv_sec - stats->started_at.tv_sec)); + ios_log(this, logfp, " Duration : %" PRIu64 " secs", + (uint64_t)(now - stats->started_at)); ios_log(this, logfp, " BytesRead : %" GF_PRI_ATOMIC, GF_ATOMIC_GET(stats->data_read)); ios_log(this, logfp, " BytesWritten : %" GF_PRI_ATOMIC "\n", @@ -1314,11 +1313,8 @@ io_stats_dump_global_to_logfp(xlator_t *this, struct ios_global_stats *stats, if (interval == -1) { LOCK(&conf->lock); { - gf_time_fmt(timestr, sizeof timestr, - conf->cumulative.max_openfd_time.tv_sec, gf_timefmt_FT); - snprintf(timestr + strlen(timestr), - sizeof timestr - strlen(timestr), ".%" GF_PRI_SUSECONDS, - conf->cumulative.max_openfd_time.tv_usec); + gf_time_fmt_tv(timestr, sizeof timestr, + &conf->cumulative.max_openfd_time, gf_timefmt_FT); ios_log(this, logfp, "Current open fd's: %" PRId64 " Max open fd's: %" PRId64 " time %s", @@ -1370,10 +1366,10 @@ io_stats_dump_global_to_logfp(xlator_t *this, struct ios_global_stats *stats, int io_stats_dump_global_to_dict(xlator_t *this, struct ios_global_stats *stats, - struct timeval *now, int interval, dict_t *dict) + time_t now, int interval, dict_t *dict) { int ret = 0; - char key[256] = {0}; + char key[64] = {0}; uint64_t sec = 0; int i = 0; uint64_t count = 0; @@ -1396,7 +1392,7 @@ io_stats_dump_global_to_dict(xlator_t *this, struct ios_global_stats *stats, interval); snprintf(key, sizeof(key), "%d-duration", interval); - sec = (uint64_t)(now->tv_sec - stats->started_at.tv_sec); + sec = now - stats->started_at; ret = dict_set_uint64(dict, key, sec); if (ret) { gf_log(this->name, GF_LOG_ERROR, @@ -1519,9 +1515,8 @@ out: } int -io_stats_dump_global(xlator_t *this, struct ios_global_stats *stats, - struct timeval *now, int interval, - struct ios_dump_args *args) +io_stats_dump_global(xlator_t *this, struct ios_global_stats *stats, time_t now, + int interval, struct ios_dump_args *args) { int ret = -1; @@ -1579,24 +1574,24 @@ ios_dump_args_init(struct ios_dump_args *args, ios_dump_type_t type, } static void -ios_global_stats_clear(struct ios_global_stats *stats, struct timeval *now) +ios_global_stats_clear(struct ios_global_stats *stats, time_t now) { GF_ASSERT(stats); GF_ASSERT(now); memset(stats, 0, sizeof(*stats)); - stats->started_at = *now; + stats->started_at = now; } int -io_stats_dump(xlator_t *this, struct ios_dump_args *args, gf1_cli_info_op op, +io_stats_dump(xlator_t *this, struct ios_dump_args *args, ios_info_op_t op, gf_boolean_t is_peek) { struct ios_conf *conf = NULL; struct ios_global_stats cumulative = {}; struct ios_global_stats incremental = {}; int increment = 0; - struct timeval now; + time_t now = 0; GF_ASSERT(this); GF_ASSERT(args); @@ -1604,31 +1599,31 @@ io_stats_dump(xlator_t *this, struct ios_dump_args *args, gf1_cli_info_op op, GF_ASSERT(args->type < IOS_DUMP_TYPE_MAX); conf = this->private; + now = gf_time(); - gettimeofday(&now, NULL); LOCK(&conf->lock); { - if (op == GF_CLI_INFO_ALL || op == GF_CLI_INFO_CUMULATIVE) + if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_CUMULATIVE) cumulative = conf->cumulative; - if (op == GF_CLI_INFO_ALL || op == GF_CLI_INFO_INCREMENTAL) { + if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_INCREMENTAL) { incremental = conf->incremental; increment = conf->increment; if (!is_peek) { increment = conf->increment++; - ios_global_stats_clear(&conf->incremental, &now); + ios_global_stats_clear(&conf->incremental, now); } } } UNLOCK(&conf->lock); - if (op == GF_CLI_INFO_ALL || op == GF_CLI_INFO_CUMULATIVE) - io_stats_dump_global(this, &cumulative, &now, -1, args); + if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_CUMULATIVE) + io_stats_dump_global(this, &cumulative, now, -1, args); - if (op == GF_CLI_INFO_ALL || op == GF_CLI_INFO_INCREMENTAL) - io_stats_dump_global(this, &incremental, &now, increment, args); + if (op == GF_IOS_INFO_ALL || op == GF_IOS_INFO_INCREMENTAL) + io_stats_dump_global(this, &incremental, now, increment, args); return 0; } @@ -1638,9 +1633,8 @@ io_stats_dump_fd(xlator_t *this, struct ios_fd *iosfd) { struct ios_conf *conf = NULL; struct timeval now; - uint64_t sec = 0; - uint64_t usec = 0; int i = 0; + double usecs = 0; uint64_t data_read = 0; uint64_t data_written = 0; uint64_t block_count_read = 0; @@ -1655,23 +1649,15 @@ io_stats_dump_fd(xlator_t *this, struct ios_fd *iosfd) return 0; gettimeofday(&now, NULL); - - if (iosfd->opened_at.tv_usec > now.tv_usec) { - now.tv_usec += 1000000; - now.tv_usec--; - } - - sec = now.tv_sec - iosfd->opened_at.tv_sec; - usec = now.tv_usec - iosfd->opened_at.tv_usec; + usecs = gf_tvdiff(&iosfd->opened_at, &now); gf_log(this->name, GF_LOG_INFO, "--- fd stats ---"); if (iosfd->filename) gf_log(this->name, GF_LOG_INFO, " Filename : %s", iosfd->filename); - if (sec) - gf_log(this->name, GF_LOG_INFO, - " Lifetime : %" PRId64 "secs, %" PRId64 "usecs", sec, usec); + if (usecs) + gf_log(this->name, GF_LOG_INFO, " Lifetime : %lf secs", usecs); data_read = GF_ATOMIC_GET(iosfd->data_read); if (data_read) @@ -1774,9 +1760,7 @@ update_ios_latency(struct ios_conf *conf, call_frame_t *frame, begin = &frame->begin; end = &frame->end; - elapsed = ((end->tv_sec - begin->tv_sec) * 1e9 + - (end->tv_nsec - begin->tv_nsec)) / - 1000; + elapsed = gf_tsdiff(begin, end) / 1000.0; update_ios_latency_stats(&conf->cumulative, elapsed, op); update_ios_latency_stats(&conf->incremental, elapsed, op); @@ -1791,12 +1775,13 @@ io_stats_dump_stats_to_dict(xlator_t *this, dict_t *resp, { struct ios_conf *conf = NULL; int cnt = 0; - char key[256]; + char key[32]; + int keylen; struct ios_stat_head *list_head = NULL; struct ios_stat_list *entry = NULL; int ret = -1; ios_stats_thru_t index = IOS_STATS_THRU_MAX; - char timestr[256] = { + char timestr[GF_TIMESTR_SIZE] = { 0, }; char *dict_timestr = NULL; @@ -1815,14 +1800,9 @@ io_stats_dump_stats_to_dict(xlator_t *this, dict_t *resp, ret = dict_set_uint64(resp, "max-open", conf->cumulative.max_nr_opens); - gf_time_fmt(timestr, sizeof timestr, - conf->cumulative.max_openfd_time.tv_sec, - gf_timefmt_FT); - if (conf->cumulative.max_openfd_time.tv_sec) - snprintf(timestr + strlen(timestr), - sizeof timestr - strlen(timestr), - ".%" GF_PRI_SUSECONDS, - conf->cumulative.max_openfd_time.tv_usec); + gf_time_fmt_tv(timestr, sizeof timestr, + &conf->cumulative.max_openfd_time, + gf_timefmt_FT); dict_timestr = gf_strdup(timestr); if (!dict_timestr) @@ -1862,7 +1842,7 @@ io_stats_dump_stats_to_dict(xlator_t *this, dict_t *resp, default: goto out; } - ret = dict_set_int32(resp, "top-op", flags); + ret = dict_set_int32_sizen(resp, "top-op", flags); if (!list_cnt) goto out; LOCK(&list_head->lock); @@ -1870,24 +1850,24 @@ io_stats_dump_stats_to_dict(xlator_t *this, dict_t *resp, list_for_each_entry(entry, &list_head->iosstats->list, list) { cnt++; - snprintf(key, 256, "%s-%d", "filename", cnt); - ret = dict_set_str(resp, key, entry->iosstat->filename); + keylen = snprintf(key, sizeof(key), "filename-%d", cnt); + ret = dict_set_strn(resp, key, keylen, entry->iosstat->filename); if (ret) goto unlock_list_head; - snprintf(key, 256, "%s-%d", "value", cnt); + snprintf(key, sizeof(key), "value-%d", cnt); ret = dict_set_uint64(resp, key, entry->value); if (ret) goto unlock_list_head; if (index != IOS_STATS_THRU_MAX) { - snprintf(key, 256, "%s-%d", "time-sec", cnt); - ret = dict_set_int32( - resp, key, + keylen = snprintf(key, sizeof(key), "time-sec-%d", cnt); + ret = dict_set_int32n( + resp, key, keylen, entry->iosstat->thru_counters[index].time.tv_sec); if (ret) goto unlock_list_head; - snprintf(key, 256, "%s-%d", "time-usec", cnt); - ret = dict_set_int32( - resp, key, + keylen = snprintf(key, sizeof(key), "time-usec-%d", cnt); + ret = dict_set_int32n( + resp, key, keylen, entry->iosstat->thru_counters[index].time.tv_usec); if (ret) goto unlock_list_head; @@ -1902,7 +1882,7 @@ unlock_list_head: * failed. */ if (ret) goto out; - ret = dict_set_int32(resp, "members", cnt); + ret = dict_set_int32_sizen(resp, "members", cnt); out: return ret; } @@ -2118,6 +2098,19 @@ io_stats_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, } int +io_stats_copy_file_range_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, + struct iatt *stbuf, struct iatt *prebuf_dst, + struct iatt *postbuf_dst, dict_t *xdata) +{ + UPDATE_PROFILE_STATS(frame, COPY_FILE_RANGE); + + STACK_UNWIND_STRICT(copy_file_range, frame, op_ret, op_errno, stbuf, + prebuf_dst, postbuf_dst, xdata); + return 0; +} + +int io_stats_readdirp_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, gf_dirent_t *buf, dict_t *xdata) @@ -2872,6 +2865,19 @@ io_stats_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, } int +io_stats_copy_file_range(call_frame_t *frame, xlator_t *this, fd_t *fd_in, + off_t off_in, fd_t *fd_out, off_t off_out, size_t len, + uint32_t flags, dict_t *xdata) +{ + START_FOP_LATENCY(frame); + + STACK_WIND(frame, io_stats_copy_file_range_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->copy_file_range, fd_in, off_in, fd_out, + off_out, len, flags, xdata); + return 0; +} + +int io_stats_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { START_FOP_LATENCY(frame); @@ -3004,7 +3010,7 @@ conditional_dump(dict_t *dict, char *key, data_t *value, void *data) } else { (void)ios_dump_args_init(&args, IOS_DUMP_TYPE_FILE, logfp); } - io_stats_dump(this, &args, GF_CLI_INFO_ALL, _gf_false); + io_stats_dump(this, &args, GF_IOS_INFO_ALL, _gf_false); fclose(logfp); return 0; } @@ -3107,7 +3113,7 @@ _ios_dump_thread(xlator_t *this) stats_logfp = fopen(stats_filename, "w+"); if (stats_logfp) { (void)ios_dump_args_init(&args, conf->dump_format, stats_logfp); - io_stats_dump(this, &args, GF_CLI_INFO_ALL, _gf_false); + io_stats_dump(this, &args, GF_IOS_INFO_ALL, _gf_false); fclose(stats_logfp); log_stats_fopen_failure = _gf_true; } else if (log_stats_fopen_failure) { @@ -3445,12 +3451,13 @@ io_stats_release(xlator_t *this, fd_t *fd) BUMP_FOP(RELEASE); conf = this->private; - - LOCK(&conf->lock); - { - conf->cumulative.nr_opens--; + if (conf) { + LOCK(&conf->lock); + { + conf->cumulative.nr_opens--; + } + UNLOCK(&conf->lock); } - UNLOCK(&conf->lock); ios_fd_ctx_get(fd, this, &iosfd); if (iosfd) { @@ -3567,26 +3574,21 @@ ios_destroy_top_stats(struct ios_conf *conf) return; } -static int +static void io_stats_clear(struct ios_conf *conf) { - struct timeval now; - int ret = -1; + time_t now = 0; GF_ASSERT(conf); + now = gf_time(); - if (!gettimeofday(&now, NULL)) { - LOCK(&conf->lock); - { - ios_global_stats_clear(&conf->cumulative, &now); - ios_global_stats_clear(&conf->incremental, &now); - conf->increment = 0; - } - UNLOCK(&conf->lock); - ret = 0; + LOCK(&conf->lock); + { + ios_global_stats_clear(&conf->cumulative, now); + ios_global_stats_clear(&conf->incremental, now); + conf->increment = 0; } - - return ret; + UNLOCK(&conf->lock); } int32_t @@ -3652,18 +3654,51 @@ io_priv(xlator_t *this) } static void -ios_set_log_format_code(struct ios_conf *conf) +ios_set_log_format_code(struct ios_conf *conf, char *dump_format_str) { - if (strcmp(conf->dump_format_str, "json") == 0) + if (strcmp(dump_format_str, "json") == 0) conf->dump_format = IOS_DUMP_TYPE_JSON_FILE; - else if (strcmp(conf->dump_format_str, "text") == 0) + else if (strcmp(dump_format_str, "text") == 0) conf->dump_format = IOS_DUMP_TYPE_FILE; - else if (strcmp(conf->dump_format_str, "dict") == 0) + else if (strcmp(dump_format_str, "dict") == 0) conf->dump_format = IOS_DUMP_TYPE_DICT; - else if (strcmp(conf->dump_format_str, "samples") == 0) + else if (strcmp(dump_format_str, "samples") == 0) conf->dump_format = IOS_DUMP_TYPE_SAMPLES; } +void +xlator_set_loglevel(xlator_t *this, int log_level) +{ + glusterfs_ctx_t *ctx = NULL; + glusterfs_graph_t *active = NULL; + xlator_t *top = NULL; + xlator_t *trav = this; + + ctx = this->ctx; + GF_ASSERT(ctx); + active = ctx->active; + top = active->first; + + if (log_level == -1) + return; + + if (ctx->cmd_args.brick_mux) { + /* Set log-level for all brick xlators */ + top->loglevel = log_level; + + /* Set log-level for parent xlator */ + if (this->parents) + this->parents->xlator->loglevel = log_level; + + while (trav) { + trav->loglevel = log_level; + trav = trav->next; + } + } else { + gf_log_set_loglevel(this->ctx, log_level); + } +} + int reconfigure(xlator_t *this, dict_t *options) { @@ -3672,6 +3707,7 @@ reconfigure(xlator_t *this, dict_t *options) char *sys_log_str = NULL; char *log_format_str = NULL; char *logger_str = NULL; + char *dump_format_str = NULL; int sys_log_level = -1; char *log_str = NULL; int log_level = -1; @@ -3680,6 +3716,7 @@ reconfigure(xlator_t *this, dict_t *options) uint32_t log_buf_size = 0; uint32_t log_flush_timeout = 0; int32_t old_dump_interval; + int32_t threads; if (!this || !this->private) goto out; @@ -3716,9 +3753,8 @@ reconfigure(xlator_t *this, dict_t *options) GF_OPTION_RECONF("ios-sample-interval", conf->ios_sample_interval, options, int32, out); - GF_OPTION_RECONF("ios-dump-format", conf->dump_format_str, options, str, - out); - ios_set_log_format_code(conf); + GF_OPTION_RECONF("ios-dump-format", dump_format_str, options, str, out); + ios_set_log_format_code(conf, dump_format_str); GF_OPTION_RECONF("ios-sample-buf-size", conf->ios_sample_buf_size, options, int32, out); GF_OPTION_RECONF("sys-log-level", sys_log_str, options, str, out); @@ -3730,7 +3766,8 @@ reconfigure(xlator_t *this, dict_t *options) GF_OPTION_RECONF("log-level", log_str, options, str, out); if (log_str) { log_level = glusterd_check_log_level(log_str); - gf_log_set_loglevel(this->ctx, log_level); + /* Set loglevel for all children and server xlators */ + xlator_set_loglevel(this, log_level); } GF_OPTION_RECONF("logger", logger_str, options, str, out); @@ -3752,6 +3789,9 @@ reconfigure(xlator_t *this, dict_t *options) out); gf_log_set_log_flush_timeout(log_flush_timeout); + GF_OPTION_RECONF("threads", threads, options, int32, out); + gf_async_adjust_threads(threads); + ret = 0; out: gf_log(this ? this->name : "io-stats", GF_LOG_DEBUG, @@ -3789,7 +3829,7 @@ ios_conf_destroy(struct ios_conf *conf) _ios_destroy_dump_thread(conf); ios_destroy_sample_buf(conf->ios_sample_buf); LOCK_DESTROY(&conf->lock); - GF_FREE(conf->dnscache); + gf_dnscache_deinit(conf->dnscache); GF_FREE(conf); } @@ -3812,16 +3852,18 @@ ios_init_stats(struct ios_global_stats *stats) for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) GF_ATOMIC_INIT(stats->upcall_hits[i], 0); - gettimeofday(&stats->started_at, NULL); + stats->started_at = gf_time(); } int init(xlator_t *this) { struct ios_conf *conf = NULL; + char *volume_id = NULL; char *sys_log_str = NULL; char *logger_str = NULL; char *log_format_str = NULL; + char *dump_format_str = NULL; int logger = -1; int log_format = -1; int sys_log_level = -1; @@ -3830,6 +3872,7 @@ init(xlator_t *this) int ret = -1; uint32_t log_buf_size = 0; uint32_t log_flush_timeout = 0; + int32_t threads; if (!this) return -1; @@ -3857,6 +3900,11 @@ init(xlator_t *this) conf->unique_id = this->name; } + ret = dict_get_strn(this->options, "volume-id", SLEN("volume-id"), + &volume_id); + if (!ret) { + strncpy(this->graph->volume_id, volume_id, GF_UUID_BUF_SIZE); + } /* * Init it just after calloc, so that we are sure the lock is inited * in case of error paths. @@ -3882,8 +3930,8 @@ init(xlator_t *this) GF_OPTION_INIT("ios-sample-interval", conf->ios_sample_interval, int32, out); - GF_OPTION_INIT("ios-dump-format", conf->dump_format_str, str, out); - ios_set_log_format_code(conf); + GF_OPTION_INIT("ios-dump-format", dump_format_str, str, out); + ios_set_log_format_code(conf, dump_format_str); GF_OPTION_INIT("ios-sample-buf-size", conf->ios_sample_buf_size, int32, out); @@ -3897,6 +3945,10 @@ init(xlator_t *this) GF_OPTION_INIT("ios-dnscache-ttl-sec", conf->ios_dnscache_ttl_sec, int32, out); conf->dnscache = gf_dnscache_init(conf->ios_dnscache_ttl_sec); + if (!conf->dnscache) { + ret = -1; + goto out; + } GF_OPTION_INIT("sys-log-level", sys_log_str, str, out); if (sys_log_str) { @@ -3929,6 +3981,9 @@ init(xlator_t *this) GF_OPTION_INIT("log-flush-timeout", log_flush_timeout, time, out); gf_log_set_log_flush_timeout(log_flush_timeout); + GF_OPTION_INIT("threads", threads, int32, out); + gf_async_adjust_threads(threads); + this->private = conf; if (conf->ios_dump_interval > 0) { conf->dump_thread_running = _gf_true; @@ -4033,8 +4088,8 @@ notify(xlator_t *this, int32_t event, void *data, ...) } } else { ret = dict_get_int32(dict, "info-op", &op); - if (ret || op < GF_CLI_INFO_ALL || GF_CLI_INFO_CLEAR < op) - op = GF_CLI_INFO_ALL; + if (ret || op < GF_IOS_INFO_ALL || GF_IOS_INFO_CLEAR < op) + op = GF_IOS_INFO_ALL; ret = dict_set_int32(output, "info-op", op); if (ret) { @@ -4043,13 +4098,10 @@ notify(xlator_t *this, int32_t event, void *data, ...) goto out; } - if (GF_CLI_INFO_CLEAR == op) { - ret = io_stats_clear(this->private); - if (ret) - gf_log(this->name, GF_LOG_ERROR, - "Failed to clear info stats"); + if (GF_IOS_INFO_CLEAR == op) { + io_stats_clear(this->private); - ret = dict_set_int32(output, "stats-cleared", ret ? 0 : 1); + ret = dict_set_int32(output, "stats-cleared", 1); if (ret) gf_log(this->name, GF_LOG_ERROR, "Failed to set stats-cleared" @@ -4157,6 +4209,7 @@ struct xlator_fops fops = { .getactivelk = io_stats_getactivelk, .setactivelk = io_stats_setactivelk, .compound = io_stats_compound, + .copy_file_range = io_stats_copy_file_range, }; struct xlator_cbks cbks = { @@ -4371,6 +4424,57 @@ struct volume_options options[] = { .type = GF_OPTION_TYPE_STR, .default_value = "/no/such/path", .description = "Unique ID for our files."}, + {.key = {"global-threading"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .op_version = {GD_OP_VERSION_6_0}, + .flags = OPT_FLAG_SETTABLE, + .tags = {"io-stats", "threading"}, + .description = "This option enables the global threading support for " + "bricks. If enabled, it's recommended to also enable " + "'performance.iot-pass-through'"}, + {.key = {"threads"}, .type = GF_OPTION_TYPE_INT}, + {.key = {"brick-threads"}, + .type = GF_OPTION_TYPE_INT, + .default_value = "16", + .min = 0, + .max = GF_ASYNC_MAX_THREADS, + .op_version = {GD_OP_VERSION_6_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-stats", "threading"}, + .description = "When global threading is used, this value determines the " + "maximum amount of threads that can be created on bricks"}, + {.key = {"client-threads"}, + .type = GF_OPTION_TYPE_INT, + .default_value = "16", + .min = 0, + .max = GF_ASYNC_MAX_THREADS, + .op_version = {GD_OP_VERSION_6_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, + .tags = {"io-stats", "threading"}, + .description = "When global threading is used, this value determines the " + "maximum amount of threads that can be created on clients"}, + {.key = {"volume-id"}, + .type = GF_OPTION_TYPE_STR, + .op_version = {GD_OP_VERSION_7_1}, + .tags = {"global", "volume-id"}, + .description = + "This option points to the 'unique' UUID particular to this " + "volume, which would be set in 'graph->volume_id'"}, {.key = {NULL}}, +}; +xlator_api_t xlator_api = { + .init = init, + .fini = fini, + .notify = notify, + .reconfigure = reconfigure, + .mem_acct_init = mem_acct_init, + .op_version = {1}, /* Present from the initial version */ + .dumpops = &dumpops, + .fops = &fops, + .cbks = &cbks, + .options = options, + .identifier = "io-stats", + .category = GF_MAINTAINED, }; diff --git a/xlators/debug/sink/src/sink.c b/xlators/debug/sink/src/sink.c index fbbdd3a4847..9822bbb732e 100644 --- a/xlators/debug/sink/src/sink.c +++ b/xlators/debug/sink/src/sink.c @@ -8,8 +8,8 @@ cases as published by the Free Software Foundation. */ -#include "xlator.h" -#include "defaults.h" +#include <glusterfs/xlator.h> +#include <glusterfs/defaults.h> int32_t init(xlator_t *this) @@ -80,3 +80,15 @@ struct xlator_cbks cbks = {}; struct volume_options options[] = { {.key = {NULL}}, }; + +xlator_api_t xlator_api = { + .init = init, + .fini = fini, + .notify = notify, + .op_version = {GD_OP_VERSION_3_12_0}, + .fops = &fops, + .cbks = &cbks, + .options = options, + .identifier = "sink", + .category = GF_TECH_PREVIEW, +}; diff --git a/xlators/debug/trace/src/trace-mem-types.h b/xlators/debug/trace/src/trace-mem-types.h index cf05a77b9f1..18a7e0414a6 100644 --- a/xlators/debug/trace/src/trace-mem-types.h +++ b/xlators/debug/trace/src/trace-mem-types.h @@ -11,7 +11,7 @@ #ifndef __TRACE_MEM_TYPES_H__ #define __TRACE_MEM_TYPES_H__ -#include "mem-types.h" +#include <glusterfs/mem-types.h> enum gf_trace_mem_types_ { gf_trace_mt_trace_conf_t = gf_common_mt_end + 1, diff --git a/xlators/debug/trace/src/trace.c b/xlators/debug/trace/src/trace.c index a02288ceb41..6ed0ca00342 100644 --- a/xlators/debug/trace/src/trace.c +++ b/xlators/debug/trace/src/trace.c @@ -22,13 +22,13 @@ static void trace_stat_to_str(struct iatt *buf, char *str, size_t len) { - char atime_buf[200] = { + char atime_buf[GF_TIMESTR_SIZE] = { 0, }; - char mtime_buf[200] = { + char mtime_buf[GF_TIMESTR_SIZE] = { 0, }; - char ctime_buf[200] = { + char ctime_buf[GF_TIMESTR_SIZE] = { 0, }; @@ -64,7 +64,7 @@ trace_stat_to_str(struct iatt *buf, char *str, size_t len) int dump_history_trace(circular_buffer_t *cb, void *data) { - char timestr[256] = { + char timestr[GF_TIMESTR_SIZE] = { 0, }; @@ -72,9 +72,7 @@ dump_history_trace(circular_buffer_t *cb, void *data) gettimeofday () fails, it's safe to check tm and then dump the time at which the entry was added to the buffer */ - gf_time_fmt(timestr, sizeof timestr, cb->tv.tv_sec, gf_timefmt_Ymd_T); - snprintf(timestr + strlen(timestr), 256 - strlen(timestr), - ".%" GF_PRI_SUSECONDS, cb->tv.tv_usec); + gf_time_fmt_tv(timestr, sizeof timestr, &cb->tv, gf_timefmt_Ymd_T); gf_proc_dump_write("TIME", "%s", timestr); gf_proc_dump_write("FOP", "%s\n", (char *)cb->data); @@ -2209,10 +2207,10 @@ int trace_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf, int32_t valid, dict_t *xdata) { - char actime_str[256] = { + char actime_str[GF_TIMESTR_SIZE] = { 0, }; - char modtime_str[256] = { + char modtime_str[GF_TIMESTR_SIZE] = { 0, }; trace_conf_t *conf = NULL; @@ -2278,10 +2276,10 @@ int trace_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, int32_t valid, dict_t *xdata) { - char actime_str[256] = { + char actime_str[GF_TIMESTR_SIZE] = { 0, }; - char modtime_str[256] = { + char modtime_str[GF_TIMESTR_SIZE] = { 0, }; trace_conf_t *conf = NULL; @@ -3311,7 +3309,7 @@ init(xlator_t *this) char *forced_loglevel = NULL; eh_t *history = NULL; int ret = -1; - size_t history_size = TRACE_DEFAULT_HISTORY_SIZE; + uint64_t history_size = TRACE_DEFAULT_HISTORY_SIZE; trace_conf_t *conf = NULL; if (!this) @@ -3364,10 +3362,10 @@ init(xlator_t *this) if (excludes) process_call_list(excludes, 0); - GF_OPTION_INIT("history-size", conf->history_size, size, out); + GF_OPTION_INIT("history-size", history_size, size, out); + conf->history_size = history_size; - gf_log(this->name, GF_LOG_INFO, "history size %" GF_PRI_SIZET, - history_size); + gf_log(this->name, GF_LOG_INFO, "history size %" PRIu64, history_size); GF_OPTION_INIT("log-file", conf->log_file, bool, out); @@ -3520,3 +3518,17 @@ struct volume_options options[] = { }; struct xlator_dumpops dumpops = {.history = trace_dump_history}; + +xlator_api_t xlator_api = { + .init = init, + .fini = fini, + .reconfigure = reconfigure, + .mem_acct_init = mem_acct_init, + .op_version = {1}, + .dumpops = &dumpops, + .fops = &fops, + .cbks = &cbks, + .options = options, + .identifier = "trace", + .category = GF_TECH_PREVIEW, +}; diff --git a/xlators/debug/trace/src/trace.h b/xlators/debug/trace/src/trace.h index 815647c05be..b16304799da 100644 --- a/xlators/debug/trace/src/trace.h +++ b/xlators/debug/trace/src/trace.h @@ -10,14 +10,14 @@ #include <time.h> #include <errno.h> -#include "glusterfs.h" -#include "xlator.h" -#include "common-utils.h" -#include "event-history.h" -#include "logging.h" -#include "circ-buff.h" -#include "statedump.h" -#include "options.h" +#include <glusterfs/glusterfs.h> +#include <glusterfs/xlator.h> +#include <glusterfs/common-utils.h> +#include <glusterfs/event-history.h> +#include <glusterfs/logging.h> +#include <glusterfs/circ-buff.h> +#include <glusterfs/statedump.h> +#include <glusterfs/options.h> #define TRACE_DEFAULT_HISTORY_SIZE 1024 @@ -34,7 +34,7 @@ trace_fop_name_t trace_fop_names[GF_FOP_MAXVALUE]; typedef struct { gf_boolean_t log_file; gf_boolean_t log_history; - size_t history_size; + uint64_t history_size; int trace_log_level; } trace_conf_t; |
