[Sheepdog] [PATCH, RFC] collie: extend vdi list to allow listing a single VDI by name

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Sun Jun 19 18:53:45 CEST 2011


At Sat, 18 Jun 2011 17:26:48 +0100,
Chris Webb wrote:
> 
> On a test cluster with three nodes and five hundred VDIs, the early exit
> optimisation introduced here reduces the time to find the size, used, and
> shared values from a specific VDI from around 3.4s (for naive grep of collie
> vdi list output) to around 2s, similar to a 'collie vdi object' command.
> 
> However, is it possible to make this and other VDI operations properly
> constant- or log-time in the number of VDIs instead of linear?

It is possible to make the time linear in the number of Sheepdog
nodes.  Usually, the number of nodes should be much less than the one
of VDIs, so I think it reduces the time so much.

Anyway, this patch makes sense.  I've applied this to the git tree.

Thanks,

Kazutaka


> 
> Signed-off-by: Chris Webb <chris at arachsys.com>
> ---
>  collie/collie.c |   58 +++++++++++++++++++++++++++++++++---------------------
>  1 files changed, 35 insertions(+), 23 deletions(-)
> 
> diff --git a/collie/collie.c b/collie/collie.c
> index 759d4c0..55fb5d6 100644
> --- a/collie/collie.c
> +++ b/collie/collie.c
> @@ -365,6 +365,13 @@ static int parse_vdi(vdi_parser_func_t func, size_t size, void *data)
>  	return 0;
>  }
>  
> +struct get_vid_info {
> +	char *name;
> +	char *tag;
> +	uint32_t vid;
> +	uint32_t snapid;
> +};
> +
>  static void print_vdi_list(uint32_t vid, char *name, char *tag, uint32_t snapid,
>  			   uint32_t flags, struct sheepdog_inode *i, void *data)
>  {
> @@ -374,6 +381,10 @@ static void print_vdi_list(uint32_t vid, char *name, char *tag, uint32_t snapid,
>  	time_t ti;
>  	struct tm tm;
>  	char dbuf[128];
> +	struct get_vid_info *info = data;
> +
> +	if (info && strcmp(name, info->name) != 0)
> +		return;
>  
>  	ti = i->ctime >> 32;
>  	if (raw_output) {
> @@ -399,21 +410,19 @@ static void print_vdi_list(uint32_t vid, char *name, char *tag, uint32_t snapid,
>  	size_to_str(my_objs * SD_DATA_OBJ_SIZE, my_objs_str, sizeof(my_objs_str));
>  	size_to_str(cow_objs * SD_DATA_OBJ_SIZE, cow_objs_str, sizeof(cow_objs_str));
>  
> -	if (!data || strcmp(name, data) == 0) {
> -		if (raw_output) {
> -			printf("%c ", is_current(i) ? '=' : 's');
> -			while (*name) {
> -				if (isspace(*name) || *name == '\\')
> -					putchar('\\');
> -				putchar(*name++);
> -			}
> -			printf(" %d %s %s %s %s %" PRIx32 "\n", snapid,
> -			       vdi_size_str, my_objs_str, cow_objs_str, dbuf, vid);
> -		} else {
> -			printf("%c %-8s %5d %7s %7s %7s %s  %7" PRIx32 "\n",
> -			       is_current(i) ? ' ' : 's', name, snapid,
> -			       vdi_size_str, my_objs_str, cow_objs_str, dbuf, vid);
> +	if (raw_output) {
> +		printf("%c ", is_current(i) ? '=' : 's');
> +		while (*name) {
> +			if (isspace(*name) || *name == '\\')
> +				putchar('\\');
> +			putchar(*name++);
>  		}
> +		printf(" %d %s %s %s %s %" PRIx32 "\n", snapid,
> +				vdi_size_str, my_objs_str, cow_objs_str, dbuf, vid);
> +	} else {
> +		printf("%c %-8s %5d %7s %7s %7s %s  %7" PRIx32 "\n",
> +				is_current(i) ? ' ' : 's', name, snapid,
> +				vdi_size_str, my_objs_str, cow_objs_str, dbuf, vid);
>  	}
>  }
>  
> @@ -480,13 +489,6 @@ static void cal_total_vdi_size(uint32_t vid, char *name, char * tag,
>  		*size += i->vdi_size;
>  }
>  
> -struct get_vid_info {
> -	char *name;
> -	char *tag;
> -	uint32_t vid;
> -	uint32_t snapid;
> -};
> -
>  static void get_oid(uint32_t vid, char *name, char *tag, uint32_t snapid,
>  		    uint32_t flags, struct sheepdog_inode *i, void *data)
>  {
> @@ -721,13 +723,23 @@ static struct subcommand node_cmd[] = {
>  
>  static int vdi_list(int argc, char **argv)
>  {
> +	char *vdiname = argv[optind];
> +
>  	if (!raw_output) {
>  		printf("  name        id    size    used  shared    creation time   vdi id\n");
>  		printf("------------------------------------------------------------------\n");
>  	}
>  
> -	parse_vdi(print_vdi_list, SD_INODE_SIZE, NULL);
> -	return EXIT_SUCCESS;
> +	if (vdiname) {
> +		struct get_vid_info info;
> +		memset(&info, 0, sizeof(info));
> +		info.name = vdiname;
> +		parse_vdi(print_vdi_list, SD_INODE_SIZE, &info);
> +		return EXIT_SUCCESS;
> +	} else {
> +		parse_vdi(print_vdi_list, SD_INODE_SIZE, NULL);
> +		return EXIT_SUCCESS;
> +	}
>  }
>  
>  static int vdi_tree(int argc, char **argv)
> -- 
> 1.7.4.1
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



More information about the sheepdog mailing list