[Gluster-devel] [PATCH: glusterfs] fixed? dht and nufa

Paul Rawson plrca2 at gmail.com
Wed Apr 22 23:11:09 UTC 2009


>From e533f88b1ff4870cb9dda7d12a185ff39c4f87af Mon Sep 17 00:00:00 2001
From: Paul Rawson <plrca2 at gmail.com>
Date: Tue, 21 Apr 2009 23:54:31 -0700
Subject: [PATCH] Patch to allow min-free-disk for dht and the new nufa
to be specified
 as a percent or a valid glusterfs size (KB,MB,GB,TB,PB).

---
 libglusterfs/src/xlator.c               |    2 +-
 scheduler/alu/src/alu.c                 |    8 +++--
 xlators/cluster/dht/src/dht-common.h    |    3 +-
 xlators/cluster/dht/src/dht-diskusage.c |   48 +++++++++++++++++++++++--------
 xlators/cluster/dht/src/dht.c           |   24 +++++++++------
 xlators/cluster/dht/src/nufa.c          |   24 ++++++++++-----
 6 files changed, 75 insertions(+), 34 deletions(-)

diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 5b5067a..0345037 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -434,7 +434,7 @@ _volume_option_value_validate (xlator_t *xl,
 	case GF_OPTION_TYPE_PERCENTORSIZET:
 	{
 		uint32_t percent = 0;
-		uint32_t input_size = 0;
+		input_size = 0;
 		
 		/* Check if the value is valid percentage */
 		if (gf_string2percent (pair->value->data,
diff --git a/scheduler/alu/src/alu.c b/scheduler/alu/src/alu.c
index 8939531..967eece 100644
--- a/scheduler/alu/src/alu.c
+++ b/scheduler/alu/src/alu.c
@@ -98,6 +98,7 @@ get_stats_free_disk (struct xlator_stats *this)
 			return this->free_disk;
 		}
 	}
+	return 0;
 }

 static int64_t
@@ -384,10 +385,11 @@ alu_init (xlator_t *xl)
 		_limit_fn->next = tmp_limits;
 		alu_sched->limits_fn = _limit_fn;
 		
-		if (gf_string2percent (limits->data, &min_free_disk) == 0) {
-			alu_sched->spec_limit.disk_unit = 'p';
-		} else {
+		if (gf_string2bytesize (limits->data, &min_free_disk)) {
 			alu_sched->spec_limit.disk_unit = 'b';
+		} else {
+			gf_string2percent (limits->data, &min_free_disk);
+			alu_sched->spec_limit.disk_unit = 'p';
 		}

 		alu_sched->spec_limit.free_disk = min_free_disk;
diff --git a/xlators/cluster/dht/src/dht-common.h
b/xlators/cluster/dht/src/dht-common.h
index 6d78479..06d79ca 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;
 	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..a809380 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;
@@ -52,12 +53,20 @@ dht_du_info_cbk (call_frame_t *frame, void
*cookie, xlator_t *this,
                 goto out;

         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,
+					"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 +183,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 +208,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 +223,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 +233,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 ddf9583..7e65d6b 100644
--- a/xlators/cluster/dht/src/dht.c
+++ b/xlators/cluster/dht/src/dht.c
@@ -81,7 +81,7 @@ 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;

@@ -106,17 +106,23 @@ 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->min_free_disk = 10;
+        conf->disk_unit = 'p';

 	if (dict_get_str (this->options, "min-free-disk",
-			  &lookup_unhashed_str) == 0) {
-		gf_string2percent (lookup_unhashed_str,
-				   &conf->min_free_disk);
+			  &temp_str) == 0) {
+		if (!gf_string2bytesize (temp_str,
+				   &conf->min_free_disk)) {
+			conf->disk_unit = 'b';
+		} else {
+			gf_string2percent (temp_str, &conf->min_free_disk);
+			conf->disk_unit = 'p';
+		}
 	}


@@ -234,11 +240,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..eb84479 100644
--- a/xlators/cluster/dht/src/nufa.c
+++ b/xlators/cluster/dht/src/nufa.c
@@ -527,7 +527,7 @@ 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];
@@ -553,8 +553,8 @@ 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);
 	}

@@ -607,11 +607,19 @@ init (xlator_t *this)
 	conf->local_volume = trav->xlator;

         conf->min_free_disk = 10;
+        conf->disk_unit = 'p';
+
+        if (dict_get_str (this->options, "min-free-disk",
+                          &temp_str) == 0) {
+                if (!gf_string2bytesize (temp_str,
+                                   &conf->min_free_disk)) {
+                        conf->disk_unit = 'b';
+                } else {
+                        gf_string2percent (temp_str, &conf->min_free_disk);
+                        conf->disk_unit = 'p';
+                }
+        }

-	data = dict_get (this->options, "min-free-disk");
-	if (data) {
-		gf_string2percent (data->data, &conf->min_free_disk);
-	}

         conf->du_stats = CALLOC (conf->subvolume_cnt, sizeof (dht_du_t));
         if (!conf->du_stats) {
@@ -720,7 +728,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