diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2019-03-29 11:48:32 +0530 | 
|---|---|---|
| committer | Mohit Agrawal <moagrawal@redhat.com> | 2019-04-15 20:50:50 +0530 | 
| commit | 26a19d9da3ab5604db02d4ca02ce868fb57193a4 (patch) | |
| tree | a82d9ed8aa17b1b86ecab4b2f945f99f521d6bc1 /xlators/mgmt/glusterd/src/glusterd-volume-set.c | |
| parent | f316c8b797283818bd800569771870a4b9bf1310 (diff) | |
glusterd: Optimize glusterd handshaking code path
Problem: At the time of handshaking glusterd populate volume
         data in a dictionary.While no. of volumes are configured
         more than 1500 glusterd takes more than 10 min to generated
         the data.Due to taking more time rpc request times out and
         rpc start bailing of call frames.
Solution: To optimize the code done below changes
          1) Spawn multiple threads to populate volumes data in bulk
             in separate dictionary and introduce an option
             glusterd.brick-dict-thread-count to configure no. of threads
             to populate volume data.
          2) Populate tier data only while volume type is tier
          3) Compare snap data only while snap_count is non zero
Fixes: bz#1699339
Change-Id: I38dc71970c049217f9d1a06fc0aaf4c26eab18f5
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volume-set.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 55 | 
1 files changed, 55 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 5120838a70a..4cdbbbec250 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -590,6 +590,51 @@ out:  }  static int +validate_volume_per_thread_limit(glusterd_volinfo_t *volinfo, dict_t *dict, +                                 char *key, char *value, char **op_errstr) +{ +    xlator_t *this = NULL; +    uint val = 0; +    int ret = -1; + +    this = THIS; +    GF_VALIDATE_OR_GOTO("glusterd", this, out); + +    if (!is_brick_mx_enabled()) { +        gf_asprintf(op_errstr, +                    "Brick-multiplexing is not enabled. " +                    "Please enable brick multiplexing before trying " +                    "to set this option."); +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_WRONG_OPTS_SETTING, "%s", +               *op_errstr); +        goto out; +    } + +    ret = gf_string2uint(value, &val); +    if (ret) { +        gf_asprintf(op_errstr, +                    "%s is not a valid count. " +                    "%s expects an unsigned integer.", +                    value, key); +        gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_INVALID_ENTRY, "%s", +               *op_errstr); +    } + +    if ((val < 5) || (val > 200)) { +        gf_asprintf( +            op_errstr, +            "Please set this option to a greater than 5 or less than 200 " +            "to optimize dict generated while no. of volumes are more"); +        ret = -1; +        goto out; +    } +out: +    gf_msg_debug("glusterd", 0, "Returning %d", ret); + +    return ret; +} + +static int  validate_boolean(glusterd_volinfo_t *volinfo, dict_t *dict, char *key,                   char *value, char **op_errstr)  { @@ -2785,6 +2830,16 @@ struct volopt_map_entry glusterd_volopt_map[] = {                      "brick multiplexing. Brick multiplexing ensures that "                      "compatible brick instances can share one single "                      "brick process."}, +    {.key = GLUSTERD_VOL_CNT_PER_THRD, +     .voltype = "mgmt/glusterd", +     .value = GLUSTERD_VOL_CNT_PER_THRD_DEFAULT_VALUE, +     .op_version = 700000, +     .validate_fn = validate_volume_per_thread_limit, +     .type = GLOBAL_NO_DOC, +     .description = +         "This option can be used to limit the number of volumes " +         "handled by per thread to populate peer data.The option accepts " +         " the value in the range of 5 to 200"},      {.key = GLUSTERD_BRICKMUX_LIMIT_KEY,       .voltype = "mgmt/glusterd",       .value = GLUSTERD_BRICKMUX_LIMIT_DFLT_VALUE,  | 
