diff options
Diffstat (limited to '0215-posix-modify-storage.reserve-option-to-take-size-and.patch')
-rw-r--r-- | 0215-posix-modify-storage.reserve-option-to-take-size-and.patch | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/0215-posix-modify-storage.reserve-option-to-take-size-and.patch b/0215-posix-modify-storage.reserve-option-to-take-size-and.patch new file mode 100644 index 0000000..3e4217b --- /dev/null +++ b/0215-posix-modify-storage.reserve-option-to-take-size-and.patch @@ -0,0 +1,319 @@ +From 0c485548b4126ed907dec9941209b1b1312d0b5d Mon Sep 17 00:00:00 2001 +From: Sheetal Pamecha <spamecha@redhat.com> +Date: Wed, 19 Jun 2019 15:08:58 +0530 +Subject: [PATCH 215/221] posix: modify storage.reserve option to take size and + percent + +* reverting changes made in +https://review.gluster.org/#/c/glusterfs/+/21686/ + +* Now storage.reserve can take value in percent or bytes + +> fixes: bz#1651445 +> Change-Id: Id4826210ec27991c55b17d1fecd90356bff3e036 +> Signed-off-by: Sheetal Pamecha <spamecha@redhat.com> +> Cherry pick from commit 5cbc87d8b8f1287e81c38b793b8d13b057208c62 +> Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22900/ + +BUG: 1573077 +Change-Id: Id4826210ec27991c55b17d1fecd90356bff3e036 +Signed-off-by: Sheetal Pamecha <spamecha@redhat.com> +Reviewed-on: https://code.engineering.redhat.com/gerrit/174744 +Tested-by: RHGS Build Bot <nigelb@redhat.com> +Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com> +--- + tests/bugs/posix/bug-1651445.t | 29 +++++++++------------- + xlators/mgmt/glusterd/src/glusterd-volume-set.c | 33 ------------------------- + xlators/storage/posix/src/posix-common.c | 33 +++++++++++-------------- + xlators/storage/posix/src/posix-helpers.c | 26 +++++++++---------- + xlators/storage/posix/src/posix-inode-fd-ops.c | 15 ++++++----- + xlators/storage/posix/src/posix.h | 4 +-- + 6 files changed, 51 insertions(+), 89 deletions(-) + +diff --git a/tests/bugs/posix/bug-1651445.t b/tests/bugs/posix/bug-1651445.t +index f6f1833..5248d47 100644 +--- a/tests/bugs/posix/bug-1651445.t ++++ b/tests/bugs/posix/bug-1651445.t +@@ -17,39 +17,34 @@ TEST $CLI volume start $V0 + + TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 + +-TEST $CLI volume set $V0 storage.reserve-size 10MB ++#Setting the size in bytes ++TEST $CLI volume set $V0 storage.reserve 40MB + +-#No effect as priority to reserve-size +-TEST $CLI volume set $V0 storage.reserve 20 ++#wait 5s to reset disk_space_full flag ++sleep 5 + + TEST dd if=/dev/zero of=$M0/a bs=100M count=1 +-sleep 5 ++TEST dd if=/dev/zero of=$M0/b bs=10M count=1 + +-#Below dd confirms posix is giving priority to reserve-size +-TEST dd if=/dev/zero of=$M0/b bs=40M count=1 ++# Wait 5s to update disk_space_full flag because thread check disk space ++# after every 5s + + sleep 5 ++# setup_lvm create lvm partition of 150M and 40M are reserve so after ++# consuming more than 110M next dd should fail + TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1 + + rm -rf $M0/* +-#Size will reserve from the previously set reserve option = 20% +-TEST $CLI volume set $V0 storage.reserve-size 0 + +-#Overwrite reserve option +-TEST $CLI volume set $V0 storage.reserve-size 40MB ++#Setting the size in percent and repeating the above steps ++TEST $CLI volume set $V0 storage.reserve 40 + +-#wait 5s to reset disk_space_full flag + sleep 5 + +-TEST dd if=/dev/zero of=$M0/a bs=100M count=1 ++TEST dd if=/dev/zero of=$M0/a bs=80M count=1 + TEST dd if=/dev/zero of=$M0/b bs=10M count=1 + +-# Wait 5s to update disk_space_full flag because thread check disk space +-# after every 5s +- + sleep 5 +-# setup_lvm create lvm partition of 150M and 40M are reserve so after +-# consuming more than 110M next dd should fail + TEST ! dd if=/dev/zero of=$M0/c bs=5M count=1 + + TEST $CLI volume stop $V0 +diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c +index 3a7ab83..7a83124 100644 +--- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c ++++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c +@@ -1231,30 +1231,6 @@ out: + + return ret; + } +-static int +-validate_size(glusterd_volinfo_t *volinfo, dict_t *dict, char *key, char *value, +- char **op_errstr) +-{ +- xlator_t *this = NULL; +- uint64_t size = 0; +- int ret = -1; +- +- this = THIS; +- GF_VALIDATE_OR_GOTO("glusterd", this, out); +- ret = gf_string2bytesize_uint64(value, &size); +- if (ret < 0) { +- gf_asprintf(op_errstr, +- "%s is not a valid size. %s " +- "expects a valid value in bytes", +- value, key); +- gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_INVALID_ENTRY, "%s", +- *op_errstr); +- } +-out: +- gf_msg_debug("glusterd", 0, "Returning %d", ret); +- +- return ret; +-} + + /* dispatch table for VOLUME SET + * ----------------------------- +@@ -2854,15 +2830,6 @@ struct volopt_map_entry glusterd_volopt_map[] = { + .op_version = GD_OP_VERSION_3_13_0, + }, + { +- .key = "storage.reserve-size", +- .voltype = "storage/posix", +- .value = "0", +- .validate_fn = validate_size, +- .description = "If set, priority will be given to " +- "storage.reserve-size over storage.reserve", +- .op_version = GD_OP_VERSION_7_0, +- }, +- { + .option = "health-check-timeout", + .key = "storage.health-check-timeout", + .type = NO_DOC, +diff --git a/xlators/storage/posix/src/posix-common.c b/xlators/storage/posix/src/posix-common.c +index 0f70af5..bfe2cb0 100644 +--- a/xlators/storage/posix/src/posix-common.c ++++ b/xlators/storage/posix/src/posix-common.c +@@ -345,12 +345,14 @@ posix_reconfigure(xlator_t *this, dict_t *options) + " fallback to <hostname>:<export>"); + } + +- GF_OPTION_RECONF("reserve-size", priv->disk_reserve_size, options, size, ++ GF_OPTION_RECONF("reserve", priv->disk_reserve, options, percent_or_size, + out); ++ /* option can be any one of percent or bytes */ ++ priv->disk_unit = 0; ++ if (priv->disk_reserve < 100.0) ++ priv->disk_unit = 'p'; + +- GF_OPTION_RECONF("reserve", priv->disk_reserve_percent, options, uint32, +- out); +- if (priv->disk_reserve_size || priv->disk_reserve_percent) { ++ if (priv->disk_reserve) { + ret = posix_spawn_disk_space_check_thread(this); + if (ret) { + gf_msg(this->name, GF_LOG_INFO, 0, P_MSG_DISK_SPACE_CHECK_FAILED, +@@ -975,11 +977,15 @@ posix_init(xlator_t *this) + + _private->disk_space_check_active = _gf_false; + _private->disk_space_full = 0; +- GF_OPTION_INIT("reserve-size", _private->disk_reserve_size, size, out); + +- GF_OPTION_INIT("reserve", _private->disk_reserve_percent, uint32, out); ++ GF_OPTION_INIT("reserve", _private->disk_reserve, percent_or_size, out); ++ ++ /* option can be any one of percent or bytes */ ++ _private->disk_unit = 0; ++ if (_private->disk_reserve < 100.0) ++ _private->disk_unit = 'p'; + +- if (_private->disk_reserve_size || _private->disk_reserve_percent) { ++ if (_private->disk_reserve) { + ret = posix_spawn_disk_space_check_thread(this); + if (ret) { + gf_msg(this->name, GF_LOG_INFO, 0, P_MSG_DISK_SPACE_CHECK_FAILED, +@@ -1221,23 +1227,14 @@ struct volume_options posix_options[] = { + .op_version = {GD_OP_VERSION_4_0_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC}, + {.key = {"reserve"}, +- .type = GF_OPTION_TYPE_INT, ++ .type = GF_OPTION_TYPE_PERCENT_OR_SIZET, + .min = 0, + .default_value = "1", + .validate = GF_OPT_VALIDATE_MIN, +- .description = "Percentage of disk space to be reserved." ++ .description = "Percentage/Size of disk space to be reserved." + " Set to 0 to disable", + .op_version = {GD_OP_VERSION_3_13_0}, + .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC}, +- {.key = {"reserve-size"}, +- .type = GF_OPTION_TYPE_SIZET, +- .min = 0, +- .default_value = "0", +- .validate = GF_OPT_VALIDATE_MIN, +- .description = "size in megabytes to be reserved for disk space." +- " Set to 0 to disable", +- .op_version = {GD_OP_VERSION_7_0}, +- .flags = OPT_FLAG_SETTABLE | OPT_FLAG_DOC}, + {.key = {"batch-fsync-mode"}, + .type = GF_OPTION_TYPE_STR, + .default_value = "reverse-fsync", +diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c +index 849db3d..07169b5 100644 +--- a/xlators/storage/posix/src/posix-helpers.c ++++ b/xlators/storage/posix/src/posix-helpers.c +@@ -2246,11 +2246,11 @@ posix_disk_space_check(xlator_t *this) + struct posix_private *priv = NULL; + char *subvol_path = NULL; + int op_ret = 0; +- uint64_t size = 0; +- int percent = 0; ++ double size = 0; ++ double percent = 0; + struct statvfs buf = {0}; +- uint64_t totsz = 0; +- uint64_t freesz = 0; ++ double totsz = 0; ++ double freesz = 0; + + GF_VALIDATE_OR_GOTO(this->name, this, out); + priv = this->private; +@@ -2258,14 +2258,6 @@ posix_disk_space_check(xlator_t *this) + + subvol_path = priv->base_path; + +- if (priv->disk_reserve_size) { +- size = priv->disk_reserve_size; +- } else { +- percent = priv->disk_reserve_percent; +- totsz = (buf.f_blocks * buf.f_bsize); +- size = ((totsz * percent) / 100); +- } +- + op_ret = sys_statvfs(subvol_path, &buf); + + if (op_ret == -1) { +@@ -2273,8 +2265,16 @@ posix_disk_space_check(xlator_t *this) + "statvfs failed on %s", subvol_path); + goto out; + } +- freesz = (buf.f_bfree * buf.f_bsize); + ++ if (priv->disk_unit == 'p') { ++ percent = priv->disk_reserve; ++ totsz = (buf.f_blocks * buf.f_bsize); ++ size = ((totsz * percent) / 100); ++ } else { ++ size = priv->disk_reserve; ++ } ++ ++ freesz = (buf.f_bfree * buf.f_bsize); + if (freesz <= size) { + priv->disk_space_full = 1; + } else { +diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c +index b92c411..fc847d6 100644 +--- a/xlators/storage/posix/src/posix-inode-fd-ops.c ++++ b/xlators/storage/posix/src/posix-inode-fd-ops.c +@@ -720,7 +720,7 @@ posix_do_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t flags, + thread after every 5 sec sleep to working correctly storage.reserve + option behaviour + */ +- if (priv->disk_reserve_size || priv->disk_reserve_percent) ++ if (priv->disk_reserve) + posix_disk_space_check(this); + + DISK_SPACE_CHECK_AND_GOTO(frame, priv, xdata, ret, ret, out); +@@ -2306,7 +2306,7 @@ posix_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) + }; + struct posix_private *priv = NULL; + int shared_by = 1; +- int percent = 0; ++ double percent = 0; + uint64_t reserved_blocks = 0; + + VALIDATE_OR_GOTO(frame, out); +@@ -2332,11 +2332,14 @@ posix_statfs(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) + goto out; + } + +- if (priv->disk_reserve_size) { +- reserved_blocks = priv->disk_reserve_size / buf.f_bsize; ++ if (priv->disk_unit == 'p') { ++ percent = priv->disk_reserve; ++ reserved_blocks = (((buf.f_blocks * percent) / 100) + 0.5); + } else { +- percent = priv->disk_reserve_percent; +- reserved_blocks = (buf.f_blocks * percent) / 100; ++ if (buf.f_bsize) { ++ reserved_blocks = (priv->disk_reserve + buf.f_bsize - 1) / ++ buf.f_bsize; ++ } + } + + if (buf.f_bfree > reserved_blocks) { +diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h +index 4364b96..b0935a7 100644 +--- a/xlators/storage/posix/src/posix.h ++++ b/xlators/storage/posix/src/posix.h +@@ -225,8 +225,8 @@ struct posix_private { + pthread_t health_check; + gf_boolean_t health_check_active; + +- uint32_t disk_reserve_percent; +- uint64_t disk_reserve_size; ++ double disk_reserve; ++ char disk_unit; + uint32_t disk_space_full; + pthread_t disk_space_check; + gf_boolean_t disk_space_check_active; +-- +1.8.3.1 + |