[Gluster-devel] [PATCH] Add support for min-free-disk in dht and the new nufa as a valid glusterfs size as well as percent.

Paul Rawson plrca2 at gmail.com
Mon Apr 27 17:53:21 UTC 2009


Ok, this one should be good. I've removed the changes to alu since
that seems to be depreciated.
-Paul

---
 libglusterfs/src/xlator.c               |   84 +++++++++++++++++++++++++++++++
 libglusterfs/src/xlator.h               |    1 +
 xlators/cluster/dht/src/dht-common.h    |    3 +-
 xlators/cluster/dht/src/dht-diskusage.c |   47 +++++++++++++----
 xlators/cluster/dht/src/dht.c           |   50 ++++++++++++-------
 xlators/cluster/dht/src/nufa.c          |   36 ++++++++++----
 6 files changed, 180 insertions(+), 41 deletions(-)

diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 6af2c8e..bf6252a 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -431,6 +431,90 @@ _volume_option_value_validate (xlator_t *xl,
 		ret = 0;
 	}
 	break;
+	case GF_OPTION_TYPE_PERCENTORSIZET:
+	{
+		uint32_t percent = 0;
+		uint64_t input_size = 0;
+		
+		/* Check if the value is valid percentage */
+		if (gf_string2percent (pair->value->data,
+				       &percent) == 0) {
+			if (percent > 100) {
+				gf_log (xl->name, GF_LOG_DEBUG,
+					"value given was greater than 100, "
+					"assuming this is actually a size");
+        		        if (gf_string2bytesize (pair->value->data,
+      	        			                &input_size) == 0) {
+			       	        /* Check the range */
+	        			if ((opt->min == 0) && (opt->max == 0)) {
+	       	        		        gf_log (xl->name, GF_LOG_DEBUG,
+        	      	        		        "no range check required for "
+                	      		       		"'option %s %s'",
+	               	        	        	pair->key, pair->value->data);
+						// It is a size
+			                        ret = 0;
+       				                goto out;
+              				}
+	        	        	if ((input_size < opt->min) ||
+	      			            (input_size > opt->max)) {
+        	       			        gf_log (xl->name, GF_LOG_ERROR,
+                	      			        "'%"PRId64"' in 'option %s %s' is "
+                       	       				"out of range [%"PRId64" - %"PRId64"]",
+               	        	        		input_size, pair->key,
+	       		                        	pair->value->data,
+	       		        	                opt->min, opt->max);
+		       	        	}
+					// It is a size
+		       			ret = 0;
+					goto out;
+				} else {
+					// It's not a percent or size
+					gf_log (xl->name, GF_LOG_ERROR,
+					"invalid number format \"%s\" "
+					"in \"option %s\"",
+					pair->value->data, pair->key);
+				}
+
+			}
+			// It is a percent
+			ret = 0;
+			goto out;
+		} else {
+       		        if (gf_string2bytesize (pair->value->data,
+     	        			        &input_size) == 0) {
+		       	        /* Check the range */
+        			if ((opt->min == 0) && (opt->max == 0)) {
+       	        		        gf_log (xl->name, GF_LOG_DEBUG,
+       	      	        		        "no range check required for "
+               	      		      		"'option %s %s'",
+               	        	        	pair->key, pair->value->data);
+					// It is a size
+		                        ret = 0;
+      				        goto out;
+             			}
+	        	        if ((input_size < opt->min) ||
+      			            (input_size > opt->max)) {
+       	       				gf_log (xl->name, GF_LOG_ERROR,
+               	      			        "'%"PRId64"' in 'option %s %s' is "
+                      	       			"out of range [%"PRId64" - %"PRId64"]",
+              	        	        	input_size, pair->key,
+       		                        	pair->value->data,
+       		        	                opt->min, opt->max);
+				}
+			} else {
+				// It's not a percent or size
+				gf_log (xl->name, GF_LOG_ERROR,
+					"invalid number format \"%s\" "
+					"in \"option %s\"",
+					pair->value->data, pair->key);
+			}
+			//It is a size
+                        ret = 0;
+ 		        goto out;
+		}
+
+	}
+	break;
 	case GF_OPTION_TYPE_TIME:
 	{
 		uint32_t input_time = 0;
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index 654e334..bba074e 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -807,6 +807,7 @@ typedef enum {
   	GF_OPTION_TYPE_INT,
   	GF_OPTION_TYPE_SIZET,
   	GF_OPTION_TYPE_PERCENT,
+        GF_OPTION_TYPE_PERCENTORSIZET,
   	GF_OPTION_TYPE_BOOL,
   	GF_OPTION_TYPE_XLATOR,
   	GF_OPTION_TYPE_PATH,
diff --git a/xlators/cluster/dht/src/dht-common.h
b/xlators/cluster/dht/src/dht-common.h
index 63a8bb2..1c2b6f4 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 5e3dc23..7edf4d0 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;
@@ -56,8 +57,15 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie,
xlator_t *this,
         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,
+					"avail_percent on %d is: %f, "
+					"and avail_space on %d is: %llu",
+					i, conf->du_stats[i].avail_percent,
+					i, conf->du_stats[i].avail_space);
+			}
         }
         UNLOCK (&conf->subvolume_lock);

@@ -174,15 +182,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;
+					}
+				}
                         }
                 }
         }
@@ -190,7 +207,7 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)

         if (subvol_filled) {
                 if (!(conf->du_stats[i].log++ % GF_UNIVERSAL_ANSWER)) {
-                        gf_log (this->name, GF_LOG_CRITICAL,
+                        gf_log (this->name, GF_LOG_WARNING,
                                 "disk space on subvolume '%s' is getting "
                                 "full (%.2f %%), consider adding more nodes",
                                 subvol->name,
@@ -205,7 +222,7 @@ xlator_t *
 dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol)
 {
         int         i = 0;
-        double      max_avail = 0;
+        uint64_t    max_avail = 0;
         xlator_t   *avail_subvol = NULL;
 	dht_conf_t *conf = NULL;

@@ -215,10 +232,16 @@ 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;
+			if (conf->disk_unit == 'p') {
+                	        if (conf->du_stats[i].avail_percent > max_avail) {
+                                	max_avail  = conf->du_stats[i].avail_percent;
+				}
                                 avail_subvol = conf->subvolumes[i];
-                        }
+			} else {
+                	        if (conf->du_stats[i].avail_space > max_avail) {
+					max_avail = conf->du_stats[i].avail_space;
+				}
+			}
                 }
         }
         UNLOCK (&conf->subvolume_lock);
diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c
index 4dac730..4658e59 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_ERROR,
@@ -106,27 +107,40 @@ 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,
+			  &temp_str) == 0) {
+		gf_string2boolean (temp_str,
 				   &conf->search_unhashed);
 	}

-	conf->unhashed_sticky_bit = 0;
+        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->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);
-	}
-
+        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';
+                }
+        }

         ret = dht_init_subvolumes (this, conf);
         if (ret == -1) {
@@ -242,11 +256,11 @@ struct xlator_cbks cbks = {


 struct volume_options options[] = {
+        { .key  = {"min-free-disk"},
+          .type = GF_OPTION_TYPE_PERCENTORSIZET
+        },
         { .key  = {"lookup-unhashed"},
 	  .type = GF_OPTION_TYPE_BOOL
 	},
-        { .key  = {"min-free-disk"},
-          .type = GF_OPTION_TYPE_PERCENT
-        },
 	{ .key  = {NULL} },
 };
diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c
index 57ac6b0..128ff77 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_ERROR,
@@ -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_PERCENTORSIZET
         },
 	{ .key  = {NULL} },
 };
-- 
1.6.0.6





More information about the Gluster-devel mailing list