From 426c2908aee4addd36d925ee93e56c9b2688ec1b Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Mon, 19 Jun 2017 11:50:28 +0530 Subject: cluster/dht: Additional checks for rebalance estimates The rebalance estimates calculation was not handling calculations correctly when no files had been processed, i.e., when rate_lookedup was 0. Now, the estimated time is set to 0 in such scenarios as there is no way for rebalance to figure out how long the process will take to complete without knowing the rate at which the files are being processed. Change-Id: I7b6378e297e1ba139852bcb2239adf2477336b5b BUG: 1457985 Signed-off-by: N Balachandran Reviewed-on: https://review.gluster.org/17564 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Amar Tumballi Reviewed-by: Raghavendra G --- xlators/cluster/dht/src/dht-rebalance.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'xlators/cluster/dht/src') diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 25b879a6b57..669db2b84ba 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -4497,9 +4497,10 @@ gf_defrag_get_estimates (dht_conf_t *conf) rate_lookedup = (total_processed)/elapsed; - /* We initially sum up dirs across all local subvols. - * The same directories will be counted for each subvol so - * we want to ensure that they are only counted once. + /* We initially sum up dirs across all local subvols because we get the + * file count from the inodes on each subvol. + * The same directories will be counted for each subvol but + * we want that they are only counted once. */ tmp_count = g_totalfiles @@ -4508,7 +4509,14 @@ gf_defrag_get_estimates (dht_conf_t *conf) if (total_processed > g_totalfiles) g_totalfiles = total_processed + 10000; - time_to_complete = (tmp_count)/rate_lookedup; + if (rate_lookedup) { + time_to_complete = (tmp_count)/rate_lookedup; + + } else { + + gf_msg (THIS->name, GF_LOG_ERROR, 0, 0, + "Unable to calculate estimated time for rebalance"); + } gf_log (THIS->name, GF_LOG_INFO, "TIME: total_processed=%"PRIu64" tmp_cnt = %"PRIu64"," @@ -4561,7 +4569,9 @@ gf_defrag_status_get (dht_conf_t *conf, dict_t *dict) && (defrag->defrag_status == GF_DEFRAG_STATUS_STARTED)) { time_to_complete = gf_defrag_get_estimates (conf); - time_left = time_to_complete - elapsed; + + if (time_to_complete && (time_to_complete > elapsed)) + time_left = time_to_complete - elapsed; gf_log (THIS->name, GF_LOG_INFO, "TIME: Estimated total time to complete = %"PRIu64 -- cgit