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.u...@gmail.com> --- dog/cluster.c | 8 +++++++- dog/farm/farm.c | 5 +++-- dog/farm/farm.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) 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@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog