diff options
author | Mohammed Rafi KC <rkavunga@redhat.com> | 2016-06-01 23:01:37 +0530 |
---|---|---|
committer | Rajesh Joseph <rjoseph@redhat.com> | 2016-06-02 23:08:56 -0700 |
commit | 03d523504230c336cf585159266e147945f31153 (patch) | |
tree | 7d5d57c9ded7eb58fda229483c60bf6c81e6008c | |
parent | bc525b01002d7649be0ac28c5761c8ce92b6a658 (diff) |
glusterd/snapshot: remove quota related options from snap volfile
enabling inode-quota on a snapshot volume is unnecessary, because
snapshot is a read-only volume. So we don't need to enforce quota
on a snapshot volume.
This patch will remove the quota related options from snapshot
volfile.
Change-Id: Iddabcb83820dac2384924a01d45abe1ef1e95600
BUG: 1341796
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Reviewed-on: http://review.gluster.org/14608
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-by: N Balachandran <nbalacha@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 153 |
1 files changed, 137 insertions, 16 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 7848a26babb..7967722d798 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -74,6 +74,15 @@ struct snap_create_args_ { int32_t brickcount; int32_t brickorder; }; + +/* This structure is used to store unsupported options and thier values + * for snapshotted volume. + */ +struct gd_snap_unsupported_opt_t { + char *key; + char *value; +}; + typedef struct snap_create_args_ snap_create_args_t; /* This function is called to get the device path of the snap lvm. Usually @@ -5144,24 +5153,113 @@ out: return ret; } +static int +glusterd_snap_clear_unsupported_opt (glusterd_volinfo_t *volinfo, + struct gd_snap_unsupported_opt_t *unsupported_opt) +{ + int ret = -1; + int i = 0; + + GF_VALIDATE_OR_GOTO ("glusterd", volinfo, out); + + for (i = 0; unsupported_opt[i].key; i++) { + glusterd_volinfo_get (volinfo, unsupported_opt[i].key, + &unsupported_opt[i].value); + + if (unsupported_opt[i].value) { + unsupported_opt[i].value = gf_strdup ( + unsupported_opt[i].value); + if (!unsupported_opt[i].value) { + ret = -1; + goto out; + } + dict_del (volinfo->dict, unsupported_opt[i].key); + } + } + + ret = 0; +out: + if (ret) { + for (i = 0; unsupported_opt[i].key; i++) { + if (unsupported_opt[i].value) { + /* Freeing the memory */ + GF_FREE (unsupported_opt[i].value); + unsupported_opt[i].value = NULL; + } + } + } + + return ret; +} + +static int +glusterd_snap_set_unsupported_opt (glusterd_volinfo_t *volinfo, + struct gd_snap_unsupported_opt_t *unsupported_opt) +{ + int ret = -1; + int i = 0; + + GF_VALIDATE_OR_GOTO ("glusterd", volinfo, out); + + for (i = 0; unsupported_opt[i].key; i++) { + if (!unsupported_opt[i].value) + continue; + + ret = dict_set_dynstr (volinfo->dict, unsupported_opt[i].key, + unsupported_opt[i].value); + if (ret) { + gf_msg ("glusterd", GF_LOG_ERROR, errno, + GD_MSG_DICT_SET_FAILED, "dict set failed"); + goto out; + } + } + + ret = 0; +out: + if (ret) { + for (; unsupported_opt[i].key; i++) { + if (unsupported_opt[i].value) { + /* Freeing the memory */ + GF_FREE (unsupported_opt[i].value); + unsupported_opt[i].value = NULL; + } + } + } + + return ret; +} + glusterd_volinfo_t * glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, dict_t *dict, dict_t *rsp_dict, int64_t volcount, int clone) { - char key[PATH_MAX] = ""; - char *username = NULL; - char *password = NULL; - glusterd_brickinfo_t *brickinfo = NULL; - glusterd_conf_t *priv = NULL; - glusterd_volinfo_t *snap_vol = NULL; - uuid_t *snap_volid = NULL; - int32_t ret = -1; - int32_t brick_count = 0; - xlator_t *this = NULL; - int64_t brick_order = 0; - char *clonename = NULL; - gf_boolean_t conf_present = _gf_false; + char key[PATH_MAX] = ""; + char *username = NULL; + char *password = NULL; + glusterd_brickinfo_t *brickinfo = NULL; + glusterd_conf_t *priv = NULL; + glusterd_volinfo_t *snap_vol = NULL; + uuid_t *snap_volid = NULL; + int32_t ret = -1; + int32_t brick_count = 0; + xlator_t *this = NULL; + int64_t brick_order = 0; + char *clonename = NULL; + gf_boolean_t conf_present = _gf_false; + + struct gd_snap_unsupported_opt_t unsupported_opt[] = { + {.key = VKEY_FEATURES_QUOTA, + .value = NULL}, + {.key = VKEY_FEATURES_INODE_QUOTA, + .value = NULL}, + {.key = "feature.deem-statfs", + .value = NULL}, + {.key = "features.quota-deem-statfs", + .value = NULL}, + {.key = NULL, + .value = NULL} + }; this = THIS; GF_ASSERT (this); @@ -5318,13 +5416,25 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, goto out; } + if (snap_vol->is_snap_volume) { + ret = glusterd_snap_clear_unsupported_opt (snap_vol, + unsupported_opt); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_VOL_OP_FAILED, "Failed to clear quota " + "option for the snap %s (volume: %s)", + snap->snapname, origin_vol->volname); + goto out; + } + } + ret = generate_brick_volfiles (snap_vol); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_VOLFILE_CREATE_FAIL, "generating the brick " "volfiles for the snap %s (volume: %s) failed", snap->snapname, origin_vol->volname); - goto out; + goto reset_option; } ret = generate_client_volfiles (snap_vol, GF_CLIENT_TRUSTED); @@ -5333,7 +5443,7 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, GD_MSG_VOLFILE_CREATE_FAIL, "generating the trusted " "client volfiles for the snap %s (volume: %s) failed", snap->snapname, origin_vol->volname); - goto out; + goto reset_option; } ret = generate_client_volfiles (snap_vol, GF_CLIENT_OTHER); @@ -5342,9 +5452,20 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, GD_MSG_VOLFILE_CREATE_FAIL, "generating the client " "volfiles for the snap %s (volume: %s) failed", snap->snapname, origin_vol->volname); - goto out; + goto reset_option; } +reset_option: + if (snap_vol->is_snap_volume) { + if (glusterd_snap_set_unsupported_opt (snap_vol, + unsupported_opt)) { + ret = -1; + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_VOL_OP_FAILED, "Failed to reset quota " + "option for the snap %s (volume: %s)", + snap->snapname, origin_vol->volname); + } + } out: if (ret) { if (snap_vol) |