[PATCH: glusterfs] allow min-free-disk in bytes as option for dht and new nufa (requires changes mad

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

 



>From e533f88b1ff4870cb9dda7d12a185ff39c4f87af Mon Sep 17 00:00:00 2001
From: Paul Rawson <plrca2@xxxxxxxxx>
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 = "" /> 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 = "" (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

[Index of Archives]     [Gluster Users]     [Ceph Users]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux