[sheepdog] [PATCH 11/12] sheep: make stat_data_objs a generic function

Liu Yuan namei.unix at gmail.com
Wed Jan 29 03:28:43 CET 2014


On Wed, Jan 29, 2014 at 10:45:05AM +0900, Hitoshi Mitake wrote:
> At Wed, 29 Jan 2014 04:19:11 +0800,
> Liu Yuan wrote:
> > 
> > and rename it as sd_inode_stat()
> > 
> > Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> > ---
> >  dog/vdi.c                |  96 +---------------------------------------
> >  include/internal_proto.h |   3 ++
> >  lib/Makefile.am          |   3 +-
> >  lib/sd.c                 | 112 +++++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 118 insertions(+), 96 deletions(-)
> >  create mode 100644 lib/sd.c
> > 
> > diff --git a/dog/vdi.c b/dog/vdi.c
> > index 1e175b3..091ce91 100644
> > --- a/dog/vdi.c
> > +++ b/dog/vdi.c
> > @@ -87,100 +87,6 @@ static void vdi_show_progress(uint64_t done, uint64_t total)
> >  	return show_progress(done, total, false);
> >  }
> >  
> > -struct stat_arg {
> > -	uint64_t *my;
> > -	uint64_t *cow;
> > -	uint32_t vid;
> > -};
> > -
> > -static void stat_cb(void *data, enum btree_node_type type, void *arg)
> > -{
> > -	struct sd_extent *ext;
> > -	struct stat_arg *sarg = arg;
> > -	uint64_t *my = sarg->my;
> > -	uint64_t *cow = sarg->cow;
> > -
> > -	if (type == BTREE_EXT) {
> > -		ext = (struct sd_extent *)data;
> > -		if (ext->vdi_id == sarg->vid)
> > -			(*my)++;
> > -		else if (ext->vdi_id != 0)
> > -			(*cow)++;
> > -	}
> > -}
> > -
> > -static void stat_data_objs_btree(const struct sd_inode *inode,
> > -				 uint64_t *my_objs, uint64_t *cow_objs)
> > -{
> > -	struct stat_arg arg = {my_objs, cow_objs, inode->vdi_id};
> > -	traverse_btree(dog_bnode_reader, inode, stat_cb, &arg);
> > -}
> > -
> > -static void stat_data_objs_array(const struct sd_inode *inode,
> > -				 uint64_t *my_objs, uint64_t *cow_objs)
> > -{
> > -	int nr;
> > -	uint64_t my, cow, *p;
> > -	uint32_t vid = inode->vdi_id;
> > -
> > -	my = 0;
> > -	cow = 0;
> > -	nr = count_data_objs(inode);
> > -
> > -	if (nr % 2 != 0) {
> > -		if (is_data_obj_writeable(inode, 0))
> > -			my++;
> > -		else if (inode->data_vdi_id[0] != 0)
> > -			cow++;
> > -		p = (uint64_t *)(inode->data_vdi_id + 1);
> > -	} else
> > -		p = (uint64_t *)inode->data_vdi_id;
> > -
> > -	/*
> > -	 * To boost performance, this function checks data_vdi_id for each 64
> > -	 * bit integer.
> > -	 */
> > -	nr /= 2;
> > -	for (int i = 0; i < nr; i++) {
> > -		if (p[i] == 0)
> > -			continue;
> > -		if (p[i] == (((uint64_t)vid << 32) | vid)) {
> > -			my += 2;
> > -			continue;
> > -		}
> > -
> > -		/* Check the higher 32 bit */
> > -		if (p[i] >> 32 == vid)
> > -			my++;
> > -		else if ((p[i] & 0xFFFFFFFF00000000) != 0)
> > -			cow++;
> > -
> > -		/* Check the lower 32 bit */
> > -		if ((p[i] & 0xFFFFFFFF) == vid)
> > -			my++;
> > -		else if ((p[i] & 0xFFFFFFFF) != 0)
> > -			cow++;
> > -	}
> > -
> > -	*my_objs = my;
> > -	*cow_objs = cow;
> > -}
> > -
> > -/*
> > - * Get the number of objects.
> > - *
> > - * 'my_objs' means the number objects which belongs to this vdi.  'cow_objs'
> > - * means the number of the other objects.
> > - */
> > -static void stat_data_objs(const struct sd_inode *inode, uint64_t *my_objs,
> > -			   uint64_t *cow_objs)
> > -{
> > -	if (inode->store_policy == 0)
> > -		stat_data_objs_array(inode, my_objs, cow_objs);
> > -	else
> > -		stat_data_objs_btree(inode, my_objs, cow_objs);
> > -}
> > -
> >  static char *redundancy_scheme(uint8_t copy_nr, uint8_t policy)
> >  {
> >  	static char str[10];
> > @@ -218,7 +124,7 @@ static void print_vdi_list(uint32_t vid, const char *name, const char *tag,
> >  			 "%Y-%m-%d %H:%M", &tm);
> >  	}
> >  
> > -	stat_data_objs(i, &my_objs, &cow_objs);
> > +	sd_inode_stat(i, &my_objs, &cow_objs, dog_bnode_reader);
> >  
> >  	if (i->snap_id == 1 && i->parent_vdi_id != 0)
> >  		is_clone = true;
> > diff --git a/include/internal_proto.h b/include/internal_proto.h
> > index 2e5c81c..22ea897 100644
> > --- a/include/internal_proto.h
> > +++ b/include/internal_proto.h
> > @@ -263,6 +263,9 @@ struct sd_stat {
> >  	} r;
> >  };
> >  
> > +void sd_inode_stat(const struct sd_inode *inode, uint64_t *, uint64_t *,
> > +		   read_node_fn reader);
> > +
> >  #ifdef HAVE_TRACE
> >  
> >  #define TRACE_GRAPH_ENTRY  0x01
> > diff --git a/lib/Makefile.am b/lib/Makefile.am
> > index 5204879..7d56c2d 100644
> > --- a/lib/Makefile.am
> > +++ b/lib/Makefile.am
> > @@ -5,7 +5,8 @@ AM_CPPFLAGS                = -I$(top_builddir)/include -I$(top_srcdir)/include
> >  noinst_LIBRARIES	= libsheepdog.a
> >  
> >  libsheepdog_a_SOURCES	= event.c logger.c net.c util.c rbtree.c strbuf.c \
> > -			  sha1.c option.c work.c sockfd_cache.c fec.c sd_inode.c
> > +			  sha1.c option.c work.c sockfd_cache.c fec.c \
> > +			  sd_inode.c sd.c
> >  
> >  if BUILD_SHA1_HW
> >  libsheepdog_a_SOURCES	+= sha1_ssse3.S
> > diff --git a/lib/sd.c b/lib/sd.c
> 
> The name sd.c is too generic,
> 
> > new file mode 100644
> > index 0000000..a254c1e
> > --- /dev/null
> > +++ b/lib/sd.c
> > @@ -0,0 +1,112 @@
> > +/*
> > + * Copyright (C) 2014 Taobao Inc.
> > + *
> > + * Liu Yuan <namei.unix at gmail.com>
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License version
> > + * 2 as published by the Free Software Foundation.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program. If not, see <nfs://www.gnu.org/licenses/>.
> > + */
> > +
> > +/* This file contains functions shared by sheep and dog */
> 
> and the above comment is true for all of other stuff in
> libsheepdog. You don't have to describe. Do we need to create a new
> file for the below stuff? I think sd_inode.c would be a suitable place
> for them.
> 
> Thanks,
> Hitoshi

Ah, yes, this function is sd_inode related. I'll move it to sd_inode.c in v2

Thanks
Yuan



More information about the sheepdog mailing list