[sheepdog] [PATCH v2] dog/farm: add an option for multi-thread cluster snapshot save process
Liu Yuan
namei.unix at gmail.com
Sat Aug 9 05:36:13 CEST 2014
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(-)
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
More information about the sheepdog
mailing list