summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-selfheal.c
diff options
context:
space:
mode:
authorSakshi Bansal <sabansal@redhat.com>2015-11-17 15:11:40 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-11-26 21:04:27 -0800
commit6b315b87d80cf681b976d78b444c761fc3a1caa7 (patch)
tree42b78a927ef77891ade9aad0be1908bc3bfeab2c /xlators/cluster/dht/src/dht-selfheal.c
parenta1919e91279a6c691fbd3dd6c0d97e74e78ccf22 (diff)
dht : changing variable type to avoid overflow
For layout computation we find total size of the cluster and store it in an unsigned 32 bit variable. For large clusters this value may overflow which leads to wrong computations and for some bricks the layout may overflow. Hence using unsigned 64 bit to handle large values. Change-Id: I7c3ba26ea2c4158065ea9e74705a7ede1b6759c7 BUG: 1282751 Signed-off-by: Sakshi Bansal <sabansal@redhat.com> Reviewed-on: http://review.gluster.org/12597 Reviewed-by: Susant Palai <spalai@redhat.com> Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-selfheal.c')
-rw-r--r--xlators/cluster/dht/src/dht-selfheal.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c
index 676a110fedd..3d42b0f410f 100644
--- a/xlators/cluster/dht/src/dht-selfheal.c
+++ b/xlators/cluster/dht/src/dht-selfheal.c
@@ -1563,14 +1563,15 @@ dht_selfheal_layout_new_directory (call_frame_t *frame, loc_t *loc,
dht_layout_t *layout)
{
xlator_t *this = NULL;
- uint32_t chunk = 0;
+ double chunk = 0;
int i = 0;
uint32_t start = 0;
int bricks_to_use = 0;
int err = 0;
int start_subvol = 0;
uint32_t curr_size;
- uint32_t total_size = 0;
+ uint32_t range_size;
+ uint64_t total_size = 0;
int real_i;
dht_conf_t *priv;
gf_boolean_t weight_by_size;
@@ -1603,9 +1604,9 @@ dht_selfheal_layout_new_directory (call_frame_t *frame, loc_t *loc,
if (weight_by_size && total_size) {
/* We know total_size is not zero. */
- chunk = ((unsigned long) 0xffffffff) / total_size;
+ chunk = ((double) 0xffffffff) / ((double) total_size);
gf_msg_debug (this->name, 0,
- "chunk size = 0xffffffff / %u = 0x%x",
+ "chunk size = 0xffffffff / %lu = %f",
total_size, chunk);
}
else {
@@ -1643,17 +1644,18 @@ dht_selfheal_layout_new_directory (call_frame_t *frame, loc_t *loc,
else {
curr_size = 1;
}
+ range_size = chunk * curr_size;
gf_msg_debug (this->name, 0,
"assigning range size 0x%x to %s",
- chunk * curr_size,
+ range_size,
layout->list[i].xlator->name);
- DHT_SET_LAYOUT_RANGE(layout, i, start, chunk * curr_size,
+ DHT_SET_LAYOUT_RANGE(layout, i, start, range_size,
loc->path);
if (++bricks_used >= bricks_to_use) {
layout->list[i].stop = 0xffffffff;
goto done;
}
- start += (chunk * curr_size);
+ start += range_size;
}
done: