diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-diskusage.c | 53 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht.c | 36 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/nufa.c | 36 | 
4 files changed, 90 insertions, 38 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 63a8bb213..1c2b6f443 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -117,7 +117,8 @@ struct dht_conf {  	gf_boolean_t   search_unhashed;  	int            gen;          dht_du_t      *du_stats; -        uint32_t       min_free_disk; +        uint64_t       min_free_disk; +        char           disk_unit;          int32_t        refresh_interval;          gf_boolean_t   unhashed_sticky_bit;  	struct timeval last_stat_fetch; diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c index dd92f7dda..468e88798 100644 --- a/xlators/cluster/dht/src/dht-diskusage.c +++ b/xlators/cluster/dht/src/dht-diskusage.c @@ -43,6 +43,7 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  	int            this_call_cnt = 0;          int            i = 0;          double         percent = 0; +        uint64_t       bytes = 0;  	local = frame->local;          conf = this->private; @@ -51,14 +52,24 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1)                   goto out; -        if (statvfs && statvfs->f_blocks) +        if (statvfs && statvfs->f_blocks) {                  percent = (statvfs->f_bfree * 100) / statvfs->f_blocks; +                bytes = (statvfs->f_bfree * statvfs->f_bsize); +        }          LOCK (&conf->subvolume_lock);          {                  for (i = 0; i < conf->subvolume_cnt; i++) -                        if (prev->this == conf->subvolumes[i]) +                        if (prev->this == conf->subvolumes[i]) {                                  conf->du_stats[i].avail_percent = percent; +                                conf->du_stats[i].avail_space   = bytes; +                                gf_log (this->name, GF_LOG_DEBUG, +                                        "on subvolume '%s': avail_percent is: " +                                        "%.2f and avail_space is: %"PRIu64"", +                                        prev->this->name,  +                                        conf->du_stats[i].avail_percent, +                                        conf->du_stats[i].avail_space); +                        }          }          UNLOCK (&conf->subvolume_lock); @@ -175,15 +186,24 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)          conf = this->private; -        /* Check for values above 90% free disk */ +        /* Check for values above specified percent or free disk */          LOCK (&conf->subvolume_lock);          {                  for (i = 0; i < conf->subvolume_cnt; i++) { -                        if ((subvol == conf->subvolumes[i]) && -                            (conf->du_stats[i].avail_percent <  -                             conf->min_free_disk)) { -                                subvol_filled = 1; -                                break; +                        if (subvol == conf->subvolumes[i]) { +                                if (conf->disk_unit == 'p') { +                                        if (conf->du_stats[i].avail_percent < +                                            conf->min_free_disk) { +                                                subvol_filled = 1; +                                                break; +                                        } +                                } else { +                                        if (conf->du_stats[i].avail_space < +                                            conf->min_free_disk) { +                                                subvol_filled = 1; +                                                break; +                                        } +                                }                          }                  }          } @@ -206,7 +226,7 @@ xlator_t *  dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol)   {          int         i = 0; -        double      max_avail = 0; +        double      max= 0;          xlator_t   *avail_subvol = NULL;  	dht_conf_t *conf = NULL; @@ -216,15 +236,22 @@ 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->du_stats[i].avail_percent > max_avail) { -                                max_avail  = conf->du_stats[i].avail_percent; -                                avail_subvol = conf->subvolumes[i]; +                        if (conf->disk_unit == 'p') { +                                if (conf->du_stats[i].avail_percent > max) { +                                        max = conf->du_stats[i].avail_percent; +                                        avail_subvol = conf->subvolumes[i]; +                                } +                        } else { +                                if (conf->du_stats[i].avail_space > max) { +                                        max = conf->du_stats[i].avail_space; +                                        avail_subvol = conf->subvolumes[i]; +                                }                          }                  }          }          UNLOCK (&conf->subvolume_lock); -        if (max_avail < conf->min_free_disk) +        if (max < conf->min_free_disk)                  avail_subvol = subvol;          if (avail_subvol == subvol) { diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index 21f468b85..e004dee0d 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -81,9 +81,10 @@ int  init (xlator_t *this)  {          dht_conf_t    *conf = NULL; -	char          *lookup_unhashed_str = NULL; +	char          *temp_str = NULL;          int            ret = -1;          int            i = 0; +        uint32_t       temp_free_disk = 0;  	if (!this->children) {  		gf_log (this->name, GF_LOG_CRITICAL, @@ -105,26 +106,33 @@ init (xlator_t *this)  	conf->search_unhashed = 0; -	if (dict_get_str (this->options, "lookup-unhashed", -			  &lookup_unhashed_str) == 0) { -		gf_string2boolean (lookup_unhashed_str, -				   &conf->search_unhashed); +	if (dict_get_str (this->options, "lookup-unhashed", &temp_str) == 0) { +		gf_string2boolean (temp_str, &conf->search_unhashed);  	}  	conf->unhashed_sticky_bit = 0; -	if (dict_get_str (this->options, "unhashed-sticky-bit", -			  &lookup_unhashed_str) == 0) { -	        gf_string2boolean (lookup_unhashed_str, -				   &conf->unhashed_sticky_bit); +	if (dict_get_str (this->options, "unhashed-sticky-bit",  +                          &temp_str) == 0) { +	        gf_string2boolean (temp_str, &conf->unhashed_sticky_bit);  	} +        conf->disk_unit = 'p';          conf->min_free_disk = 10; -	if (dict_get_str (this->options, "min-free-disk", -			  &lookup_unhashed_str) == 0) { -		gf_string2percent (lookup_unhashed_str, -				   &conf->min_free_disk); +	if (dict_get_str (this->options, "min-free-disk", &temp_str) == 0) { +		if (gf_string2percent (temp_str, &temp_free_disk) == 0) { +                        if (temp_free_disk > 100) { +                                gf_string2bytesize (temp_str,  +                                                    &conf->min_free_disk); +                                conf->disk_unit = 'b'; +                        } else { +                                conf->min_free_disk = (uint64_t)temp_free_disk; +                        } +                } else { +                        gf_string2bytesize (temp_str, &conf->min_free_disk); +                        conf->disk_unit = 'b'; +                }  	} @@ -246,7 +254,7 @@ struct volume_options options[] = {  	  .type = GF_OPTION_TYPE_BOOL   	},          { .key  = {"min-free-disk"}, -          .type = GF_OPTION_TYPE_PERCENT +          .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,          },  	{ .key  = {NULL} },  }; diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c index a61daf879..c8ce7fdee 100644 --- a/xlators/cluster/dht/src/nufa.c +++ b/xlators/cluster/dht/src/nufa.c @@ -527,10 +527,11 @@ init (xlator_t *this)  	xlator_list_t *trav = NULL;  	data_t        *data = NULL;  	char          *local_volname = NULL; -	char          *lookup_unhashed_str = NULL; +	char          *temp_str = NULL;          int            ret = -1;          int            i = 0;  	char           my_hostname[256]; +	uint32_t       temp_free_disk = 0;  	if (!this->children) {  		gf_log (this->name, GF_LOG_CRITICAL, @@ -553,9 +554,9 @@ init (xlator_t *this)  	conf->search_unhashed = 0;  	if (dict_get_str (this->options, "lookup-unhashed", -			  &lookup_unhashed_str) == 0) { -		gf_string2boolean (lookup_unhashed_str, -				   &conf->search_unhashed); +			  &temp_str) == 0) { +		gf_string2boolean (temp_str, + 				   &conf->search_unhashed);  	}          ret = dht_init_subvolumes (this, conf); @@ -607,11 +608,26 @@ init (xlator_t *this)  	conf->local_volume = trav->xlator;          conf->min_free_disk = 10; - -	data = dict_get (this->options, "min-free-disk"); -	if (data) { -		gf_string2percent (data->data, &conf->min_free_disk); -	} +        conf->disk_unit = 'p'; + +        if (dict_get_str (this->options, "min-free-disk", +                          &temp_str) == 0) { +                if (gf_string2percent (temp_str, +                                       &temp_free_disk) == 0) { +                        if (temp_free_disk > 100) { +                                gf_string2bytesize (temp_str, +                                                        &conf->min_free_disk); +                                conf->disk_unit = 'b'; +                        } else { +                                conf->min_free_disk = (uint64_t)temp_free_disk; +                                conf->disk_unit = 'p'; +                        } +                } else { +                        gf_string2bytesize (temp_str, +                                                &conf->min_free_disk); +                        conf->disk_unit = 'b'; +                } +        }          conf->du_stats = CALLOC (conf->subvolume_cnt, sizeof (dht_du_t));          if (!conf->du_stats) { @@ -720,7 +736,7 @@ struct volume_options options[] = {  	  .type = GF_OPTION_TYPE_BOOL   	},          { .key  = {"min-free-disk"}, -          .type = GF_OPTION_TYPE_PERCENT +          .type = GF_OPTION_TYPE_PERCENT_OR_SIZET,          },  	{ .key  = {NULL} },  };  | 
