gluster-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Paul Rawson
Subject: [Gluster-devel] [PATCH: glusterfs] fixed? dht and nufa
Date: Wed, 22 Apr 2009 20:11:09 -0300

>From e533f88b1ff4870cb9dda7d12a185ff39c4f87af Mon Sep 17 00:00:00 2001
From: Paul Rawson <address@hidden>
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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]