diff options
| -rw-r--r-- | tests/basic/distribute/throttle-rebal.t | 14 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 25 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-shared.c | 108 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 32 | 
5 files changed, 152 insertions, 30 deletions
diff --git a/tests/basic/distribute/throttle-rebal.t b/tests/basic/distribute/throttle-rebal.t index 89495aee71b..f4823cf4f21 100644 --- a/tests/basic/distribute/throttle-rebal.t +++ b/tests/basic/distribute/throttle-rebal.t @@ -16,6 +16,11 @@ function set_throttle {          $CLI volume set $V0 cluster.rebal-throttle $level 2>&1 |grep -oE 'success|failed'  } +#Determine number of cores +cores=$(cat /proc/cpuinfo | grep processor | wc -l) +if [ "$cores" == "" ]; then +        echo "Could not get number of cores available" +fi  THROTTLE_LEVEL="lazy"  EXPECT "success" set_throttle $THROTTLE_LEVEL @@ -36,6 +41,15 @@ EXPECT "failed" set_throttle $THROTTLE_LEVEL  #check if throttle-level is still aggressive  EXPECT "aggressive" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'` +EXPECT "success" set_throttle $cores + +#Setting thorttle number to be more than the number of cores should fail +THORTTLE_LEVEL=$((cores+1)) +TEST echo $THORTTLE_LEVEL +EXPECT "failed" set_throttle $THROTTLE_LEVEL +EXPECT "$cores" echo `$CLI volume info | grep rebal-throttle | awk '{print $2}'` + +  TEST $CLI volume stop $V0;  TEST $CLI volume delete $V0; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index a756a1e579f..c8cec133960 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -36,6 +36,7 @@  #define DHT_ENTRY_SYNC_DOMAIN           "dht.entry.sync"  #define TIERING_MIGRATION_KEY           "tiering.migration"  #define DHT_LAYOUT_HASH_INVALID         1 +#define MAX_REBAL_THREADS               sysconf(_SC_NPROCESSORS_ONLN)  #define DHT_DIR_STAT_BLOCKS          8  #define DHT_DIR_STAT_SIZE            4096 @@ -614,7 +615,7 @@ struct dht_conf {          /* Support size-weighted rebalancing (heterogeneous bricks). */          gf_boolean_t    do_weighting;          gf_boolean_t    randomize_by_gfid; -        char           *dthrottle; +        int             dthrottle;          dht_methods_t   methods; diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 66cd623ea08..1b140dbb8b5 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -2721,7 +2721,7 @@ gf_defrag_task (void *opaque)                                  defrag->current_thread_count--;                                  gf_log ("DHT", GF_LOG_INFO,                                          "Thread sleeping. " -                                        "defrag->current_thread_count: %d", +                                        "current thread count: %d",                                           defrag->current_thread_count);                                  pthread_cond_wait ( @@ -2729,11 +2729,11 @@ gf_defrag_task (void *opaque)                                             &defrag->dfq_mutex);                                  defrag->current_thread_count++; -                                  gf_log ("DHT", GF_LOG_INFO,                                          "Thread wokeup. " -                                        "defrag->current_thread_count: %d", +                                        "current thread count: %d",                                           defrag->current_thread_count); +                          }                          if (defrag->q_entry_count) { @@ -2786,6 +2786,14 @@ gf_defrag_task (void *opaque)                           finished */                                  if (!defrag->crawl_done) { + +                                        defrag->current_thread_count--; +                                        gf_log ("DHT", GF_LOG_INFO, "Thread " +                                                " sleeping while  waiting for " +                                                "migration entries. current " +                                                "thread  count :%d", +                                                defrag->current_thread_count); +                                          pthread_cond_wait (                                             &defrag->parallel_migration_cond,                                             &defrag->dfq_mutex); @@ -2793,10 +2801,19 @@ gf_defrag_task (void *opaque)                                  if (defrag->crawl_done &&                                                   !defrag->q_entry_count) { +                                        defrag->current_thread_count++; +                                        gf_msg_debug ("DHT", 0, "Exiting thread"); +                                          pthread_cond_broadcast (                                               &defrag->parallel_migration_cond);                                          goto unlock;                                  } else { +                                        defrag->current_thread_count++; +                                        gf_msg_debug ("DHT", 0, "Thread woke up" +                                                      " as found migrating entries. " +                                                      "current thread count:%d", +                                                      defrag->current_thread_count); +                                          pthread_mutex_unlock                                                   (&defrag->dfq_mutex);                                          continue; @@ -4205,7 +4222,7 @@ gf_defrag_start_crawl (void *data)                  INIT_LIST_HEAD (&(defrag->queue[0].list)); -                thread_spawn_count = MAX ((sysconf(_SC_NPROCESSORS_ONLN) - 4), 4); +                thread_spawn_count = MAX (MAX_REBAL_THREADS, 4);                  gf_msg_debug (this->name, 0, "thread_spawn_count: %d",                                thread_spawn_count); diff --git a/xlators/cluster/dht/src/dht-shared.c b/xlators/cluster/dht/src/dht-shared.c index f13762e34fb..9c3eb16869c 100644 --- a/xlators/cluster/dht/src/dht-shared.c +++ b/xlators/cluster/dht/src/dht-shared.c @@ -400,7 +400,7 @@ dht_reconfigure (xlator_t *this, dict_t *options)          char            *temp_str = NULL;          gf_boolean_t     search_unhashed;          int              ret = -1; -        int              throttle_count = 0; +        int              rebal_thread_count = 0;          GF_VALIDATE_OR_GOTO ("dht", this, out);          GF_VALIDATE_OR_GOTO ("dht", options, out); @@ -456,22 +456,54 @@ dht_reconfigure (xlator_t *this, dict_t *options)                            conf->randomize_by_gfid,                            options, bool, out); -        GF_OPTION_RECONF ("rebal-throttle", conf->dthrottle, options, -                          str, out); -          GF_OPTION_RECONF ("lock-migration", conf->lock_migration_enabled,                            options, bool, out);          if (conf->defrag) { +                pthread_mutex_lock (&conf->defrag->dfq_mutex); +                { +                if (dict_get_str (options, "rebal-throttle", &temp_str) == 0) { +                        if (!strcasecmp (temp_str, "lazy")) { +                                conf->defrag->recon_thread_count = 1; +                        } else if (!strcasecmp (temp_str, "normal")) { +                                conf->defrag->recon_thread_count = 3; +                        } else if (!strcasecmp (temp_str, "aggressive")) { +                                conf->defrag->recon_thread_count = MAX ((MAX_REBAL_THREADS - 4), 4); +                        } else if ((gf_string2int (temp_str, &rebal_thread_count) == 0)) { +                                if ((rebal_thread_count > 0) && (rebal_thread_count <= MAX_REBAL_THREADS)) { +                                        gf_msg_debug (this->name, 0, "rebal throttle count reconfigured to %d", rebal_thread_count); +                                        conf->defrag->recon_thread_count = rebal_thread_count; +                                } else { +                                        gf_msg(this->name, GF_LOG_ERROR, 0, +                                               DHT_MSG_INVALID_OPTION, +                                               "Invalid option: Reconfigure: " +                                               "rebal-throttle should be " +                                               "within range of 0 and maximum number of" +                                               " cores available"); +                                        ret = -1; +                                        pthread_mutex_unlock (&conf->defrag->dfq_mutex); +                                        goto out; +                                } +                        } else { +                                gf_msg(this->name, GF_LOG_ERROR, 0, +                                       DHT_MSG_INVALID_OPTION, +                                       "Invalid option: Reconfigure: " +                                       "rebal-throttle should be {lazy|normal|aggressive}" +                                       " or a number upto number of cores available," +                                       " not (%s), defaulting to (%d)", +                                       temp_str, conf->dthrottle); +                                ret = -1; +                                pthread_mutex_unlock (&conf->defrag->dfq_mutex); +                                goto out; +                        } +                } +                } +                pthread_mutex_unlock (&conf->defrag->dfq_mutex); +        } + +        if (conf->defrag) {                  conf->defrag->lock_migration_enabled =                                          conf->lock_migration_enabled; - -                GF_DECIDE_DEFRAG_THROTTLE_COUNT (throttle_count, conf); -                gf_msg ("DHT", GF_LOG_INFO, 0, -                        DHT_MSG_REBAL_THROTTLE_INFO, -                        "conf->dthrottle: %s, " -                        "conf->defrag->recon_thread_count: %d", -                         conf->dthrottle, conf->defrag->recon_thread_count);          }          if (conf->defrag) { @@ -608,8 +640,8 @@ dht_init (xlator_t *this)          gf_defrag_info_t                *defrag         = NULL;          int                              cmd            = 0;          char                            *node_uuid      = NULL; -        int                              throttle_count = 0;          uint32_t                         commit_hash    = 0; +        int                              rebal_thread_count = 0;          GF_VALIDATE_OR_GOTO ("dht", this, err); @@ -809,15 +841,49 @@ dht_init (xlator_t *this)                          conf->randomize_by_gfid, bool, err);          if (defrag) { -                GF_OPTION_INIT ("rebal-throttle", -                                 conf->dthrottle, str, err); - -                GF_DECIDE_DEFRAG_THROTTLE_COUNT(throttle_count, conf); - -                gf_msg_debug ("DHT", 0, "conf->dthrottle: %s, " -                              "conf->defrag->recon_thread_count: %d", -                              conf->dthrottle, -                              conf->defrag->recon_thread_count); +                GF_OPTION_INIT ("rebal-throttle", temp_str, str, err); +                if (temp_str) { + +                        pthread_mutex_lock (&conf->defrag->dfq_mutex); +                        { +                        if (!strcasecmp (temp_str, "lazy")) { +                                conf->defrag->recon_thread_count = 1; +                        } else if (!strcasecmp (temp_str, "normal")) { +                                conf->defrag->recon_thread_count = 2; +                        } else if (!strcasecmp (temp_str, "aggressive")) { +                                conf->defrag->recon_thread_count = MAX (MAX_REBAL_THREADS - 4, 4); +                        } else if ((gf_string2int (temp_str, &rebal_thread_count) == 0)) { +                                if ((rebal_thread_count > 0) && (rebal_thread_count <= MAX_REBAL_THREADS)) { +                                        gf_msg (this->name, GF_LOG_INFO, 0, 0, +                                                "rebal thread count configured to %d", +                                                 rebal_thread_count); +                                        conf->defrag->recon_thread_count = rebal_thread_count; +                                } else { +                                        gf_msg(this->name, GF_LOG_ERROR, 0, +                                               DHT_MSG_INVALID_OPTION, +                                               "Invalid option: Reconfigure: " +                                               "rebal-throttle should be " +                                               "within range of 0 and maximum number of" +                                               " cores available"); +                                        ret = -1; +                                        pthread_mutex_unlock (&conf->defrag->dfq_mutex); +                                        goto err; +                                } +                        } else { +                                gf_msg(this->name, GF_LOG_ERROR, 0, +                                       DHT_MSG_INVALID_OPTION, +                                       "Invalid option: Reconfigure: " +                                       "rebal-throttle should be {lazy|normal|aggressive}" +                                       " or a number upto number of cores available," +                                       " not (%s), defaulting to (%d)", +                                       temp_str, conf->dthrottle); +                                ret = -1; +                                pthread_mutex_unlock (&conf->defrag->dfq_mutex); +                                goto err; +                        } +                        } +                        pthread_mutex_unlock (&conf->defrag->dfq_mutex); +                }          }          GF_OPTION_INIT ("xattr-name", conf->xattr_name, str, err); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 08557d1bd86..728da74b7a6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -546,21 +546,45 @@ static int  validate_defrag_throttle_option (glusterd_volinfo_t *volinfo, dict_t *dict,                                   char *key, char *value, char **op_errstr)  { -        char                 errstr[2048] = ""; -        int                  ret          = 0; -        xlator_t            *this         = NULL; +        char                 errstr[2048]       = ""; +        int                  ret                = 0; +        xlator_t            *this               = NULL; +        int                  thread_count       = 0; +        long int             cores_available    = 0;          this = THIS;          GF_ASSERT (this); +        cores_available = sysconf(_SC_NPROCESSORS_ONLN); + +        /* Throttle option should be one of lazy|normal|aggressive or a number +         * configured by user max up to the number of cores in the machine */ +          if (!strcasecmp (value, "lazy") ||              !strcasecmp (value, "normal") ||              !strcasecmp (value, "aggressive")) {                  ret = 0; +        } else if ((gf_string2int (value, &thread_count) == 0)) { +                if ((thread_count > 0) && (thread_count <= cores_available)) { +                        ret = 0; +                } else { +                        ret = -1; +                        snprintf (errstr, sizeof (errstr), "%s should be within" +                                  " range of 0 and maximum number of cores " +                                  "available (cores available - %ld)", key, +                                  cores_available); + +                        gf_msg (this->name, GF_LOG_ERROR, EINVAL, +                                GD_MSG_INVALID_ENTRY, "%s", errstr); + +                        *op_errstr = gf_strdup (errstr); +                }          } else {                  ret = -1;                  snprintf (errstr, sizeof (errstr), "%s should be " -                          "{lazy|normal|aggressive}", key); +                          "{lazy|normal|aggressive} or a number upto number of" +                          " cores available (cores availble - %ld)", key, +                          cores_available);                  gf_msg (this->name, GF_LOG_ERROR, EINVAL,                          GD_MSG_INVALID_ENTRY, "%s", errstr);                  *op_errstr = gf_strdup (errstr);  | 
