[sheepdog] [PATCH v2] dog/farm: add an option for multi-thread cluster snapshot save process

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Mon Aug 11 03:50:34 CEST 2014


At Sat,  9 Aug 2014 11:36:13 +0800,
Liu Yuan wrote:
> 
> There is no reason we can't multi-thread it. Let's go multi-threading and enjoy
> boost.
> 
> Consider that we often save snapshots on the fly so we use single thread as
> default to minimize the impact of running cluster.
> 
> usage:
>  $ dog cluster snapshot save -m ... # enable multi-threads
> 
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
>  dog/cluster.c   | 8 +++++++-
>  dog/farm/farm.c | 5 +++--
>  dog/farm/farm.h | 2 +-
>  3 files changed, 11 insertions(+), 4 deletions(-)

Applied with adding "m" to the accepted options of cluster snapshot
command, thanks.

Thanks,
Hitoshi

> 
> diff --git a/dog/cluster.c b/dog/cluster.c
> index e36e308..12dabac 100644
> --- a/dog/cluster.c
> +++ b/dog/cluster.c
> @@ -21,6 +21,8 @@ static struct sd_option cluster_options[] = {
>  	{'b', "store", true, "specify backend store"},
>  	{'c', "copies", true, "specify the default data redundancy (number of copies)"},
>  	{'f', "force", false, "do not prompt for confirmation"},
> +	{'m', "multithread", false,
> +	 "use multi-thread for 'cluster snapshot save'"},
>  	{'t', "strict", false,
>  	 "do not serve write request if number of nodes is not sufficient"},
>  	{ 0, NULL, false, NULL },
> @@ -29,6 +31,7 @@ static struct sd_option cluster_options[] = {
>  static struct cluster_cmd_data {
>  	uint8_t copies;
>  	uint8_t copy_policy;
> +	uint8_t multithread;
>  	bool force;
>  	bool strict;
>  	char name[STORE_LEN];
> @@ -432,7 +435,8 @@ static int save_snapshot(int argc, char **argv)
>  		goto out;
>  	}
>  
> -	if (farm_save_snapshot(tag) != SD_RES_SUCCESS)
> +	if (farm_save_snapshot(tag, cluster_cmd_data.multithread)
> +	    != SD_RES_SUCCESS)
>  		goto out;
>  
>  	ret = EXIT_SUCCESS;
> @@ -788,6 +792,8 @@ static int cluster_parser(int ch, const char *opt)
>  	case 'f':
>  		cluster_cmd_data.force = true;
>  		break;
> +	case 'm':
> +		cluster_cmd_data.multithread = true;
>  	case 't':
>  		cluster_cmd_data.strict = true;
>  		break;
> diff --git a/dog/farm/farm.c b/dog/farm/farm.c
> index e4f532e..5d07be9 100644
> --- a/dog/farm/farm.c
> +++ b/dog/farm/farm.c
> @@ -315,7 +315,7 @@ static int queue_save_snapshot_work(uint64_t oid, uint32_t nr_copies,
>  	return 0;
>  }
>  
> -int farm_save_snapshot(const char *tag)
> +int farm_save_snapshot(const char *tag, bool multithread)
>  {
>  	unsigned char trunk_sha1[SHA1_DIGEST_SIZE];
>  	struct strbuf trunk_buf;
> @@ -357,7 +357,8 @@ int farm_save_snapshot(const char *tag)
>  
>  	strbuf_init(&trunk_buf, sizeof(struct trunk_entry) * nr_objects);
>  
> -	wq = create_work_queue("save snapshot", WQ_ORDERED);
> +	wq = create_work_queue("save snapshot",
> +			       multithread ? WQ_DYNAMIC : WQ_ORDERED);
>  	if (for_each_object_in_tree(queue_save_snapshot_work,
>  				    &trunk_buf) < 0) {
>  		ret = -1;
> diff --git a/dog/farm/farm.h b/dog/farm/farm.h
> index b95006a..745aa15 100644
> --- a/dog/farm/farm.h
> +++ b/dog/farm/farm.h
> @@ -59,7 +59,7 @@ struct vdi_option {
>  /* farm.c */
>  int farm_init(const char *path);
>  bool farm_contain_snapshot(uint32_t idx, const char *tag);
> -int farm_save_snapshot(const char *tag);
> +int farm_save_snapshot(const char *tag, bool);
>  int farm_load_snapshot(uint32_t idx, const char *tag, int count, char **name);
>  int farm_show_snapshot(uint32_t idx, const char *tag, int count, char **name);
>  char *get_object_directory(void);
> -- 
> 1.9.1
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



More information about the sheepdog mailing list