summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSusant Palai <spalai@redhat.com>2017-07-26 17:12:03 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2017-08-02 15:05:06 +0000
commit87edff6e20ff3ff7bc1dc5a1b0186127effee364 (patch)
tree0f33e49a7953d5d777640774e36e2b8ae43a7239
parent64391ea321d269671814afd13cbdfe099b893e4d (diff)
cluster/dht: rebalance min-free-disk fix
To calculate available space on a subvolume we used to do the following in __dht_check_free_space. post_availspace = (dst_statfs.f_bavail * dst_statfs.f_frsize) - stbuf->ia_size Now to subtracting the file size from available space is tricky here. Sometime available space will be lesser than the file size and since all the participating members in calculation are unsigned int, the result is a large number (integer overflow). Solution: We do not need to subtract the file size from the space available, since fallocate would have reserved file size space already. > Change-Id: I4f724358c44b9911933742ff3ff8d55b3dfda1cb > BUG: 1475282 > Signed-off-by: Susant Palai <spalai@redhat.com> > Reviewed-on: https://review.gluster.org/17876 > Smoke: Gluster Build System <jenkins@build.gluster.org> > Reviewed-by: Raghavendra G <rgowdapp@redhat.com> > Reviewed-by: N Balachandran <nbalacha@redhat.com> > CentOS-regression: Gluster Build System <jenkins@build.gluster.org> > Signed-off-by: Susant Palai <spalai@redhat.com> Change-Id: I4f724358c44b9911933742ff3ff8d55b3dfda1cb BUG: 1477152 Signed-off-by: Susant Palai <spalai@redhat.com> Reviewed-on: https://review.gluster.org/17942 Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r--xlators/cluster/dht/src/dht-rebalance.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
index ffc7fdff3f5..d6718c55489 100644
--- a/xlators/cluster/dht/src/dht-rebalance.c
+++ b/xlators/cluster/dht/src/dht-rebalance.c
@@ -881,8 +881,7 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc
dht_layout_t *layout = NULL;
uint64_t src_statfs_blocks = 1;
uint64_t dst_statfs_blocks = 1;
- double post_availspace = 0;
- double post_percent = 0;
+ double post_availspacepercent = 0;
int i = 0;
xdata = dict_new ();
@@ -975,9 +974,12 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc
check_avail_space:
if (conf->disk_unit == 'p' && dst_statfs.f_blocks) {
- post_availspace = (dst_statfs.f_bavail * dst_statfs.f_frsize) - stbuf->ia_size;
- post_percent = (post_availspace * 100) / (dst_statfs.f_blocks * dst_statfs.f_frsize);
- if (post_percent < conf->min_free_disk) {
+ post_availspacepercent = (dst_statfs.f_bavail * 100) / dst_statfs.f_blocks;
+ gf_msg_debug (this->name, 0, "file : %s, post_availspacepercent : %lf "
+ "f_bavail : %lu min-free-disk: %lf", loc->path,
+ post_availspacepercent, dst_statfs.f_bavail, conf->min_free_disk);
+
+ if (post_availspacepercent < conf->min_free_disk) {
gf_msg (this->name, GF_LOG_WARNING, 0, 0,
"Write will cross min-free-disk for "
"file - %s on subvol - %s. Looking "
@@ -991,7 +993,11 @@ check_avail_space:
}
if (conf->disk_unit != 'p' &&
- ((dst_statfs.f_bavail * dst_statfs.f_frsize) - stbuf->ia_size) < conf->min_free_disk) {
+ ((dst_statfs.f_bavail * dst_statfs.f_frsize) < conf->min_free_disk)) {
+ gf_msg_debug (this->name, 0, "file : %s, destination frsize: %lu "
+ "f_bavail : %lu min-free-disk: %lf", loc->path,
+ dst_statfs.f_frsize, dst_statfs.f_bavail, conf->min_free_disk);
+
gf_msg (this->name, GF_LOG_WARNING, 0, 0, "Write will cross "
"min-free-disk for file - %s on subvol - %s. Looking "
"for new subvol", loc->path, to->name);