diff options
Diffstat (limited to 'xlators/cluster/dht/src/dht-rebalance.c')
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 23383c528bc..f48ba19cc3d 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -891,8 +891,10 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, dht_layout_t *layout = NULL; uint64_t src_statfs_blocks = 1; uint64_t dst_statfs_blocks = 1; - double post_availspacepercent = 0; + double dst_post_availspacepercent = 0; + double src_post_availspacepercent = 0; uint64_t file_blocks = 0; + uint64_t src_total_blocks = 0; uint64_t dst_total_blocks = 0; xdata = dict_new (); @@ -953,6 +955,10 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, (dst_statfs.f_frsize / GF_DISK_SECTOR_SIZE); + src_total_blocks = src_statfs.f_blocks * + (src_statfs.f_frsize / + GF_DISK_SECTOR_SIZE); + /* if force option is given, do not check for space @ dst. * Check only if space is avail for the file */ if (flag != GF_DHT_MIGRATE_DATA) @@ -964,6 +970,9 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, subvol gains certain 'blocks' of free space. A valid check is necessary here to avoid errorneous move to destination where the space could be scantily available. + With heterogenous brick support, an actual space comparison could + prevent any files being migrated to newly added bricks if they are + smaller then the free space available on the existing bricks. */ if (stbuf) { if (!conf->use_fallocate) { @@ -977,7 +986,13 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, } } - if (dst_statfs_blocks <= src_statfs_blocks) { + src_post_availspacepercent = + ((src_statfs_blocks + file_blocks) * 100) / src_total_blocks; + + dst_post_availspacepercent = + (dst_statfs_blocks * 100) / dst_total_blocks; + + if (dst_post_availspacepercent < src_post_availspacepercent) { gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, "data movement of file " @@ -998,15 +1013,15 @@ __dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, check_avail_space: if (conf->disk_unit == 'p' && dst_statfs.f_blocks) { - post_availspacepercent = + dst_post_availspacepercent = (dst_statfs_blocks * 100) / dst_total_blocks; gf_msg_debug (this->name, 0, "file : %s, post_availspacepercent" " : %lf f_bavail : %lu min-free-disk: %lf", - loc->path, post_availspacepercent, + loc->path, dst_post_availspacepercent, dst_statfs.f_bavail, conf->min_free_disk); - if (post_availspacepercent < conf->min_free_disk) { + if (dst_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 " |