>From e533f88b1ff4870cb9dda7d12a185ff39c4f87af Mon Sep 17 00:00:00 2001<br />From: Paul Rawson &lt;plrca2@gmail.com&gt;<br />Date: Tue, 21 Apr 2009 23:54:31 -0700<br />Subject: [PATCH] Patch to allow min-free-disk for dht and the new nufa to be specified<br /> as a percent or a valid glusterfs size (KB,MB,GB,TB,PB).<br /><br />---<br /> libglusterfs/src/xlator.c               |    2 +-<br /> scheduler/alu/src/alu.c                 |    8 +++--<br /> xlators/cluster/dht/src/dht-common.h    |    3 +-<br /> xlators/cluster/dht/src/dht-diskusage.c |   48 +++++++++++++++++++++++--------<br /> xlators/cluster/dht/src/dht.c           |   24 +++++++++------<br /> xlators/cluster/dht/src/nufa.c          |   24 ++++++++++-----<br /> 6 files changed, 75 insertions(+), 34 deletions(-)<br /><br />diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c<br />index 5b5067a..0345037 100644<br />--- a/libglusterfs/src/xlator.c<br />+++ b/libglusterfs/src/xlator.c<br />@@ -434,7 +434,7 @@ _volume_option_value_validate (xlator_t *xl,<br />         case GF_OPTION_TYPE_PERCENTORSIZET:<br />         {<br />                 uint32_t percent = 0;<br />-                uint32_t input_size = 0;<br />+                input_size = 0;<br />                 <br />                 /* Check if the value is valid percentage */<br />                 if (gf_string2percent (pair-&gt;value-&gt;data, <br />diff --git a/scheduler/alu/src/alu.c b/scheduler/alu/src/alu.c<br />index 8939531..967eece 100644<br />--- a/scheduler/alu/src/alu.c<br />+++ b/scheduler/alu/src/alu.c<br />@@ -98,6 +98,7 @@ get_stats_free_disk (struct xlator_stats *this)<br />                         return this-&gt;free_disk;<br />                 }<br />         }<br />+        return 0;<br /> }<br /> <br /> static int64_t <br />@@ -384,10 +385,11 @@ alu_init (xlator_t *xl)<br />                 _limit_fn-&gt;next = tmp_limits;<br />                 alu_sched-&gt;limits_fn = _limit_fn;<br />                 <br />-                if (gf_string2percent (limits-&gt;data, &min_free_disk) == 0) {<br />-                        alu_sched-&gt;spec_limit.disk_unit = &#39;p&#39;;<br />-                } else {<br />+                if (gf_string2bytesize (limits-&gt;data, &min_free_disk)) {<br />                         alu_sched-&gt;spec_limit.disk_unit = &#39;b&#39;;<br />+                } else {<br />+                        gf_string2percent (limits-&gt;data, &min_free_disk);<br />+                        alu_sched-&gt;spec_limit.disk_unit = &#39;p&#39;;<br />                 }<br /> <br />                 alu_sched-&gt;spec_limit.free_disk = min_free_disk;<br />diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h<br />index 6d78479..06d79ca 100644<br />--- a/xlators/cluster/dht/src/dht-common.h<br />+++ b/xlators/cluster/dht/src/dht-common.h<br />@@ -117,7 +117,8 @@ struct dht_conf {<br />         gf_boolean_t   search_unhashed;<br />         int            gen;<br />         dht_du_t      *du_stats;<br />-        uint32_t       min_free_disk;<br />+        uint64_t       min_free_disk;<br />+        char           disk_unit;<br />         int32_t        refresh_interval;<br />         struct timeval last_stat_fetch;<br /> };<br />diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c<br />index 5e3dc23..a809380 100644<br />--- a/xlators/cluster/dht/src/dht-diskusage.c<br />+++ b/xlators/cluster/dht/src/dht-diskusage.c<br />@@ -43,6 +43,7 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,<br />         int            this_call_cnt = 0;<br />         int            i = 0;<br />         double         percent = 0;<br />+        uint64_t       bytes = 0;<br /> <br />         local = frame-&gt;local;<br />         conf = this-&gt;private;<br />@@ -52,12 +53,20 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,<br />                 goto out;<br />         <br />         percent = (statvfs-&gt;f_bfree * 100) / statvfs-&gt;f_blocks;<br />+        bytes = (statvfs-&gt;f_bfree) * (statvfs-&gt;f_bsize);<br />         <br />         LOCK (&conf-&gt;subvolume_lock);<br />         {<br />                 for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++)<br />-                        if (prev-&gt;this == conf-&gt;subvolumes[i])<br />+                        if (prev-&gt;this == conf-&gt;subvolumes[i]){<br />                                 conf-&gt;du_stats[i].avail_percent = percent;<br />+                                conf-&gt;du_stats[i].avail_space = bytes;<br />+                                gf_log (this-&gt;name, GF_LOG_DEBUG,<br />+                                        &quot;avail_percent on %d is: %f, &quot;<br />+                                        &quot;and avail_space on %d is: %llu&quot;, <br />+                                        i, conf-&gt;du_stats[i].avail_percent,<br />+                                        i, conf-&gt;du_stats[i].avail_space);<br />+                        }<br />         }<br />         UNLOCK (&conf-&gt;subvolume_lock);<br /> <br />@@ -174,15 +183,24 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)<br /> <br />         conf = this-&gt;private;<br /> <br />-        /* Check for values above 90% free disk */<br />+        /* Check for values above specified percent or free disk */<br />         LOCK (&conf-&gt;subvolume_lock);<br />         {<br />                 for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {<br />-                        if ((subvol == conf-&gt;subvolumes[i]) &&<br />-                            (conf-&gt;du_stats[i].avail_percent &lt; <br />-                             conf-&gt;min_free_disk)) {<br />-                                subvol_filled = 1;<br />-                                break;<br />+                        if (subvol == conf-&gt;subvolumes[i]) {<br />+                                if (conf-&gt;disk_unit == &#39;p&#39;) {<br />+                                        if (conf-&gt;du_stats[i].avail_percent &lt; <br />+                                            conf-&gt;min_free_disk) {<br />+                                                subvol_filled = 1;<br />+                                                break;<br />+                                        }<br />+                                } else {<br />+                                        if (conf-&gt;du_stats[i].avail_space &lt; <br />+                                            conf-&gt;min_free_disk) {<br />+                                                subvol_filled = 1;<br />+                                                break;<br />+                                        }<br />+                                }<br />                         }<br />                 }<br />         }<br />@@ -190,7 +208,7 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol)<br /> <br />         if (subvol_filled) {<br />                 if (!(conf-&gt;du_stats[i].log++ % GF_UNIVERSAL_ANSWER)) {<br />-                        gf_log (this-&gt;name, GF_LOG_CRITICAL,<br />+                        gf_log (this-&gt;name, GF_LOG_WARNING,<br />                                 &quot;disk space on subvolume &#39;%s&#39; is getting &quot;<br />                                 &quot;full (%.2f %%), consider adding more nodes&quot;, <br />                                 subvol-&gt;name, <br />@@ -205,7 +223,7 @@ xlator_t *<br /> dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol) <br /> {<br />         int         i = 0;<br />-        double      max_avail = 0;<br />+        uint64_t   max_avail = 0;<br />         xlator_t   *avail_subvol = NULL;<br />         dht_conf_t *conf = NULL;<br /> <br />@@ -215,10 +233,16 @@ dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol)<br />         LOCK (&conf-&gt;subvolume_lock);<br />         {<br />                 for (i = 0; i &lt; conf-&gt;subvolume_cnt; i++) {<br />-                        if (conf-&gt;du_stats[i].avail_percent &gt; max_avail) {<br />-                                max_avail  = conf-&gt;du_stats[i].avail_percent;<br />+                        if (conf-&gt;disk_unit == &#39;p&#39;) {<br />+                                if (conf-&gt;du_stats[i].avail_percent &gt; max_avail) {<br />+                                        max_avail  = conf-&gt;du_stats[i].avail_percent;<br />+                                }<br />                                 avail_subvol = conf-&gt;subvolumes[i];<br />-                        }<br />+                        } else {<br />+                                if (conf-&gt;du_stats[i].avail_space &gt; max_avail) {<br />+                                        max_avail = conf-&gt;du_stats[i].avail_space;<br />+                                }<br />+                        }<br />                 }<br />         }<br />         UNLOCK (&conf-&gt;subvolume_lock);<br />diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c<br />index ddf9583..7e65d6b 100644<br />--- a/xlators/cluster/dht/src/dht.c<br />+++ b/xlators/cluster/dht/src/dht.c<br />@@ -81,7 +81,7 @@ int<br /> init (xlator_t *this)<br /> {<br />         dht_conf_t    *conf = NULL;<br />-        char          *lookup_unhashed_str = NULL;<br />+        char          *temp_str = NULL;<br />         int            ret = -1;<br />         int            i = 0;<br /> <br />@@ -106,17 +106,23 @@ init (xlator_t *this)<br />         conf-&gt;search_unhashed = 0;<br /> <br />         if (dict_get_str (this-&gt;options, &quot;lookup-unhashed&quot;,<br />-                          &lookup_unhashed_str) == 0) {<br />-                gf_string2boolean (lookup_unhashed_str,<br />+                          &temp_str) == 0) {<br />+                gf_string2boolean (temp_str,<br />                                    &conf-&gt;search_unhashed);<br />         }<br />         <br />         conf-&gt;min_free_disk = 10;<br />+        conf-&gt;disk_unit = &#39;p&#39;;<br /> <br />         if (dict_get_str (this-&gt;options, &quot;min-free-disk&quot;,<br />-                          &lookup_unhashed_str) == 0) {<br />-                gf_string2percent (lookup_unhashed_str,<br />-                                   &conf-&gt;min_free_disk);<br />+                          &temp_str) == 0) {<br />+                if (!gf_string2bytesize (temp_str,<br />+                                   &conf-&gt;min_free_disk)) {<br />+                        conf-&gt;disk_unit = &#39;b&#39;;<br />+                } else {<br />+                        gf_string2percent (temp_str, &conf-&gt;min_free_disk);<br />+                        conf-&gt;disk_unit = &#39;p&#39;;<br />+                }<br />         }<br /> <br /> <br />@@ -234,11 +240,11 @@ struct xlator_cbks cbks = {<br /> <br /> <br /> struct volume_options options[] = {<br />+        { .key  = {&quot;min-free-disk&quot;},<br />+          .type = GF_OPTION_TYPE_PERCENTORSIZET<br />+        },<br />         { .key  = {&quot;lookup-unhashed&quot;}, <br />           .type = GF_OPTION_TYPE_BOOL <br />         },<br />-        { .key  = {&quot;min-free-disk&quot;},<br />-          .type = GF_OPTION_TYPE_PERCENT<br />-        },<br />         { .key  = {NULL} },<br /> };<br />diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c<br />index 57ac6b0..eb84479 100644<br />--- a/xlators/cluster/dht/src/nufa.c<br />+++ b/xlators/cluster/dht/src/nufa.c<br />@@ -527,7 +527,7 @@ init (xlator_t *this)<br />         xlator_list_t *trav = NULL;<br />         data_t        *data = NULL;<br />         char          *local_volname = NULL;<br />-        char          *lookup_unhashed_str = NULL;<br />+        char          *temp_str = NULL;<br />         int            ret = -1;<br />         int            i = 0;<br />         char           my_hostname[256];<br />@@ -553,8 +553,8 @@ init (xlator_t *this)<br />         conf-&gt;search_unhashed = 0;<br /> <br />         if (dict_get_str (this-&gt;options, &quot;lookup-unhashed&quot;,<br />-                          &lookup_unhashed_str) == 0) {<br />-                gf_string2boolean (lookup_unhashed_str,<br />+                          &temp_str) == 0) {<br />+                gf_string2boolean (temp_str,<br />                                    &conf-&gt;search_unhashed);<br />         }<br /> <br />@@ -607,11 +607,19 @@ init (xlator_t *this)<br />         conf-&gt;local_volume = trav-&gt;xlator;<br /> <br />         conf-&gt;min_free_disk = 10;<br />+        conf-&gt;disk_unit = &#39;p&#39;;<br />+<br />+        if (dict_get_str (this-&gt;options, &quot;min-free-disk&quot;,<br />+                          &temp_str) == 0) {<br />+                if (!gf_string2bytesize (temp_str,<br />+                                   &conf-&gt;min_free_disk)) {<br />+                        conf-&gt;disk_unit = &#39;b&#39;;<br />+                } else {<br />+                        gf_string2percent (temp_str, &conf-&gt;min_free_disk);<br />+                        conf-&gt;disk_unit = &#39;p&#39;;<br />+                }<br />+        }<br /> <br />-        data = dict_get (this-&gt;options, &quot;min-free-disk&quot;);<br />-        if (data) {<br />-                gf_string2percent (data-&gt;data, &conf-&gt;min_free_disk);<br />-        }<br /> <br />         conf-&gt;du_stats = CALLOC (conf-&gt;subvolume_cnt, sizeof (dht_du_t));<br />         if (!conf-&gt;du_stats) {<br />@@ -720,7 +728,7 @@ struct volume_options options[] = {<br />           .type = GF_OPTION_TYPE_BOOL <br />         },<br />         { .key  = {&quot;min-free-disk&quot;},<br />-          .type = GF_OPTION_TYPE_PERCENT<br />+          .type = GF_OPTION_TYPE_PERCENTORSIZET<br />         },<br />         { .key  = {NULL} },<br /> };<br />-- <br />1.6.0.6