diff options
| author | Amar Tumballi <amar@gluster.com> | 2010-10-06 05:23:44 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-10-27 00:47:59 -0700 | 
| commit | c02cd37866ae22e3a433d737f3c80395bb72f002 (patch) | |
| tree | f36b11adfec519aa6c938356522b8f93614469d2 | |
| parent | 40dd9e9e18c5de009baf9e437d3222fa6b473237 (diff) | |
distribute: bring in statfs normalization
We had normalization of statvfs structure in 'cluster/unify' translator,
with distribute, we had this section as 'TODO:'. Now, the same code is
migrated to distribute.
Thanks to <marty.rosenberg@gmail.com> for sending the patches
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 1035 (The distribute translator does not handle differently sized block sizes and/or fragment sizes)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1035
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 40 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-diskusage.c | 2 | 
2 files changed, 36 insertions, 6 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 9caa3dc5b93..d1e04b16ae7 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -2432,13 +2432,37 @@ err:  	return 0;  } +/* + * dht_normalize_stats - + */ +static void +dht_normalize_stats (struct statvfs *buf, unsigned long bsize, +                     unsigned long frsize) +{ +        double factor = 0; + +        if (buf->f_bsize != bsize) { +                buf->f_bsize = bsize; +        } + +        if (buf->f_frsize != frsize) { +                factor = ((double) buf->f_frsize) / frsize; +                buf->f_frsize = frsize; +                buf->f_blocks = (fsblkcnt_t) (factor * buf->f_blocks); +                buf->f_bfree  = (fsblkcnt_t) (factor * buf->f_bfree); +                buf->f_bavail = (fsblkcnt_t) (factor * buf->f_bavail); + +        } +}  int  dht_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		int op_ret, int op_errno, struct statvfs *statvfs)  { -	dht_local_t  *local = NULL; -	int           this_call_cnt = 0; +	dht_local_t *local         = NULL; +	int          this_call_cnt = 0; +        int          bsize         = 0; +        int          frsize        = 0;  	local = frame->local; @@ -2451,9 +2475,15 @@ dht_statfs_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		}  		local->op_ret = 0; -		/* TODO: normalize sizes */ -		local->statvfs.f_bsize    = statvfs->f_bsize; -		local->statvfs.f_frsize   = statvfs->f_frsize; +                if (local->statvfs.f_bsize != 0) { +                        bsize = max(local->statvfs.f_bsize, statvfs->f_bsize); +                        frsize = max(local->statvfs.f_frsize, statvfs->f_frsize); +                        dht_normalize_stats(&local->statvfs, bsize, frsize); +                        dht_normalize_stats(statvfs, bsize, frsize); +                } else { +                        local->statvfs.f_bsize    = statvfs->f_bsize; +                        local->statvfs.f_frsize   = statvfs->f_frsize; +                }  		local->statvfs.f_blocks  += statvfs->f_blocks;  		local->statvfs.f_bfree   += statvfs->f_bfree; diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c index 879d6f4430e..14e278b1263 100644 --- a/xlators/cluster/dht/src/dht-diskusage.c +++ b/xlators/cluster/dht/src/dht-diskusage.c @@ -52,7 +52,7 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (statvfs && statvfs->f_blocks) {                  percent = (statvfs->f_bfree * 100) / statvfs->f_blocks; -                bytes = (statvfs->f_bfree * statvfs->f_bsize); +                bytes = (statvfs->f_bfree * statvfs->f_frsize);          }          LOCK (&conf->subvolume_lock);  | 
