diff options
| author | Raghavendra Talur <rtalur@redhat.com> | 2013-01-24 11:26:37 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-02-04 08:43:50 -0800 | 
| commit | 2a46c8769bc2b6ad491a305ea1d38023d0e22617 (patch) | |
| tree | 1c4f5ef50b148c13b5f00bbcca2195578ef8c08a /xlators/cluster/dht/src | |
| parent | 50f0882051dff81882115bf72abb67577099944f (diff) | |
cluster/dht: Correct min_free_disk behaviour
Problem:
Files were being created in subvol which had less than
min_free_disk available even in the cases where other
subvols with more space were available.
Solution:
Changed the logic to look for subvol which has more
space available.
In cases where all the subvols have lesser than
Min_free_disk available , the one with max space and
atleast one inode is available.
Known Issue: Cannot ensure that first file that is
created right after min-free-value is crossed on a
brick will get created in other brick because disk
usage stat takes some time to update in glusterprocess.
Will fix that as part of another bug.
Change-Id: If3ae0bf5a44f8739ce35b3ee3f191009ddd44455
BUG: 858488
Signed-off-by: Raghavendra Talur <rtalur@redhat.com>
Reviewed-on: http://review.gluster.org/4420
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 4 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-diskusage.c | 112 | 
2 files changed, 89 insertions, 27 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 764b37ac4a0..0dd654650c0 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -724,4 +724,8 @@ int  dht_dir_has_layout (dict_t *xattr);  gf_boolean_t  dht_is_subvol_in_layout (dht_layout_t *layout, xlator_t *xlator); +xlator_t * +dht_subvol_with_free_space_inodes (xlator_t *this, xlator_t *subvol); +xlator_t * +dht_subvol_maxspace_nonzeroinode (xlator_t *this, xlator_t *subvol);  #endif/* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c index 52ea3a32aca..0c87f4a647c 100644 --- a/xlators/cluster/dht/src/dht-diskusage.c +++ b/xlators/cluster/dht/src/dht-diskusage.c @@ -248,12 +248,11 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)  	return is_subvol_filled;  } + +/*Get the best subvolume to create the file in*/  xlator_t *  dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol)  { -	int         i = 0; -	double      max = 0; -	double      max_inodes = 0;  	xlator_t   *avail_subvol = NULL;  	dht_conf_t *conf = NULL; @@ -261,37 +260,96 @@ dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol)  	LOCK (&conf->subvolume_lock);  	{ -		for (i = 0; i < conf->subvolume_cnt; i++) { -			if (conf->disk_unit == 'p') { -				if ((conf->du_stats[i].avail_percent > max) -				    && (conf->du_stats[i].avail_inodes > max_inodes)) { -					max = conf->du_stats[i].avail_percent; -					max_inodes = conf->du_stats[i].avail_inodes; -					avail_subvol = conf->subvolumes[i]; -				} -			} else { -				if ((conf->du_stats[i].avail_space > max) -				    && (conf->du_stats[i].avail_inodes > max_inodes)) { -					max = conf->du_stats[i].avail_space; -					max_inodes = conf->du_stats[i].avail_inodes; -					avail_subvol = conf->subvolumes[i]; -				} +                avail_subvol = dht_subvol_with_free_space_inodes(this, subvol); +                if(!avail_subvol) +                { +                        avail_subvol = dht_subvol_maxspace_nonzeroinode(this, +                                                                        subvol); +                } -			} -		}  	}  	UNLOCK (&conf->subvolume_lock);  	if (!avail_subvol) { -		gf_log (this->name, GF_LOG_DEBUG, -			"no subvolume has enough free space and inodes to create"); +		gf_log (this->name, +                        GF_LOG_DEBUG, +			"no subvolume has enough free space and/or inodes\ +                         to create"); +                avail_subvol = subvol;  	} -	if ((max < conf->min_free_disk) && (max_inodes < conf->min_free_inodes)) -		avail_subvol = subvol; - -	if (!avail_subvol) -		avail_subvol = subvol;  	return avail_subvol;  } + +/*Get subvolume which has both space and inodes more than the min criteria*/ +xlator_t * +dht_subvol_with_free_space_inodes(xlator_t *this, xlator_t *subvol) +{ +        int i = 0; +        double max = 0; +        double max_inodes = 0; + +        xlator_t *avail_subvol = NULL; +        dht_conf_t *conf = NULL; + +        conf = this->private; + +        for(i=0; i < conf->subvolume_cnt; i++) { +                if ((conf->disk_unit == 'p') && +                    (conf->du_stats[i].avail_percent > conf->min_free_disk) && +                    (conf->du_stats[i].avail_inodes  > conf->min_free_inodes)) { +                        if ((conf->du_stats[i].avail_inodes > max_inodes) || +                            (conf->du_stats[i].avail_percent > max)) { +                                max = conf->du_stats[i].avail_percent; +                                max_inodes = conf->du_stats[i].avail_inodes; +                                avail_subvol = conf->subvolumes[i]; +                        } +                } + +                if ((conf->disk_unit != 'p') && +                    (conf->du_stats[i].avail_space > conf->min_free_disk) && +                    (conf->du_stats[i].avail_inodes  > conf->min_free_inodes)) { +                        if ((conf->du_stats[i].avail_inodes > max_inodes) || +                            (conf->du_stats[i].avail_space > max)) { +                                max = conf->du_stats[i].avail_space; +                                max_inodes = conf->du_stats[i].avail_inodes; +                                avail_subvol = conf->subvolumes[i]; +                        } +                } +        } + +        return avail_subvol; +} + + +/* Get subvol which has atleast one inode and maximum space */ +xlator_t * +dht_subvol_maxspace_nonzeroinode (xlator_t *this, xlator_t *subvol) +{ +        int         i = 0; +        double      max = 0; + +        xlator_t   *avail_subvol = NULL; +        dht_conf_t *conf = NULL; + +        conf = this->private; + +        for (i = 0; i < conf->subvolume_cnt; i++) { +                if (conf->disk_unit == 'p') { +                        if ((conf->du_stats[i].avail_percent > max) +                            && (conf->du_stats[i].avail_inodes > 0 )) { +                                max = conf->du_stats[i].avail_percent; +                                avail_subvol = conf->subvolumes[i]; +                        } +               } else { +                         if ((conf->du_stats[i].avail_space > max) +                            && (conf->du_stats[i].avail_inodes > 0)) { +                                 max = conf->du_stats[i].avail_space; +                                 avail_subvol = conf->subvolumes[i]; +                         } +               } +        } + +        return avail_subvol; +}  | 
