[sheepdog] [PATCH] md: don't use xattr for calculating path space

Liu Yuan namei.unix at gmail.com
Thu May 23 11:01:14 CEST 2013


On 05/23/2013 04:13 PM, Kai Zhang wrote:
> Currently, md calls init_path_space() for calculating path space after a path is pluged.
> If the path is pluged for the first time, md will use statvfs() to calculate path space
> ant set it to xattr. Next time when md calls init_path_space(), it will try to get path
> space from xattr other than re-calculate it.
> 
> This works fine for most times.
> However, if the path space changes for some reasons (for example, a lvm resize operation),
> init_path_space() will return a wrong number, because xattr haven't changed.
> 
> This patch will let init_path_space() use statvfs() for calculating space for each time.
> 
> Signed-off-by: Kai Zhang <kyle at zelin.io>
> ---
>  sheep/md.c |   31 ++++---------------------------
>  1 files changed, 4 insertions(+), 27 deletions(-)
> 
> diff --git a/sheep/md.c b/sheep/md.c
> index 291ffca..60dbd04 100644
> --- a/sheep/md.c
> +++ b/sheep/md.c
> @@ -255,47 +255,24 @@ out:
>  }
>  
>  /*
> - * If path is broken during initilization or not support xattr return 0. We can
> + * If path is broken during initilization return 0. We can
>   * safely use 0 to represent failure case  because 0 space path can be
>   * considered as broken path.
>   */
>  static uint64_t init_path_space(char *path)
>  {
> -	uint64_t size;
> +	uint64_t size = 0;
>  	char stale[PATH_MAX];
>  
> -	if (!is_xattr_enabled(path)) {
> -		sd_iprintf("multi-disk support need xattr feature");
> -		goto broken_path;
> -	}
> -
>  	snprintf(stale, PATH_MAX, "%s/.stale", path);
>  	if (xmkdir(stale, sd_def_dmode) < 0) {
>  		sd_eprintf("can't mkdir for %s, %m", stale);
> -		goto broken_path;
> -	}
> -
> -	if (getxattr(path, MDNAME, &size, MDSIZE) < 0) {
> -		if (errno == ENODATA) {
> -			goto create;
> -		} else {
> -			sd_eprintf("%s, %m", path);
> -			goto broken_path;
> -		}
> +		goto out;
>  	}
>  
> -	return size;
> -create:
>  	size = get_path_size(path, NULL);
> -	if (!size)
> -		goto broken_path;
> -	if (setxattr(path, MDNAME, &size, MDSIZE, 0) < 0) {
> -		sd_eprintf("%s, %m", path);
> -		goto broken_path;
> -	}
> +out:
>  	return size;
> -broken_path:
> -	return 0;
>  }
>  
>  static inline void remove_disk(int idx)
> 

This looks not enough to me. We use get_path_size() to get the actually
total capacity, so you should fix get_path_size() too, no? After node
reboot, we just get what is free size.

Thanks,
Yuan


More information about the sheepdog mailing list