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

Kai Zhang kyle at zelin.io
Thu May 23 11:45:16 CEST 2013


On May 23, 2013, at 5:01 PM, Liu Yuan <namei.unix at gmail.com> wrote:

> 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 for catching this.

I think the name of get_path_size() makes me confused. 
Actually, it returns free size and also set the second parameter as used size.

How about modify it to:  

int get_path_size(char *path, uint64_t *used, uint64_t *free, uint64_t *total)

Thanks,
Kyle



More information about the sheepdog mailing list