diff options
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.c')
-rw-r--r-- | xlators/performance/io-threads/src/io-threads.c | 1968 |
1 files changed, 973 insertions, 995 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c index 832291d3a6d..78678adb859 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -23,281 +23,281 @@ #include "io-threads-messages.h" #include "timespec.h" -void *iot_worker (void *arg); -int iot_workers_scale (iot_conf_t *conf); -int __iot_workers_scale (iot_conf_t *conf); +void * +iot_worker(void *arg); +int +iot_workers_scale(iot_conf_t *conf); +int +__iot_workers_scale(iot_conf_t *conf); struct volume_options options[]; -#define IOT_FOP(name, frame, this, args ...) \ - do { \ - call_stub_t *__stub = NULL; \ - int __ret = -1; \ +#define IOT_FOP(name, frame, this, args...) \ + do { \ + call_stub_t *__stub = NULL; \ + int __ret = -1; \ \ - __stub = fop_##name##_stub(frame, default_##name##_resume, args); \ - if (!__stub) { \ - __ret = -ENOMEM; \ - goto out; \ - } \ + __stub = fop_##name##_stub(frame, default_##name##_resume, args); \ + if (!__stub) { \ + __ret = -ENOMEM; \ + goto out; \ + } \ \ - __ret = iot_schedule (frame, this, __stub); \ + __ret = iot_schedule(frame, this, __stub); \ \ - out: \ - if (__ret < 0) { \ - default_##name##_failure_cbk (frame, -__ret); \ - if (__stub != NULL) { \ - call_stub_destroy (__stub); \ - } \ - } \ - } while (0) + out: \ + if (__ret < 0) { \ + default_##name##_failure_cbk(frame, -__ret); \ + if (__stub != NULL) { \ + call_stub_destroy(__stub); \ + } \ + } \ + } while (0) iot_client_ctx_t * -iot_get_ctx (xlator_t *this, client_t *client) -{ - iot_client_ctx_t *ctx = NULL; - iot_client_ctx_t *setted_ctx = NULL; - int i; - - if (client_ctx_get (client, this, (void **)&ctx) != 0) { - ctx = GF_CALLOC (GF_FOP_PRI_MAX, sizeof(*ctx), - gf_iot_mt_client_ctx_t); - if (ctx) { - for (i = 0; i < GF_FOP_PRI_MAX; ++i) { - INIT_LIST_HEAD (&ctx[i].clients); - INIT_LIST_HEAD (&ctx[i].reqs); - } - setted_ctx = client_ctx_set (client, this, ctx); - if (ctx != setted_ctx) { - GF_FREE (ctx); - ctx = setted_ctx; - } - } +iot_get_ctx(xlator_t *this, client_t *client) +{ + iot_client_ctx_t *ctx = NULL; + iot_client_ctx_t *setted_ctx = NULL; + int i; + + if (client_ctx_get(client, this, (void **)&ctx) != 0) { + ctx = GF_CALLOC(GF_FOP_PRI_MAX, sizeof(*ctx), gf_iot_mt_client_ctx_t); + if (ctx) { + for (i = 0; i < GF_FOP_PRI_MAX; ++i) { + INIT_LIST_HEAD(&ctx[i].clients); + INIT_LIST_HEAD(&ctx[i].reqs); + } + setted_ctx = client_ctx_set(client, this, ctx); + if (ctx != setted_ctx) { + GF_FREE(ctx); + ctx = setted_ctx; + } } + } - return ctx; + return ctx; } call_stub_t * -__iot_dequeue (iot_conf_t *conf, int *pri) +__iot_dequeue(iot_conf_t *conf, int *pri) { - call_stub_t *stub = NULL; - int i = 0; - iot_client_ctx_t *ctx; - - *pri = -1; - for (i = 0; i < GF_FOP_PRI_MAX; i++) { + call_stub_t *stub = NULL; + int i = 0; + iot_client_ctx_t *ctx; - if (conf->ac_iot_count[i] >= conf->ac_iot_limit[i]) { - continue; - } - - if (list_empty (&conf->clients[i])) { - continue; - } + *pri = -1; + for (i = 0; i < GF_FOP_PRI_MAX; i++) { + if (conf->ac_iot_count[i] >= conf->ac_iot_limit[i]) { + continue; + } - /* Get the first per-client queue for this priority. */ - ctx = list_first_entry (&conf->clients[i], - iot_client_ctx_t, clients); - if (!ctx) { - continue; - } + if (list_empty(&conf->clients[i])) { + continue; + } - if (list_empty (&ctx->reqs)) { - continue; - } + /* Get the first per-client queue for this priority. */ + ctx = list_first_entry(&conf->clients[i], iot_client_ctx_t, clients); + if (!ctx) { + continue; + } - /* Get the first request on that queue. */ - stub = list_first_entry (&ctx->reqs, call_stub_t, list); - list_del_init (&stub->list); - if (list_empty (&ctx->reqs)) { - list_del_init (&ctx->clients); - } else { - list_rotate_left (&conf->clients[i]); - } + if (list_empty(&ctx->reqs)) { + continue; + } - conf->ac_iot_count[i]++; - conf->queue_marked[i] = _gf_false; - *pri = i; - break; + /* Get the first request on that queue. */ + stub = list_first_entry(&ctx->reqs, call_stub_t, list); + list_del_init(&stub->list); + if (list_empty(&ctx->reqs)) { + list_del_init(&ctx->clients); + } else { + list_rotate_left(&conf->clients[i]); } - if (!stub) - return NULL; + conf->ac_iot_count[i]++; + conf->queue_marked[i] = _gf_false; + *pri = i; + break; + } + + if (!stub) + return NULL; - conf->queue_size--; - conf->queue_sizes[*pri]--; + conf->queue_size--; + conf->queue_sizes[*pri]--; - return stub; + return stub; } void -__iot_enqueue (iot_conf_t *conf, call_stub_t *stub, int pri) +__iot_enqueue(iot_conf_t *conf, call_stub_t *stub, int pri) { - client_t *client = stub->frame->root->client; - iot_client_ctx_t *ctx; + client_t *client = stub->frame->root->client; + iot_client_ctx_t *ctx; - if (pri < 0 || pri >= GF_FOP_PRI_MAX) - pri = GF_FOP_PRI_MAX-1; + if (pri < 0 || pri >= GF_FOP_PRI_MAX) + pri = GF_FOP_PRI_MAX - 1; - if (client) { - ctx = iot_get_ctx (THIS, client); - if (ctx) { - ctx = &ctx[pri]; - } - } else { - ctx = NULL; - } - if (!ctx) { - ctx = &conf->no_client[pri]; + if (client) { + ctx = iot_get_ctx(THIS, client); + if (ctx) { + ctx = &ctx[pri]; } + } else { + ctx = NULL; + } + if (!ctx) { + ctx = &conf->no_client[pri]; + } - if (list_empty (&ctx->reqs)) { - list_add_tail (&ctx->clients, &conf->clients[pri]); - } - list_add_tail (&stub->list, &ctx->reqs); + if (list_empty(&ctx->reqs)) { + list_add_tail(&ctx->clients, &conf->clients[pri]); + } + list_add_tail(&stub->list, &ctx->reqs); - conf->queue_size++; - conf->queue_sizes[pri]++; + conf->queue_size++; + conf->queue_sizes[pri]++; } void * -iot_worker (void *data) -{ - iot_conf_t *conf = NULL; - xlator_t *this = NULL; - call_stub_t *stub = NULL; - struct timespec sleep_till = {0, }; - int ret = 0; - int pri = -1; - gf_boolean_t bye = _gf_false; - - conf = data; - this = conf->this; - THIS = this; - - for (;;) { - pthread_mutex_lock (&conf->mutex); - { - if (pri != -1) { - conf->ac_iot_count[pri]--; - pri = -1; - } - while (conf->queue_size == 0) { - if (conf->down) { - bye = _gf_true;/*Avoid sleep*/ - break; - } - - clock_gettime (CLOCK_REALTIME_COARSE, - &sleep_till); - sleep_till.tv_sec += conf->idle_time; - - conf->sleep_count++; - ret = pthread_cond_timedwait (&conf->cond, - &conf->mutex, - &sleep_till); - conf->sleep_count--; - - if (conf->down || ret == ETIMEDOUT) { - bye = _gf_true; - break; - } - } - - if (bye) { - if (conf->down || conf->curr_count > IOT_MIN_THREADS) { - conf->curr_count--; - if (conf->curr_count == 0) - pthread_cond_broadcast (&conf->cond); - gf_msg_debug (conf->this->name, 0, - "terminated. " - "conf->curr_count=%d", - conf->curr_count); - } else { - bye = _gf_false; - } - } - - if (!bye) - stub = __iot_dequeue (conf, &pri); +iot_worker(void *data) +{ + iot_conf_t *conf = NULL; + xlator_t *this = NULL; + call_stub_t *stub = NULL; + struct timespec sleep_till = { + 0, + }; + int ret = 0; + int pri = -1; + gf_boolean_t bye = _gf_false; + + conf = data; + this = conf->this; + THIS = this; + + for (;;) { + pthread_mutex_lock(&conf->mutex); + { + if (pri != -1) { + conf->ac_iot_count[pri]--; + pri = -1; + } + while (conf->queue_size == 0) { + if (conf->down) { + bye = _gf_true; /*Avoid sleep*/ + break; + } + + clock_gettime(CLOCK_REALTIME_COARSE, &sleep_till); + sleep_till.tv_sec += conf->idle_time; + + conf->sleep_count++; + ret = pthread_cond_timedwait(&conf->cond, &conf->mutex, + &sleep_till); + conf->sleep_count--; + + if (conf->down || ret == ETIMEDOUT) { + bye = _gf_true; + break; } - pthread_mutex_unlock (&conf->mutex); - - if (stub) { /* guard against spurious wakeups */ - if (stub->poison) { - gf_log (this->name, GF_LOG_INFO, - "Dropping poisoned request %p.", stub); - call_stub_destroy (stub); - } else { - call_resume (stub); - } + } + + if (bye) { + if (conf->down || conf->curr_count > IOT_MIN_THREADS) { + conf->curr_count--; + if (conf->curr_count == 0) + pthread_cond_broadcast(&conf->cond); + gf_msg_debug(conf->this->name, 0, + "terminated. " + "conf->curr_count=%d", + conf->curr_count); + } else { + bye = _gf_false; } - stub = NULL; + } - if (bye) - break; + if (!bye) + stub = __iot_dequeue(conf, &pri); + } + pthread_mutex_unlock(&conf->mutex); + + if (stub) { /* guard against spurious wakeups */ + if (stub->poison) { + gf_log(this->name, GF_LOG_INFO, "Dropping poisoned request %p.", + stub); + call_stub_destroy(stub); + } else { + call_resume(stub); + } } + stub = NULL; - return NULL; + if (bye) + break; + } + + return NULL; } int -do_iot_schedule (iot_conf_t *conf, call_stub_t *stub, int pri) +do_iot_schedule(iot_conf_t *conf, call_stub_t *stub, int pri) { - int ret = 0; + int ret = 0; - pthread_mutex_lock (&conf->mutex); - { - __iot_enqueue (conf, stub, pri); + pthread_mutex_lock(&conf->mutex); + { + __iot_enqueue(conf, stub, pri); - pthread_cond_signal (&conf->cond); + pthread_cond_signal(&conf->cond); - ret = __iot_workers_scale (conf); - } - pthread_mutex_unlock (&conf->mutex); + ret = __iot_workers_scale(conf); + } + pthread_mutex_unlock(&conf->mutex); - return ret; + return ret; } -char* -iot_get_pri_meaning (gf_fop_pri_t pri) +char * +iot_get_pri_meaning(gf_fop_pri_t pri) { - char *name = NULL; - switch (pri) { + char *name = NULL; + switch (pri) { case GF_FOP_PRI_HI: - name = "fast"; - break; + name = "fast"; + break; case GF_FOP_PRI_NORMAL: - name = "normal"; - break; + name = "normal"; + break; case GF_FOP_PRI_LO: - name = "slow"; - break; + name = "slow"; + break; case GF_FOP_PRI_LEAST: - name = "least priority"; - break; + name = "least priority"; + break; case GF_FOP_PRI_MAX: - name = "invalid"; - break; + name = "invalid"; + break; case GF_FOP_PRI_UNSPEC: - name = "unspecified"; - break; - } - return name; + name = "unspecified"; + break; + } + return name; } int -iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub) +iot_schedule(call_frame_t *frame, xlator_t *this, call_stub_t *stub) { - int ret = -1; - gf_fop_pri_t pri = GF_FOP_PRI_MAX - 1; - iot_conf_t *conf = this->private; + int ret = -1; + gf_fop_pri_t pri = GF_FOP_PRI_MAX - 1; + iot_conf_t *conf = this->private; - if ((frame->root->pid < GF_CLIENT_PID_MAX) && conf->least_priority) { - pri = GF_FOP_PRI_LEAST; - goto out; - } + if ((frame->root->pid < GF_CLIENT_PID_MAX) && conf->least_priority) { + pri = GF_FOP_PRI_LEAST; + goto out; + } - switch (stub->fop) { + switch (stub->fop) { case GF_FOP_OPEN: case GF_FOP_STAT: case GF_FOP_FSTAT: @@ -312,8 +312,8 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub) case GF_FOP_SETACTIVELK: case GF_FOP_ICREATE: case GF_FOP_NAMELINK: - pri = GF_FOP_PRI_HI; - break; + pri = GF_FOP_PRI_HI; + break; case GF_FOP_CREATE: case GF_FOP_FLUSH: @@ -339,8 +339,8 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub) case GF_FOP_REMOVEXATTR: case GF_FOP_FREMOVEXATTR: case GF_FOP_PUT: - pri = GF_FOP_PRI_NORMAL; - break; + pri = GF_FOP_PRI_NORMAL; + break; case GF_FOP_READ: case GF_FOP_WRITE: @@ -355,613 +355,603 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub) case GF_FOP_DISCARD: case GF_FOP_ZEROFILL: case GF_FOP_SEEK: - pri = GF_FOP_PRI_LO; - break; + pri = GF_FOP_PRI_LO; + break; case GF_FOP_FORGET: case GF_FOP_RELEASE: case GF_FOP_RELEASEDIR: case GF_FOP_GETSPEC: - break; + break; case GF_FOP_IPC: default: - return -EINVAL; - } + return -EINVAL; + } out: - gf_msg_debug (this->name, 0, "%s scheduled as %s fop", - gf_fop_list[stub->fop], iot_get_pri_meaning (pri)); - if (this->private) - ret = do_iot_schedule (this->private, stub, pri); - return ret; + gf_msg_debug(this->name, 0, "%s scheduled as %s fop", + gf_fop_list[stub->fop], iot_get_pri_meaning(pri)); + if (this->private) + ret = do_iot_schedule(this->private, stub, pri); + return ret; } int -iot_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) +iot_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - IOT_FOP (lookup, frame, this, loc, xdata); - return 0; + IOT_FOP(lookup, frame, this, loc, xdata); + return 0; } int -iot_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - struct iatt *stbuf, int32_t valid, dict_t *xdata) +iot_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf, + int32_t valid, dict_t *xdata) { - IOT_FOP (setattr, frame, this, loc, stbuf, valid, xdata); - return 0; + IOT_FOP(setattr, frame, this, loc, stbuf, valid, xdata); + return 0; } int -iot_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, - struct iatt *stbuf, int32_t valid, dict_t *xdata) +iot_fsetattr(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, + int32_t valid, dict_t *xdata) { - IOT_FOP (fsetattr, frame, this, fd, stbuf, valid, xdata); - return 0; + IOT_FOP(fsetattr, frame, this, fd, stbuf, valid, xdata); + return 0; } int -iot_access (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask, - dict_t *xdata) +iot_access(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t mask, + dict_t *xdata) { - IOT_FOP (access, frame, this, loc, mask, xdata); - return 0; + IOT_FOP(access, frame, this, loc, mask, xdata); + return 0; } int -iot_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size, dict_t *xdata) +iot_readlink(call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size, + dict_t *xdata) { - IOT_FOP (readlink, frame, this, loc, size, xdata); - return 0; + IOT_FOP(readlink, frame, this, loc, size, xdata); + return 0; } int -iot_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, - dev_t rdev, mode_t umask, dict_t *xdata) +iot_mknod(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, + dev_t rdev, mode_t umask, dict_t *xdata) { - IOT_FOP (mknod, frame, this, loc, mode, rdev, umask, xdata); - return 0; + IOT_FOP(mknod, frame, this, loc, mode, rdev, umask, xdata); + return 0; } int -iot_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, - mode_t umask, dict_t *xdata) +iot_mkdir(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, + mode_t umask, dict_t *xdata) { - IOT_FOP (mkdir, frame, this, loc, mode, umask, xdata); - return 0; + IOT_FOP(mkdir, frame, this, loc, mode, umask, xdata); + return 0; } int -iot_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, dict_t *xdata) +iot_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, + dict_t *xdata) { - IOT_FOP (rmdir, frame, this, loc, flags, xdata); - return 0; + IOT_FOP(rmdir, frame, this, loc, flags, xdata); + return 0; } int -iot_symlink (call_frame_t *frame, xlator_t *this, const char *linkname, - loc_t *loc, mode_t umask, dict_t *xdata) +iot_symlink(call_frame_t *frame, xlator_t *this, const char *linkname, + loc_t *loc, mode_t umask, dict_t *xdata) { - IOT_FOP (symlink, frame, this, linkname, loc, umask, xdata); - return 0; + IOT_FOP(symlink, frame, this, linkname, loc, umask, xdata); + return 0; } int -iot_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, - dict_t *xdata) +iot_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, + dict_t *xdata) { - IOT_FOP (rename, frame, this, oldloc, newloc, xdata); - return 0; + IOT_FOP(rename, frame, this, oldloc, newloc, xdata); + return 0; } int -iot_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, - fd_t *fd, dict_t *xdata) +iot_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, + fd_t *fd, dict_t *xdata) { - IOT_FOP (open, frame, this, loc, flags, fd, xdata); - return 0; + IOT_FOP(open, frame, this, loc, flags, fd, xdata); + return 0; } int -iot_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, - mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata) +iot_create(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, + mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata) { - IOT_FOP (create, frame, this, loc, flags, mode, umask, fd, xdata); - return 0; + IOT_FOP(create, frame, this, loc, flags, mode, umask, fd, xdata); + return 0; } +int +iot_put(call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, + mode_t umask, uint32_t flags, struct iovec *vector, int32_t count, + off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata) +{ + IOT_FOP(put, frame, this, loc, mode, umask, flags, vector, count, offset, + iobref, xattr, xdata); + return 0; +} int -iot_put (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, - mode_t umask, uint32_t flags, struct iovec *vector, int32_t count, - off_t offset, struct iobref *iobref, dict_t *xattr, dict_t *xdata) +iot_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, + off_t offset, uint32_t flags, dict_t *xdata) { - IOT_FOP (put, frame, this, loc, mode, umask, flags, vector, count, - offset, iobref, xattr, xdata); - return 0; + IOT_FOP(readv, frame, this, fd, size, offset, flags, xdata); + return 0; } int -iot_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t offset, uint32_t flags, dict_t *xdata) +iot_flush(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) { - IOT_FOP (readv, frame, this, fd, size, offset, flags, xdata); - return 0; + IOT_FOP(flush, frame, this, fd, xdata); + return 0; } int -iot_flush (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) +iot_fsync(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync, + dict_t *xdata) { - IOT_FOP (flush, frame, this, fd, xdata); - return 0; + IOT_FOP(fsync, frame, this, fd, datasync, xdata); + return 0; } int -iot_fsync (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t datasync, +iot_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, + int32_t count, off_t offset, uint32_t flags, struct iobref *iobref, dict_t *xdata) { - IOT_FOP (fsync, frame, this, fd, datasync, xdata); - return 0; + IOT_FOP(writev, frame, this, fd, vector, count, offset, flags, iobref, + xdata); + return 0; } int -iot_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, - struct iovec *vector, int32_t count, off_t offset, - uint32_t flags, struct iobref *iobref, dict_t *xdata) +iot_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, + struct gf_flock *flock, dict_t *xdata) { - IOT_FOP (writev, frame, this, fd, vector, count, offset, - flags, iobref, xdata); - return 0; + IOT_FOP(lk, frame, this, fd, cmd, flock, xdata); + return 0; } int -iot_lk (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd, - struct gf_flock *flock, dict_t *xdata) +iot_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - IOT_FOP (lk, frame, this, fd, cmd, flock, xdata); - return 0; + IOT_FOP(stat, frame, this, loc, xdata); + return 0; } int -iot_stat (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) +iot_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) { - IOT_FOP (stat, frame, this, loc, xdata); - return 0; + IOT_FOP(fstat, frame, this, fd, xdata); + return 0; } int -iot_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) +iot_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, + dict_t *xdata) { - IOT_FOP (fstat, frame, this, fd, xdata); - return 0; + IOT_FOP(truncate, frame, this, loc, offset, xdata); + return 0; } int -iot_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, +iot_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, dict_t *xdata) { - IOT_FOP (truncate, frame, this, loc, offset, xdata); - return 0; + IOT_FOP(ftruncate, frame, this, fd, offset, xdata); + return 0; } int -iot_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - dict_t *xdata) +iot_unlink(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t xflag, + dict_t *xdata) { - IOT_FOP (ftruncate, frame, this, fd, offset, xdata); - return 0; + IOT_FOP(unlink, frame, this, loc, xflag, xdata); + return 0; } int -iot_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t xflag, - dict_t *xdata) +iot_link(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, + dict_t *xdata) { - IOT_FOP (unlink, frame, this, loc, xflag, xdata); - return 0; + IOT_FOP(link, frame, this, oldloc, newloc, xdata); + return 0; } int -iot_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, - dict_t *xdata) +iot_opendir(call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, + dict_t *xdata) { - IOT_FOP (link, frame, this, oldloc, newloc, xdata); - return 0; + IOT_FOP(opendir, frame, this, loc, fd, xdata); + return 0; } int -iot_opendir (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, +iot_fsyncdir(call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync, dict_t *xdata) { - IOT_FOP (opendir, frame, this, loc, fd, xdata); - return 0; + IOT_FOP(fsyncdir, frame, this, fd, datasync, xdata); + return 0; } int -iot_fsyncdir (call_frame_t *frame, xlator_t *this, fd_t *fd, int datasync, - dict_t *xdata) +iot_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - IOT_FOP (fsyncdir, frame, this, fd, datasync, xdata); - return 0; + IOT_FOP(statfs, frame, this, loc, xdata); + return 0; } int -iot_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) +iot_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, + int32_t flags, dict_t *xdata) { - IOT_FOP (statfs, frame, this, loc, xdata); - return 0; + IOT_FOP(setxattr, frame, this, loc, dict, flags, xdata); + return 0; } int -iot_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata) +iot_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, const char *name, + dict_t *xdata) { - IOT_FOP (setxattr, frame, this, loc, dict, flags, xdata); - return 0; -} - -int -iot_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name, dict_t *xdata) -{ - iot_conf_t *conf = NULL; - dict_t *depths = NULL; - int i = 0; - int32_t op_ret = 0; - int32_t op_errno = 0; - - conf = this->private; - - if (conf && name && strcmp (name, IO_THREADS_QUEUE_SIZE_KEY) == 0) { - /* - * We explicitly do not want a reference count - * for this dict in this translator - */ - depths = dict_new (); - if (!depths) { - op_ret = -1; - op_errno = ENOMEM; - goto unwind_special_getxattr; - } - - for (i = 0; i < GF_FOP_PRI_MAX; i++) { - if (dict_set_int32 (depths, - (char *)fop_pri_to_string (i), - conf->queue_sizes[i]) != 0) { - dict_unref (depths); - depths = NULL; - goto unwind_special_getxattr; - } - } + iot_conf_t *conf = NULL; + dict_t *depths = NULL; + int i = 0; + int32_t op_ret = 0; + int32_t op_errno = 0; + + conf = this->private; + + if (conf && name && strcmp(name, IO_THREADS_QUEUE_SIZE_KEY) == 0) { + /* + * We explicitly do not want a reference count + * for this dict in this translator + */ + depths = dict_new(); + if (!depths) { + op_ret = -1; + op_errno = ENOMEM; + goto unwind_special_getxattr; + } -unwind_special_getxattr: - STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, - depths, xdata); - if (depths) - dict_unref(depths); - return 0; + for (i = 0; i < GF_FOP_PRI_MAX; i++) { + if (dict_set_int32(depths, (char *)fop_pri_to_string(i), + conf->queue_sizes[i]) != 0) { + dict_unref(depths); + depths = NULL; + goto unwind_special_getxattr; + } } - IOT_FOP (getxattr, frame, this, loc, name, xdata); + unwind_special_getxattr: + STACK_UNWIND_STRICT(getxattr, frame, op_ret, op_errno, depths, xdata); + if (depths) + dict_unref(depths); return 0; + } + + IOT_FOP(getxattr, frame, this, loc, name, xdata); + return 0; } int -iot_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, - const char *name, dict_t *xdata) +iot_fgetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name, + dict_t *xdata) { - IOT_FOP (fgetxattr, frame, this, fd, name, xdata); - return 0; + IOT_FOP(fgetxattr, frame, this, fd, name, xdata); + return 0; } - int -iot_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict, - int32_t flags, dict_t *xdata) +iot_fsetxattr(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict, + int32_t flags, dict_t *xdata) { - IOT_FOP (fsetxattr, frame, this, fd, dict, flags, xdata); - return 0; + IOT_FOP(fsetxattr, frame, this, fd, dict, flags, xdata); + return 0; } int -iot_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name, dict_t *xdata) +iot_removexattr(call_frame_t *frame, xlator_t *this, loc_t *loc, + const char *name, dict_t *xdata) { - IOT_FOP (removexattr, frame, this, loc, name, xdata); - return 0; + IOT_FOP(removexattr, frame, this, loc, name, xdata); + return 0; } int -iot_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd, +iot_fremovexattr(call_frame_t *frame, xlator_t *this, fd_t *fd, const char *name, dict_t *xdata) { - IOT_FOP (fremovexattr, frame, this, fd, name, xdata); - return 0; + IOT_FOP(fremovexattr, frame, this, fd, name, xdata); + return 0; } int -iot_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t offset, dict_t *xdata) +iot_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, + off_t offset, dict_t *xdata) { - IOT_FOP (readdirp, frame, this, fd, size, offset, xdata); - return 0; + IOT_FOP(readdirp, frame, this, fd, size, offset, xdata); + return 0; } int -iot_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t offset, dict_t *xdata) +iot_readdir(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, + off_t offset, dict_t *xdata) { - IOT_FOP (readdir, frame, this, fd, size, offset, xdata); - return 0; + IOT_FOP(readdir, frame, this, fd, size, offset, xdata); + return 0; } int -iot_inodelk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, int32_t cmd, struct gf_flock *lock, - dict_t *xdata) +iot_inodelk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc, + int32_t cmd, struct gf_flock *lock, dict_t *xdata) { - IOT_FOP (inodelk, frame, this, volume, loc, cmd, lock, xdata); - return 0; + IOT_FOP(inodelk, frame, this, volume, loc, cmd, lock, xdata); + return 0; } int -iot_finodelk (call_frame_t *frame, xlator_t *this, - const char *volume, fd_t *fd, int32_t cmd, struct gf_flock *lock, - dict_t *xdata) +iot_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd, + int32_t cmd, struct gf_flock *lock, dict_t *xdata) { - IOT_FOP (finodelk, frame, this, volume, fd, cmd, lock, xdata); - return 0; + IOT_FOP(finodelk, frame, this, volume, fd, cmd, lock, xdata); + return 0; } int -iot_entrylk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, const char *basename, - entrylk_cmd cmd, entrylk_type type, dict_t *xdata) +iot_entrylk(call_frame_t *frame, xlator_t *this, const char *volume, loc_t *loc, + const char *basename, entrylk_cmd cmd, entrylk_type type, + dict_t *xdata) { - IOT_FOP (entrylk, frame, this, volume, loc, basename, cmd, type, xdata); - return 0; + IOT_FOP(entrylk, frame, this, volume, loc, basename, cmd, type, xdata); + return 0; } int -iot_fentrylk (call_frame_t *frame, xlator_t *this, - const char *volume, fd_t *fd, const char *basename, - entrylk_cmd cmd, entrylk_type type, dict_t *xdata) +iot_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd, + const char *basename, entrylk_cmd cmd, entrylk_type type, + dict_t *xdata) { - IOT_FOP (fentrylk, frame, this, volume, fd, basename, cmd, type, xdata); - return 0; + IOT_FOP(fentrylk, frame, this, volume, fd, basename, cmd, type, xdata); + return 0; } int -iot_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, - gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata) +iot_xattrop(call_frame_t *frame, xlator_t *this, loc_t *loc, + gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata) { - IOT_FOP (xattrop, frame, this, loc, optype, xattr, xdata); - return 0; + IOT_FOP(xattrop, frame, this, loc, optype, xattr, xdata); + return 0; } int -iot_fxattrop (call_frame_t *frame, xlator_t *this, fd_t *fd, - gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata) +iot_fxattrop(call_frame_t *frame, xlator_t *this, fd_t *fd, + gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata) { - IOT_FOP (fxattrop, frame, this, fd, optype, xattr, xdata); - return 0; + IOT_FOP(fxattrop, frame, this, fd, optype, xattr, xdata); + return 0; } int32_t -iot_rchecksum (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - int32_t len, dict_t *xdata) +iot_rchecksum(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + int32_t len, dict_t *xdata) { - IOT_FOP (rchecksum, frame, this, fd, offset, len, xdata); - return 0; + IOT_FOP(rchecksum, frame, this, fd, offset, len, xdata); + return 0; } int -iot_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode, - off_t offset, size_t len, dict_t *xdata) +iot_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode, + off_t offset, size_t len, dict_t *xdata) { - IOT_FOP (fallocate, frame, this, fd, mode, offset, len, xdata); - return 0; + IOT_FOP(fallocate, frame, this, fd, mode, offset, len, xdata); + return 0; } int -iot_discard (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - size_t len, dict_t *xdata) +iot_discard(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + size_t len, dict_t *xdata) { - IOT_FOP (discard, frame, this, fd, offset, len, xdata); - return 0; + IOT_FOP(discard, frame, this, fd, offset, len, xdata); + return 0; } int -iot_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - off_t len, dict_t *xdata) +iot_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + off_t len, dict_t *xdata) { - IOT_FOP (zerofill, frame, this, fd, offset, len, xdata); - return 0; + IOT_FOP(zerofill, frame, this, fd, offset, len, xdata); + return 0; } int -iot_seek (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, - gf_seek_what_t what, dict_t *xdata) +iot_seek(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, + gf_seek_what_t what, dict_t *xdata) { - IOT_FOP (seek, frame, this, fd, offset, what, xdata); - return 0; + IOT_FOP(seek, frame, this, fd, offset, what, xdata); + return 0; } int -iot_lease (call_frame_t *frame, xlator_t *this, loc_t *loc, - struct gf_lease *lease, dict_t *xdata) +iot_lease(call_frame_t *frame, xlator_t *this, loc_t *loc, + struct gf_lease *lease, dict_t *xdata) { - IOT_FOP (lease, frame, this, loc, lease, xdata); - return 0; + IOT_FOP(lease, frame, this, loc, lease, xdata); + return 0; } int -iot_getactivelk (call_frame_t *frame, xlator_t *this, - loc_t *loc, dict_t *xdata) +iot_getactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) { - IOT_FOP (getactivelk, frame, this, loc, xdata); - return 0; + IOT_FOP(getactivelk, frame, this, loc, xdata); + return 0; } int -iot_setactivelk (call_frame_t *frame, xlator_t *this, loc_t *loc, - lock_migration_info_t *locklist, dict_t *xdata) +iot_setactivelk(call_frame_t *frame, xlator_t *this, loc_t *loc, + lock_migration_info_t *locklist, dict_t *xdata) { - IOT_FOP (setactivelk, frame, this, loc, locklist, xdata); - return 0; + IOT_FOP(setactivelk, frame, this, loc, locklist, xdata); + return 0; } int -__iot_workers_scale (iot_conf_t *conf) +__iot_workers_scale(iot_conf_t *conf) { - int scale = 0; - int diff = 0; - pthread_t thread; - int ret = 0; - int i = 0; - char thread_name[GF_THREAD_NAMEMAX] = {0,}; + int scale = 0; + int diff = 0; + pthread_t thread; + int ret = 0; + int i = 0; + char thread_name[GF_THREAD_NAMEMAX] = { + 0, + }; - for (i = 0; i < GF_FOP_PRI_MAX; i++) - scale += min (conf->queue_sizes[i], conf->ac_iot_limit[i]); + for (i = 0; i < GF_FOP_PRI_MAX; i++) + scale += min(conf->queue_sizes[i], conf->ac_iot_limit[i]); - if (scale < IOT_MIN_THREADS) - scale = IOT_MIN_THREADS; + if (scale < IOT_MIN_THREADS) + scale = IOT_MIN_THREADS; - if (scale > conf->max_count) - scale = conf->max_count; + if (scale > conf->max_count) + scale = conf->max_count; - if (conf->curr_count < scale) { - diff = scale - conf->curr_count; - } + if (conf->curr_count < scale) { + diff = scale - conf->curr_count; + } - while (diff) { - diff --; - - snprintf (thread_name, sizeof(thread_name), - "iotwr%03hx", (conf->curr_count & 0x3ff)); - ret = gf_thread_create (&thread, &conf->w_attr, iot_worker, - conf, thread_name); - if (ret == 0) { - conf->curr_count++; - gf_msg_debug (conf->this->name, 0, - "scaled threads to %d (queue_size=%d/%d)", - conf->curr_count, - conf->queue_size, scale); - } else { - break; - } + while (diff) { + diff--; + + snprintf(thread_name, sizeof(thread_name), "iotwr%03hx", + (conf->curr_count & 0x3ff)); + ret = gf_thread_create(&thread, &conf->w_attr, iot_worker, conf, + thread_name); + if (ret == 0) { + conf->curr_count++; + gf_msg_debug(conf->this->name, 0, + "scaled threads to %d (queue_size=%d/%d)", + conf->curr_count, conf->queue_size, scale); + } else { + break; } + } - return diff; + return diff; } int -iot_workers_scale (iot_conf_t *conf) +iot_workers_scale(iot_conf_t *conf) { - int ret = -1; + int ret = -1; - if (conf == NULL) { - ret = -EINVAL; - goto out; - } + if (conf == NULL) { + ret = -EINVAL; + goto out; + } - pthread_mutex_lock (&conf->mutex); - { - ret = __iot_workers_scale (conf); - } - pthread_mutex_unlock (&conf->mutex); + pthread_mutex_lock(&conf->mutex); + { + ret = __iot_workers_scale(conf); + } + pthread_mutex_unlock(&conf->mutex); out: - return ret; + return ret; } int -set_stack_size (iot_conf_t *conf) +set_stack_size(iot_conf_t *conf) { - int err = 0; - size_t stacksize = IOT_THREAD_STACK_SIZE; - xlator_t *this = NULL; - - this = THIS; + int err = 0; + size_t stacksize = IOT_THREAD_STACK_SIZE; + xlator_t *this = NULL; - err = pthread_attr_init (&conf->w_attr); - if (err != 0) { - gf_msg (this->name, GF_LOG_ERROR, err, - IO_THREADS_MSG_INIT_FAILED, - "Thread attribute initialization failed"); - return err; - } + this = THIS; - err = pthread_attr_setstacksize (&conf->w_attr, stacksize); - if (err == EINVAL) { - err = pthread_attr_getstacksize (&conf->w_attr, &stacksize); - if (!err) { - gf_msg (this->name, GF_LOG_WARNING, - 0, IO_THREADS_MSG_SIZE_NOT_SET, - "Using default thread stack size %zd", - stacksize); - } else { - gf_msg (this->name, GF_LOG_WARNING, - 0, IO_THREADS_MSG_SIZE_NOT_SET, - "Using default thread stack size"); - err = 0; - } + err = pthread_attr_init(&conf->w_attr); + if (err != 0) { + gf_msg(this->name, GF_LOG_ERROR, err, IO_THREADS_MSG_INIT_FAILED, + "Thread attribute initialization failed"); + return err; + } + + err = pthread_attr_setstacksize(&conf->w_attr, stacksize); + if (err == EINVAL) { + err = pthread_attr_getstacksize(&conf->w_attr, &stacksize); + if (!err) { + gf_msg(this->name, GF_LOG_WARNING, 0, IO_THREADS_MSG_SIZE_NOT_SET, + "Using default thread stack size %zd", stacksize); + } else { + gf_msg(this->name, GF_LOG_WARNING, 0, IO_THREADS_MSG_SIZE_NOT_SET, + "Using default thread stack size"); + err = 0; } + } - conf->stack_size = stacksize; - return err; + conf->stack_size = stacksize; + return err; } int32_t -mem_acct_init (xlator_t *this) +mem_acct_init(xlator_t *this) { - int ret = -1; + int ret = -1; - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_iot_mt_end + 1); + if (!this) + return ret; - if (ret != 0) { - gf_msg (this->name, GF_LOG_ERROR, - ENOMEM, IO_THREADS_MSG_NO_MEMORY, - "Memory accounting init failed"); - return ret; - } + ret = xlator_mem_acct_init(this, gf_iot_mt_end + 1); + if (ret != 0) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, IO_THREADS_MSG_NO_MEMORY, + "Memory accounting init failed"); return ret; + } + + return ret; } int -iot_priv_dump (xlator_t *this) +iot_priv_dump(xlator_t *this) { - iot_conf_t *conf = NULL; - char key_prefix[GF_DUMP_MAX_BUF_LEN]; + iot_conf_t *conf = NULL; + char key_prefix[GF_DUMP_MAX_BUF_LEN]; - if (!this) - return 0; + if (!this) + return 0; - conf = this->private; - if (!conf) - return 0; + conf = this->private; + if (!conf) + return 0; - snprintf (key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s", this->type, - this->name); + snprintf(key_prefix, GF_DUMP_MAX_BUF_LEN, "%s.%s", this->type, this->name); - gf_proc_dump_add_section(key_prefix); + gf_proc_dump_add_section(key_prefix); - gf_proc_dump_write("maximum_threads_count", "%d", conf->max_count); - gf_proc_dump_write("current_threads_count", "%d", conf->curr_count); - gf_proc_dump_write("sleep_count", "%d", conf->sleep_count); - gf_proc_dump_write("idle_time", "%d", conf->idle_time); - gf_proc_dump_write("stack_size", "%zd", conf->stack_size); - gf_proc_dump_write("high_priority_threads", "%d", - conf->ac_iot_limit[GF_FOP_PRI_HI]); - gf_proc_dump_write("normal_priority_threads", "%d", - conf->ac_iot_limit[GF_FOP_PRI_NORMAL]); - gf_proc_dump_write("low_priority_threads", "%d", - conf->ac_iot_limit[GF_FOP_PRI_LO]); - gf_proc_dump_write("least_priority_threads", "%d", - conf->ac_iot_limit[GF_FOP_PRI_LEAST]); + gf_proc_dump_write("maximum_threads_count", "%d", conf->max_count); + gf_proc_dump_write("current_threads_count", "%d", conf->curr_count); + gf_proc_dump_write("sleep_count", "%d", conf->sleep_count); + gf_proc_dump_write("idle_time", "%d", conf->idle_time); + gf_proc_dump_write("stack_size", "%zd", conf->stack_size); + gf_proc_dump_write("high_priority_threads", "%d", + conf->ac_iot_limit[GF_FOP_PRI_HI]); + gf_proc_dump_write("normal_priority_threads", "%d", + conf->ac_iot_limit[GF_FOP_PRI_NORMAL]); + gf_proc_dump_write("low_priority_threads", "%d", + conf->ac_iot_limit[GF_FOP_PRI_LO]); + gf_proc_dump_write("least_priority_threads", "%d", + conf->ac_iot_limit[GF_FOP_PRI_LEAST]); - return 0; + return 0; } /* @@ -995,551 +985,539 @@ iot_priv_dump (xlator_t *this) */ typedef struct { - uint32_t value; - time_t update_time; + uint32_t value; + time_t update_time; } threshold_t; /* * Variables so that I can hack these for testing. * TBD: make these tunable? */ -static uint32_t THRESH_SECONDS = 604800; -static uint32_t THRESH_EVENTS = 3; -static uint32_t THRESH_LIMIT = 1209600; /* SECONDS * (EVENTS-1) */ +static uint32_t THRESH_SECONDS = 604800; +static uint32_t THRESH_EVENTS = 3; +static uint32_t THRESH_LIMIT = 1209600; /* SECONDS * (EVENTS-1) */ static void -iot_apply_event (xlator_t *this, threshold_t *thresh) +iot_apply_event(xlator_t *this, threshold_t *thresh) { - struct timespec now; - time_t delta; + struct timespec now; + time_t delta; - /* Refresh for manual testing/debugging. It's cheap. */ - THRESH_LIMIT = THRESH_SECONDS * (THRESH_EVENTS - 1); + /* Refresh for manual testing/debugging. It's cheap. */ + THRESH_LIMIT = THRESH_SECONDS * (THRESH_EVENTS - 1); - timespec_now (&now); + timespec_now(&now); - if (thresh->value && thresh->update_time) { - delta = now.tv_sec - thresh->update_time; - /* Be careful about underflow. */ - if (thresh->value <= delta) { - thresh->value = 0; - } else { - thresh->value -= delta; - } + if (thresh->value && thresh->update_time) { + delta = now.tv_sec - thresh->update_time; + /* Be careful about underflow. */ + if (thresh->value <= delta) { + thresh->value = 0; + } else { + thresh->value -= delta; } + } - thresh->value += THRESH_SECONDS; - if (thresh->value >= THRESH_LIMIT) { - gf_log (this->name, GF_LOG_EMERG, "watchdog firing too often"); - /* - * The default action for SIGTRAP is to dump core, but the fact - * that it's distinct from other signals we use means that - * there are other possibilities as well (e.g. drop into gdb or - * invoke a special handler). - */ - kill (getpid (), SIGTRAP); - } + thresh->value += THRESH_SECONDS; + if (thresh->value >= THRESH_LIMIT) { + gf_log(this->name, GF_LOG_EMERG, "watchdog firing too often"); + /* + * The default action for SIGTRAP is to dump core, but the fact + * that it's distinct from other signals we use means that + * there are other possibilities as well (e.g. drop into gdb or + * invoke a special handler). + */ + kill(getpid(), SIGTRAP); + } - thresh->update_time = now.tv_sec; + thresh->update_time = now.tv_sec; } static void * -iot_watchdog (void *arg) -{ - xlator_t *this = arg; - iot_conf_t *priv = this->private; - int i; - int bad_times[GF_FOP_PRI_MAX] = { 0, }; - threshold_t thresholds[GF_FOP_PRI_MAX] = { { 0, } }; - - for (;;) { - sleep (max (priv->watchdog_secs/5, 1)); - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); - pthread_mutex_lock (&priv->mutex); - for (i = 0; i < GF_FOP_PRI_MAX; ++i) { - if (priv->queue_marked[i]) { - if (++bad_times[i] >= 5) { - gf_log (this->name, GF_LOG_WARNING, - "queue %d stalled", i); - iot_apply_event (this, &thresholds[i]); - /* - * We might not get here if the event - * put us over our threshold. - */ - ++(priv->ac_iot_limit[i]); - bad_times[i] = 0; - } - } else { - bad_times[i] = 0; - } - priv->queue_marked[i] = (priv->queue_sizes[i] > 0); +iot_watchdog(void *arg) +{ + xlator_t *this = arg; + iot_conf_t *priv = this->private; + int i; + int bad_times[GF_FOP_PRI_MAX] = { + 0, + }; + threshold_t thresholds[GF_FOP_PRI_MAX] = {{ + 0, + }}; + + for (;;) { + sleep(max(priv->watchdog_secs / 5, 1)); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); + pthread_mutex_lock(&priv->mutex); + for (i = 0; i < GF_FOP_PRI_MAX; ++i) { + if (priv->queue_marked[i]) { + if (++bad_times[i] >= 5) { + gf_log(this->name, GF_LOG_WARNING, "queue %d stalled", i); + iot_apply_event(this, &thresholds[i]); + /* + * We might not get here if the event + * put us over our threshold. + */ + ++(priv->ac_iot_limit[i]); + bad_times[i] = 0; } - pthread_mutex_unlock (&priv->mutex); - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + } else { + bad_times[i] = 0; + } + priv->queue_marked[i] = (priv->queue_sizes[i] > 0); } + pthread_mutex_unlock(&priv->mutex); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + } - /* NOTREACHED */ - return NULL; + /* NOTREACHED */ + return NULL; } static void -start_iot_watchdog (xlator_t *this) +start_iot_watchdog(xlator_t *this) { - iot_conf_t *priv = this->private; - int ret; + iot_conf_t *priv = this->private; + int ret; - if (priv->watchdog_running) { - return; - } + if (priv->watchdog_running) { + return; + } - ret = pthread_create (&priv->watchdog_thread, NULL, iot_watchdog, this); - if (ret == 0) { - priv->watchdog_running = _gf_true; - } else { - gf_log (this->name, GF_LOG_WARNING, - "pthread_create(iot_watchdog) failed"); - } + ret = pthread_create(&priv->watchdog_thread, NULL, iot_watchdog, this); + if (ret == 0) { + priv->watchdog_running = _gf_true; + } else { + gf_log(this->name, GF_LOG_WARNING, + "pthread_create(iot_watchdog) failed"); + } } static void -stop_iot_watchdog (xlator_t *this) +stop_iot_watchdog(xlator_t *this) { - iot_conf_t *priv = this->private; + iot_conf_t *priv = this->private; - if (!priv->watchdog_running) { - return; - } + if (!priv->watchdog_running) { + return; + } - if (pthread_cancel (priv->watchdog_thread) != 0) { - gf_log (this->name, GF_LOG_WARNING, - "pthread_cancel(iot_watchdog) failed"); - } + if (pthread_cancel(priv->watchdog_thread) != 0) { + gf_log(this->name, GF_LOG_WARNING, + "pthread_cancel(iot_watchdog) failed"); + } - if (pthread_join (priv->watchdog_thread, NULL) != 0) { - gf_log (this->name, GF_LOG_WARNING, - "pthread_join(iot_watchdog) failed"); - } + if (pthread_join(priv->watchdog_thread, NULL) != 0) { + gf_log(this->name, GF_LOG_WARNING, "pthread_join(iot_watchdog) failed"); + } - /* Failure probably means it's already dead. */ - priv->watchdog_running = _gf_false; + /* Failure probably means it's already dead. */ + priv->watchdog_running = _gf_false; } int -reconfigure (xlator_t *this, dict_t *options) +reconfigure(xlator_t *this, dict_t *options) { - iot_conf_t *conf = NULL; - int ret = -1; + iot_conf_t *conf = NULL; + int ret = -1; - conf = this->private; - if (!conf) - goto out; + conf = this->private; + if (!conf) + goto out; - GF_OPTION_RECONF ("thread-count", conf->max_count, options, int32, out); + GF_OPTION_RECONF("thread-count", conf->max_count, options, int32, out); - GF_OPTION_RECONF ("high-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_HI], options, int32, - out); + GF_OPTION_RECONF("high-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_HI], + options, int32, out); - GF_OPTION_RECONF ("normal-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_NORMAL], options, int32, - out); + GF_OPTION_RECONF("normal-prio-threads", + conf->ac_iot_limit[GF_FOP_PRI_NORMAL], options, int32, + out); - GF_OPTION_RECONF ("low-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_LO], options, int32, - out); + GF_OPTION_RECONF("low-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_LO], + options, int32, out); - GF_OPTION_RECONF ("least-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_LEAST], options, int32, - out); + GF_OPTION_RECONF("least-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_LEAST], + options, int32, out); - GF_OPTION_RECONF ("enable-least-priority", conf->least_priority, - options, bool, out); + GF_OPTION_RECONF("enable-least-priority", conf->least_priority, options, + bool, out); - GF_OPTION_RECONF ("cleanup-disconnected-reqs", - conf->cleanup_disconnected_reqs, options, bool, out); + GF_OPTION_RECONF("cleanup-disconnected-reqs", + conf->cleanup_disconnected_reqs, options, bool, out); - GF_OPTION_RECONF ("watchdog-secs", conf->watchdog_secs, options, - int32, out); + GF_OPTION_RECONF("watchdog-secs", conf->watchdog_secs, options, int32, out); - GF_OPTION_RECONF ("pass-through", this->pass_through, options, bool, - out); + GF_OPTION_RECONF("pass-through", this->pass_through, options, bool, out); - if (conf->watchdog_secs > 0) { - start_iot_watchdog (this); - } else { - stop_iot_watchdog (this); - } + if (conf->watchdog_secs > 0) { + start_iot_watchdog(this); + } else { + stop_iot_watchdog(this); + } - ret = 0; + ret = 0; out: - return ret; + return ret; } int -init (xlator_t *this) -{ - iot_conf_t *conf = NULL; - int ret = -1; - int i = 0; - - if (!this->children || this->children->next) { - gf_msg ("io-threads", GF_LOG_ERROR, 0, - IO_THREADS_MSG_XLATOR_CHILD_MISCONFIGURED, - "FATAL: iot not configured " - "with exactly one child"); - goto out; - } - - if (!this->parents) { - gf_msg (this->name, GF_LOG_WARNING, 0, - IO_THREADS_MSG_VOL_MISCONFIGURED, - "dangling volume. check volfile "); - } - - conf = (void *) GF_CALLOC (1, sizeof (*conf), - gf_iot_mt_iot_conf_t); - if (conf == NULL) { - gf_msg (this->name, GF_LOG_ERROR, ENOMEM, - IO_THREADS_MSG_NO_MEMORY, "out of memory"); - goto out; - } +init(xlator_t *this) +{ + iot_conf_t *conf = NULL; + int ret = -1; + int i = 0; - if ((ret = pthread_cond_init(&conf->cond, NULL)) != 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - IO_THREADS_MSG_INIT_FAILED, - "pthread_cond_init failed (%d)", ret); - goto out; - } - conf->cond_inited = _gf_true; + if (!this->children || this->children->next) { + gf_msg("io-threads", GF_LOG_ERROR, 0, + IO_THREADS_MSG_XLATOR_CHILD_MISCONFIGURED, + "FATAL: iot not configured " + "with exactly one child"); + goto out; + } - if ((ret = pthread_mutex_init(&conf->mutex, NULL)) != 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - IO_THREADS_MSG_INIT_FAILED, - "pthread_mutex_init failed (%d)", ret); - goto out; - } - conf->mutex_inited = _gf_true; + if (!this->parents) { + gf_msg(this->name, GF_LOG_WARNING, 0, IO_THREADS_MSG_VOL_MISCONFIGURED, + "dangling volume. check volfile "); + } - ret = set_stack_size (conf); + conf = (void *)GF_CALLOC(1, sizeof(*conf), gf_iot_mt_iot_conf_t); + if (conf == NULL) { + gf_msg(this->name, GF_LOG_ERROR, ENOMEM, IO_THREADS_MSG_NO_MEMORY, + "out of memory"); + goto out; + } - if (ret != 0) - goto out; + if ((ret = pthread_cond_init(&conf->cond, NULL)) != 0) { + gf_msg(this->name, GF_LOG_ERROR, 0, IO_THREADS_MSG_INIT_FAILED, + "pthread_cond_init failed (%d)", ret); + goto out; + } + conf->cond_inited = _gf_true; - GF_OPTION_INIT ("thread-count", conf->max_count, int32, out); + if ((ret = pthread_mutex_init(&conf->mutex, NULL)) != 0) { + gf_msg(this->name, GF_LOG_ERROR, 0, IO_THREADS_MSG_INIT_FAILED, + "pthread_mutex_init failed (%d)", ret); + goto out; + } + conf->mutex_inited = _gf_true; - GF_OPTION_INIT ("high-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_HI], int32, out); + ret = set_stack_size(conf); - GF_OPTION_INIT ("normal-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_NORMAL], int32, out); + if (ret != 0) + goto out; - GF_OPTION_INIT ("low-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_LO], int32, out); + GF_OPTION_INIT("thread-count", conf->max_count, int32, out); - GF_OPTION_INIT ("least-prio-threads", - conf->ac_iot_limit[GF_FOP_PRI_LEAST], int32, out); + GF_OPTION_INIT("high-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_HI], + int32, out); - GF_OPTION_INIT ("idle-time", conf->idle_time, int32, out); + GF_OPTION_INIT("normal-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_NORMAL], + int32, out); - GF_OPTION_INIT ("enable-least-priority", conf->least_priority, - bool, out); + GF_OPTION_INIT("low-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_LO], int32, + out); - GF_OPTION_INIT ("cleanup-disconnected-reqs", - conf->cleanup_disconnected_reqs, bool, out); + GF_OPTION_INIT("least-prio-threads", conf->ac_iot_limit[GF_FOP_PRI_LEAST], + int32, out); - GF_OPTION_INIT ("pass-through", this->pass_through, bool, out); + GF_OPTION_INIT("idle-time", conf->idle_time, int32, out); - conf->this = this; + GF_OPTION_INIT("enable-least-priority", conf->least_priority, bool, out); - for (i = 0; i < GF_FOP_PRI_MAX; i++) { - INIT_LIST_HEAD (&conf->clients[i]); - INIT_LIST_HEAD (&conf->no_client[i].clients); - INIT_LIST_HEAD (&conf->no_client[i].reqs); - } + GF_OPTION_INIT("cleanup-disconnected-reqs", conf->cleanup_disconnected_reqs, + bool, out); - ret = iot_workers_scale (conf); + GF_OPTION_INIT("pass-through", this->pass_through, bool, out); - if (ret == -1) { - gf_msg (this->name, GF_LOG_ERROR, 0, - IO_THREADS_MSG_INIT_FAILED, - "cannot initialize worker threads, exiting init"); - goto out; - } + conf->this = this; - this->private = conf; + for (i = 0; i < GF_FOP_PRI_MAX; i++) { + INIT_LIST_HEAD(&conf->clients[i]); + INIT_LIST_HEAD(&conf->no_client[i].clients); + INIT_LIST_HEAD(&conf->no_client[i].reqs); + } - conf->watchdog_secs = 0; - GF_OPTION_INIT ("watchdog-secs", conf->watchdog_secs, int32, out); - if (conf->watchdog_secs > 0) { - start_iot_watchdog (this); - } + ret = iot_workers_scale(conf); + + if (ret == -1) { + gf_msg(this->name, GF_LOG_ERROR, 0, IO_THREADS_MSG_INIT_FAILED, + "cannot initialize worker threads, exiting init"); + goto out; + } - ret = 0; + this->private = conf; + + conf->watchdog_secs = 0; + GF_OPTION_INIT("watchdog-secs", conf->watchdog_secs, int32, out); + if (conf->watchdog_secs > 0) { + start_iot_watchdog(this); + } + + ret = 0; out: - if (ret) - GF_FREE (conf); + if (ret) + GF_FREE(conf); - return ret; + return ret; } static void -iot_exit_threads (iot_conf_t *conf) +iot_exit_threads(iot_conf_t *conf) { - pthread_mutex_lock (&conf->mutex); - { - conf->down = _gf_true; - /*Let all the threads know that xl is going down*/ - pthread_cond_broadcast (&conf->cond); - while (conf->curr_count)/*Wait for threads to exit*/ - pthread_cond_wait (&conf->cond, &conf->mutex); - } - pthread_mutex_unlock (&conf->mutex); + pthread_mutex_lock(&conf->mutex); + { + conf->down = _gf_true; + /*Let all the threads know that xl is going down*/ + pthread_cond_broadcast(&conf->cond); + while (conf->curr_count) /*Wait for threads to exit*/ + pthread_cond_wait(&conf->cond, &conf->mutex); + } + pthread_mutex_unlock(&conf->mutex); } int -notify (xlator_t *this, int32_t event, void *data, ...) +notify(xlator_t *this, int32_t event, void *data, ...) { - iot_conf_t *conf = this->private; + iot_conf_t *conf = this->private; - if (GF_EVENT_PARENT_DOWN == event) - iot_exit_threads (conf); + if (GF_EVENT_PARENT_DOWN == event) + iot_exit_threads(conf); - default_notify (this, event, data); + default_notify(this, event, data); - return 0; + return 0; } void -fini (xlator_t *this) +fini(xlator_t *this) { - iot_conf_t *conf = this->private; + iot_conf_t *conf = this->private; - if (!conf) - return; + if (!conf) + return; - if (conf->mutex_inited && conf->cond_inited) - iot_exit_threads (conf); + if (conf->mutex_inited && conf->cond_inited) + iot_exit_threads(conf); - if (conf->cond_inited) - pthread_cond_destroy (&conf->cond); + if (conf->cond_inited) + pthread_cond_destroy(&conf->cond); - if (conf->mutex_inited) - pthread_mutex_destroy (&conf->mutex); + if (conf->mutex_inited) + pthread_mutex_destroy(&conf->mutex); - stop_iot_watchdog (this); + stop_iot_watchdog(this); - GF_FREE (conf); + GF_FREE(conf); - this->private = NULL; - return; + this->private = NULL; + return; } int -iot_client_destroy (xlator_t *this, client_t *client) +iot_client_destroy(xlator_t *this, client_t *client) { - void *tmp = NULL; + void *tmp = NULL; - if (client_ctx_del (client, this, &tmp) == 0) { - GF_FREE (tmp); - } + if (client_ctx_del(client, this, &tmp) == 0) { + GF_FREE(tmp); + } - return 0; + return 0; } static int -iot_disconnect_cbk (xlator_t *this, client_t *client) -{ - int i; - call_stub_t *curr; - call_stub_t *next; - iot_conf_t *conf = this->private; - iot_client_ctx_t *ctx; - - if (!conf || !conf->cleanup_disconnected_reqs) { - goto out; - } - - pthread_mutex_lock (&conf->mutex); - for (i = 0; i < GF_FOP_PRI_MAX; i++) { - ctx = &conf->no_client[i]; - list_for_each_entry_safe (curr, next, &ctx->reqs, list) { - if (curr->frame->root->client != client) { - continue; - } - gf_log (this->name, GF_LOG_INFO, - "poisoning %s fop at %p for client %s", - gf_fop_list[curr->fop], curr, - client->client_uid); - curr->poison = _gf_true; - } +iot_disconnect_cbk(xlator_t *this, client_t *client) +{ + int i; + call_stub_t *curr; + call_stub_t *next; + iot_conf_t *conf = this->private; + iot_client_ctx_t *ctx; + + if (!conf || !conf->cleanup_disconnected_reqs) { + goto out; + } + + pthread_mutex_lock(&conf->mutex); + for (i = 0; i < GF_FOP_PRI_MAX; i++) { + ctx = &conf->no_client[i]; + list_for_each_entry_safe(curr, next, &ctx->reqs, list) + { + if (curr->frame->root->client != client) { + continue; + } + gf_log(this->name, GF_LOG_INFO, + "poisoning %s fop at %p for client %s", + gf_fop_list[curr->fop], curr, client->client_uid); + curr->poison = _gf_true; } - pthread_mutex_unlock (&conf->mutex); + } + pthread_mutex_unlock(&conf->mutex); out: - return 0; + return 0; } struct xlator_dumpops dumpops = { - .priv = iot_priv_dump, + .priv = iot_priv_dump, }; struct xlator_fops fops = { - .open = iot_open, - .create = iot_create, - .readv = iot_readv, - .writev = iot_writev, - .flush = iot_flush, - .fsync = iot_fsync, - .lk = iot_lk, - .stat = iot_stat, - .fstat = iot_fstat, - .truncate = iot_truncate, - .ftruncate = iot_ftruncate, - .unlink = iot_unlink, - .lookup = iot_lookup, - .setattr = iot_setattr, - .fsetattr = iot_fsetattr, - .access = iot_access, - .readlink = iot_readlink, - .mknod = iot_mknod, - .mkdir = iot_mkdir, - .rmdir = iot_rmdir, - .symlink = iot_symlink, - .rename = iot_rename, - .link = iot_link, - .opendir = iot_opendir, - .fsyncdir = iot_fsyncdir, - .statfs = iot_statfs, - .setxattr = iot_setxattr, - .getxattr = iot_getxattr, - .fgetxattr = iot_fgetxattr, - .fsetxattr = iot_fsetxattr, - .removexattr = iot_removexattr, - .fremovexattr = iot_fremovexattr, - .readdir = iot_readdir, - .readdirp = iot_readdirp, - .inodelk = iot_inodelk, - .finodelk = iot_finodelk, - .entrylk = iot_entrylk, - .fentrylk = iot_fentrylk, - .xattrop = iot_xattrop, - .fxattrop = iot_fxattrop, - .rchecksum = iot_rchecksum, - .fallocate = iot_fallocate, - .discard = iot_discard, - .zerofill = iot_zerofill, - .seek = iot_seek, - .lease = iot_lease, - .getactivelk = iot_getactivelk, - .setactivelk = iot_setactivelk, - .put = iot_put, + .open = iot_open, + .create = iot_create, + .readv = iot_readv, + .writev = iot_writev, + .flush = iot_flush, + .fsync = iot_fsync, + .lk = iot_lk, + .stat = iot_stat, + .fstat = iot_fstat, + .truncate = iot_truncate, + .ftruncate = iot_ftruncate, + .unlink = iot_unlink, + .lookup = iot_lookup, + .setattr = iot_setattr, + .fsetattr = iot_fsetattr, + .access = iot_access, + .readlink = iot_readlink, + .mknod = iot_mknod, + .mkdir = iot_mkdir, + .rmdir = iot_rmdir, + .symlink = iot_symlink, + .rename = iot_rename, + .link = iot_link, + .opendir = iot_opendir, + .fsyncdir = iot_fsyncdir, + .statfs = iot_statfs, + .setxattr = iot_setxattr, + .getxattr = iot_getxattr, + .fgetxattr = iot_fgetxattr, + .fsetxattr = iot_fsetxattr, + .removexattr = iot_removexattr, + .fremovexattr = iot_fremovexattr, + .readdir = iot_readdir, + .readdirp = iot_readdirp, + .inodelk = iot_inodelk, + .finodelk = iot_finodelk, + .entrylk = iot_entrylk, + .fentrylk = iot_fentrylk, + .xattrop = iot_xattrop, + .fxattrop = iot_fxattrop, + .rchecksum = iot_rchecksum, + .fallocate = iot_fallocate, + .discard = iot_discard, + .zerofill = iot_zerofill, + .seek = iot_seek, + .lease = iot_lease, + .getactivelk = iot_getactivelk, + .setactivelk = iot_setactivelk, + .put = iot_put, }; struct xlator_cbks cbks = { - .client_destroy = iot_client_destroy, - .client_disconnect = iot_disconnect_cbk, + .client_destroy = iot_client_destroy, + .client_disconnect = iot_disconnect_cbk, }; struct volume_options options[] = { - { .key = {"thread-count"}, - .type = GF_OPTION_TYPE_INT, - .min = IOT_MIN_THREADS, - .max = IOT_MAX_THREADS, - .default_value = "16", - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - /*.option = "thread-count"*/ - .description = "Number of threads in IO threads translator which " - "perform concurrent IO operations" - - }, - { .key = {"high-prio-threads"}, - .type = GF_OPTION_TYPE_INT, - .min = IOT_MIN_THREADS, - .max = IOT_MAX_THREADS, - .default_value = "16", - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Max number of threads in IO threads translator which " - "perform high priority IO operations at a given time" - - }, - { .key = {"normal-prio-threads"}, - .type = GF_OPTION_TYPE_INT, - .min = IOT_MIN_THREADS, - .max = IOT_MAX_THREADS, - .default_value = "16", - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Max number of threads in IO threads translator which " - "perform normal priority IO operations at a given time" - - }, - { .key = {"low-prio-threads"}, - .type = GF_OPTION_TYPE_INT, - .min = IOT_MIN_THREADS, - .max = IOT_MAX_THREADS, - .default_value = "16", - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Max number of threads in IO threads translator which " - "perform low priority IO operations at a given time" - - }, - { .key = {"least-prio-threads"}, - .type = GF_OPTION_TYPE_INT, - .min = IOT_MIN_THREADS, - .max = IOT_MAX_THREADS, - .default_value = "1", - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Max number of threads in IO threads translator which " - "perform least priority IO operations at a given time" - }, - { .key = {"enable-least-priority"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = SITE_H_ENABLE_LEAST_PRIORITY, - .op_version = {1}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Enable/Disable least priority" - }, - { .key = {"idle-time"}, - .type = GF_OPTION_TYPE_INT, - .min = 1, - .max = 0x7fffffff, - .default_value = "120", - }, - { .key = {"watchdog-secs"}, - .type = GF_OPTION_TYPE_INT, - .min = 0, - .default_value = 0, - .op_version = {GD_OP_VERSION_4_1_0}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, - .tags = {"io-threads"}, - .description = "Number of seconds a queue must be stalled before " - "starting an 'emergency' thread." - }, - { .key = {"cleanup-disconnected-reqs"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = "off", - .op_version = {GD_OP_VERSION_4_1_0}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, - .tags = {"io-threads"}, - .description = "'Poison' queued requests when a client disconnects" - }, - { .key = {"pass-through"}, - .type = GF_OPTION_TYPE_BOOL, - .default_value = "false", - .op_version = {GD_OP_VERSION_4_1_0}, - .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, - .tags = {"io-threads"}, - .description = "Enable/Disable io threads translator" - }, - { .key = {NULL}, - }, + {.key = {"thread-count"}, + .type = GF_OPTION_TYPE_INT, + .min = IOT_MIN_THREADS, + .max = IOT_MAX_THREADS, + .default_value = "16", + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + /*.option = "thread-count"*/ + .description = "Number of threads in IO threads translator which " + "perform concurrent IO operations" + + }, + {.key = {"high-prio-threads"}, + .type = GF_OPTION_TYPE_INT, + .min = IOT_MIN_THREADS, + .max = IOT_MAX_THREADS, + .default_value = "16", + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Max number of threads in IO threads translator which " + "perform high priority IO operations at a given time" + + }, + {.key = {"normal-prio-threads"}, + .type = GF_OPTION_TYPE_INT, + .min = IOT_MIN_THREADS, + .max = IOT_MAX_THREADS, + .default_value = "16", + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Max number of threads in IO threads translator which " + "perform normal priority IO operations at a given time" + + }, + {.key = {"low-prio-threads"}, + .type = GF_OPTION_TYPE_INT, + .min = IOT_MIN_THREADS, + .max = IOT_MAX_THREADS, + .default_value = "16", + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Max number of threads in IO threads translator which " + "perform low priority IO operations at a given time" + + }, + {.key = {"least-prio-threads"}, + .type = GF_OPTION_TYPE_INT, + .min = IOT_MIN_THREADS, + .max = IOT_MAX_THREADS, + .default_value = "1", + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Max number of threads in IO threads translator which " + "perform least priority IO operations at a given time"}, + {.key = {"enable-least-priority"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = SITE_H_ENABLE_LEAST_PRIORITY, + .op_version = {1}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Enable/Disable least priority"}, + { + .key = {"idle-time"}, + .type = GF_OPTION_TYPE_INT, + .min = 1, + .max = 0x7fffffff, + .default_value = "120", + }, + {.key = {"watchdog-secs"}, + .type = GF_OPTION_TYPE_INT, + .min = 0, + .default_value = 0, + .op_version = {GD_OP_VERSION_4_1_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC, + .tags = {"io-threads"}, + .description = "Number of seconds a queue must be stalled before " + "starting an 'emergency' thread."}, + {.key = {"cleanup-disconnected-reqs"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "off", + .op_version = {GD_OP_VERSION_4_1_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, + .tags = {"io-threads"}, + .description = "'Poison' queued requests when a client disconnects"}, + {.key = {"pass-through"}, + .type = GF_OPTION_TYPE_BOOL, + .default_value = "false", + .op_version = {GD_OP_VERSION_4_1_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC | OPT_FLAG_CLIENT_OPT, + .tags = {"io-threads"}, + .description = "Enable/Disable io threads translator"}, + { + .key = {NULL}, + }, }; |