diff options
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.c')
| -rw-r--r-- | xlators/performance/io-threads/src/io-threads.c | 65 | 
1 files changed, 55 insertions, 10 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c index 1d255d97267..fbd002267f3 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -41,6 +41,30 @@ void iot_startup_workers (iot_worker_t **workers, int start_idx, int count,  void * iot_worker_unordered (void *arg);  void * iot_worker_ordered (void *arg); +int +iot_unordered_request_balancer (iot_conf_t *conf) +{ +        long int        rand = 0; +        int             idx = 0; + +        /* Decide which thread will service the request. +         * FIXME: This should change into some form of load-balancing. +         * */ +        rand = random (); + +        /* If scaling is on, we can choose from any thread +        * that has been allocated upto, max_o_threads, but +        * with scaling off, we'll never have threads more +        * than min_o_threads. +        */ +        if (iot_unordered_scaling_on (conf)) +                idx = (rand % conf->max_u_threads); +        else +                idx = (rand % conf->min_u_threads); + +        return idx; +} +  void  iot_schedule_unordered (iot_conf_t *conf,                  inode_t *inode, @@ -50,10 +74,7 @@ iot_schedule_unordered (iot_conf_t *conf,          iot_worker_t    *selected_worker = NULL;          iot_request_t   *req = NULL; -        /* First decide which thread will service the request. -         * FIXME: This should change into some form of load-balancing. -         * */ -        idx = (random() % conf->max_u_threads); +        idx = iot_unordered_request_balancer (conf);          selected_worker = conf->uworkers[idx];          req = iot_init_request (stub); @@ -73,6 +94,33 @@ iot_schedule_unordered (iot_conf_t *conf,          pthread_mutex_unlock (&selected_worker->qlock);  } +/* Assumes inode lock is held. */ +int +iot_ordered_request_balancer (iot_conf_t *conf, +                inode_t *inode) +{ +        int             ctxret = 0; +        long int        rand = 0; +        uint64_t        idx = 0; + +        ctxret = __inode_ctx_get (inode, conf->this, &idx); +        if (ctxret < 0) { +                rand = random (); +                /* If scaling is on, we can choose from any thread +                 * that has been allocated upto, max_o_threads, but +                 * with scaling off, we'll never have threads more +                 * than min_o_threads. +                 */ +                if (iot_ordered_scaling_on (conf)) +                        idx = (rand % conf->max_o_threads); +                else +                        idx = (rand % conf->min_o_threads); +                __inode_ctx_put (inode, conf->this, idx); +        } + +        return idx; +} +  void  iot_schedule_ordered (iot_conf_t *conf,                  inode_t *inode, @@ -81,7 +129,6 @@ iot_schedule_ordered (iot_conf_t *conf,          uint64_t        idx = 0;          iot_worker_t    *selected_worker = NULL;          iot_request_t   * req = NULL; -        int             ctxret = 0;          if (inode == NULL) {                  gf_log (conf->this->name, GF_LOG_ERROR, @@ -91,11 +138,7 @@ iot_schedule_ordered (iot_conf_t *conf,          req = iot_init_request (stub);          LOCK (&inode->lock);          { -                ctxret = __inode_ctx_get (inode, conf->this, &idx); -                if (ctxret < 0) { -                        idx = (random () % conf->max_o_threads); -                        __inode_ctx_put (inode, conf->this, idx); -                } +                idx = iot_ordered_request_balancer (conf, inode);                  /* inode lock once acquired, cannot be left here                   * because other gluster main threads might be                   * contending on it to append a request for this file. @@ -1762,12 +1805,14 @@ init (xlator_t *this)          conf->max_u_threads = IOT_MAX_THREADS;          conf->min_u_threads = IOT_MIN_THREADS;          conf->u_idle_time = IOT_DEFAULT_IDLE; +        conf->u_scaling = IOT_SCALING_OFF;          /* Init params for ordered workers. */          pthread_mutex_init (&conf->otlock, NULL);          conf->max_o_threads = IOT_MAX_THREADS;          conf->min_o_threads = IOT_MIN_THREADS;          conf->o_idle_time = IOT_DEFAULT_IDLE; +        conf->o_scaling = IOT_SCALING_OFF;          conf->this = this;  	workers_init (conf);  | 
