[Sheepdog] [PATCH v5 01/17] sheep: hide some minor store layout aware operations

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Wed Jan 4 21:08:06 CET 2012


At Fri, 30 Dec 2011 21:06:56 +0800,
Liu Yuan wrote:
> 
> From: Liu Yuan <tailai.ly at taobao.com>
> 
> We need this to decouple the sheep from kv-store.
> 
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
>  sheep/store.c |   57 ++++++++++++++++++++++++++++++++++++++-------------------
>  1 files changed, 38 insertions(+), 19 deletions(-)
> 
> diff --git a/sheep/store.c b/sheep/store.c
> index 56e3cd2..3323fbc 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -57,6 +57,14 @@ static int obj_cmp(const void *oid1, const void *oid2)
>  	return 0;
>  }
>  
> +static void get_store_dir(struct strbuf *buf, int epoch)
> +{
> +	if (!strcmp(store.name, "simple"))
> +		strbuf_addf(buf, "%s%08u", obj_path, epoch);
> +	else /* XXX assume other store doesn't need epoch/obj pattern */
> +		strbuf_addf(buf, "%s", obj_path);
> +}
> +

It is not good to make a conditional branch based on the drvier name
here.

How about adding stat and jrnl_begin/end/recover to the store driver
interface?  Then, we can remove get_store_dir().

>  int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
>  {
>  	struct statvfs vs;
> @@ -65,22 +73,27 @@ int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
>  	struct dirent *d;
>  	uint64_t used = 0;
>  	struct stat s;
> -	char path[1024], store_dir[1024];
> +	char path[1024];
> +	struct strbuf store_dir = STRBUF_INIT;
>  
>  	ret = statvfs(mnt_path, &vs);
> -	if (ret)
> -		return SD_RES_EIO;
> +	if (ret) {
> +		ret = SD_RES_EIO;
> +		goto out;
> +	}
>  
> -	snprintf(store_dir, sizeof(store_dir), "%s%08u", obj_path, epoch);
> -	dir = opendir(store_dir);
> -	if (!dir)
> -		return SD_RES_EIO;
> +	get_store_dir(&store_dir, epoch);
> +	dir = opendir(store_dir.buf);
> +	if (!dir) {
> +		ret = SD_RES_EIO;
> +		goto out;
> +	}
>  
>  	while ((d = readdir(dir))) {
>  		if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
>  			continue;
>  
> -		snprintf(path, sizeof(path), "%s/%s", store_dir, d->d_name);
> +		snprintf(path, sizeof(path), "%s/%s", store_dir.buf, d->d_name);
>  
>  		ret = stat(path, &s);
>  		if (ret)
> @@ -90,11 +103,13 @@ int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
>  	}
>  
>  	closedir(dir);
> +	ret = SD_RES_SUCCESS;
>  
>  	*store_size = (uint64_t)vs.f_frsize * vs.f_bfree + used;
>  	*store_free = (uint64_t)vs.f_frsize * vs.f_bfree;
> -
> -	return SD_RES_SUCCESS;
> +out:
> +	strbuf_release(&store_dir);
> +	return ret;
>  }
>  
>  static int merge_objlist(uint64_t *list1, int nr_list1,
> @@ -411,11 +426,12 @@ out:
>  
>  int update_epoch_store(uint32_t epoch)
>  {
> -	char new[1024];
> -
> -	snprintf(new, sizeof(new), "%s%08u/", obj_path, epoch);
> -	mkdir(new, def_dmode);
> +	if (!strcmp(store.name, "simple")) {
> +		char new[1024];
>  
> +		snprintf(new, sizeof(new), "%s%08u/", obj_path, epoch);
> +		mkdir(new, def_dmode);
> +	}
>  	return 0;
>  }

IIUC, the farm driver updates epoch in farm_begin_recover().  Why do
the two drivers update it in the different places?

Thanks,

Kazutaka



More information about the sheepdog mailing list