diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 98 | 
1 files changed, 96 insertions, 2 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index cde6ad1f20a..1994e74b655 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -630,6 +630,84 @@ glusterd_brickinfo_dup (glusterd_brickinfo_t *brickinfo,  out:          return ret;  } +int32_t +glusterd_create_sub_tier_volinfo (glusterd_volinfo_t *volinfo, +                                  glusterd_volinfo_t **dup_volinfo, +                                  gf_boolean_t is_hot_tier, +                                  const char *new_volname) +{ +        glusterd_brickinfo_t *brickinfo       = NULL; +        glusterd_brickinfo_t *brickinfo_dup   = NULL; +        gd_tier_info_t       *tier_info       = NULL; +        int                   i               = 0; +        int                   ret             = -1; + +        tier_info = &(volinfo->tier_info); + +        ret = glusterd_volinfo_dup (volinfo, dup_volinfo, _gf_true); +        if (ret) { +                gf_msg ("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOL_OP_FAILED, +                        "Failed to create volinfo"); +                return ret; +        } + +        (*dup_volinfo)->is_snap_volume   = volinfo->is_snap_volume; +        (*dup_volinfo)->status           = volinfo->status; +        memcpy (&(*dup_volinfo)->tier_info, &volinfo->tier_info, +                sizeof (volinfo->tier_info)); + +        strcpy ((*dup_volinfo)->volname, new_volname); + +        cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { +                i++; + +                if (is_hot_tier) { +                        if (i > volinfo->tier_info.hot_brick_count) +                                break; +                } else { +                        if (i <= volinfo->tier_info.hot_brick_count) +                                continue; +                } + +                ret = glusterd_brickinfo_new (&brickinfo_dup); +                if (ret) { +                        gf_msg ("glusterd", GF_LOG_ERROR, 0, +                                GD_MSG_BRICK_NEW_INFO_FAIL, "Failed to create " +                                "new brickinfo"); +                        goto out; +                } + + +                glusterd_brickinfo_dup (brickinfo, brickinfo_dup); +                cds_list_add_tail (&brickinfo_dup->brick_list, +                              &((*dup_volinfo)->bricks)); +        } + +        if (is_hot_tier) { +            (*dup_volinfo)->type             = tier_info->hot_type; +            (*dup_volinfo)->replica_count    = tier_info->hot_replica_count; +            (*dup_volinfo)->brick_count      = tier_info->hot_brick_count; +            (*dup_volinfo)->dist_leaf_count  = +                                   glusterd_get_dist_leaf_count(*dup_volinfo); + +        } else { +            (*dup_volinfo)->type             = tier_info->cold_type; +            (*dup_volinfo)->replica_count    = tier_info->cold_replica_count; +            (*dup_volinfo)->disperse_count   = tier_info->cold_disperse_count; +            (*dup_volinfo)->redundancy_count = tier_info->cold_redundancy_count; +            (*dup_volinfo)->dist_leaf_count  = tier_info->cold_dist_leaf_count; +            (*dup_volinfo)->brick_count      = tier_info->cold_brick_count; +        } +out: +        if (ret && *dup_volinfo) { +                glusterd_volinfo_delete (*dup_volinfo); +                *dup_volinfo = NULL; +        } + +        return ret; + +} +  /*   * gd_vol_is_geo_rep_active:   *      This function checks for any running geo-rep session for @@ -6305,9 +6383,9 @@ glusterd_is_volume_replicate (glusterd_volinfo_t *volinfo)  }  gf_boolean_t -glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) +glusterd_is_shd_compatible_type (int type)  { -        switch (volinfo->type) { +        switch (type) {          case GF_CLUSTER_TYPE_REPLICATE:          case GF_CLUSTER_TYPE_STRIPE_REPLICATE:          case GF_CLUSTER_TYPE_DISPERSE: @@ -6317,6 +6395,22 @@ glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo)          return _gf_false;  } +gf_boolean_t +glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) +{ + +        int     ret     = 0; + +        if (volinfo->type == GF_CLUSTER_TYPE_TIER) { +                ret = glusterd_is_shd_compatible_type +                                         (volinfo->tier_info.cold_type) | +                      glusterd_is_shd_compatible_type +                                         (volinfo->tier_info.hot_type); +                return ret; +        } +        return glusterd_is_shd_compatible_type (volinfo->type); +} +  int  glusterd_set_dump_options (char *dumpoptions_path, char *options,                             int option_cnt)  | 
