With this patch, you can set the weight of each node with the -v option. Example:
$ ./sheep/sheep /store/0 -p 7000 -z 0 -v 1000 $ ./sheep/sheep /store/1 -p 7001 -z 1 -v 2000 $ ./sheep/sheep /store/2 -p 7002 -z 2 -v 3000 $ ./collie/collie cluster format -c 1 using backend simple store $ ./collie/collie node list M Id Host:Port V-Nodes Zone - 0 10.68.14.1:7000 1000 0 - 1 10.68.14.1:7001 2000 1 - 2 10.68.14.1:7002 3000 2 $ ./collie/collie vdi create image 600M -P $ ./collie/collie node info Id Size Used Use% 0 188 GB 100 MB 0% 1 188 GB 200 MB 0% 2 188 GB 304 MB 0% Total 564 GB 604 MB 0% Total virtual image size 600 MB If you specify zero to the number of virtual nodes, no data will not be stored to the node. Signed-off-by: MORITA Kazutaka <[email protected]> --- sheep/group.c | 4 ++-- sheep/sheep.c | 16 ++++++++++++++-- sheep/sheep_priv.h | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index 1a212e3..dda468c 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -1382,7 +1382,7 @@ oom: panic("failed to allocate memory for a confchg event\n"); } -int create_cluster(int port, int64_t zone) +int create_cluster(int port, int64_t zone, int nr_vnodes) { int ret; struct cdrv_handlers handlers = { @@ -1407,7 +1407,7 @@ int create_cluster(int port, int64_t zone) return -1; sys->this_node.port = port; - sys->this_node.nr_vnodes = SD_DEFAULT_VNODES; + sys->this_node.nr_vnodes = nr_vnodes; if (zone == -1) { /* use last 4 bytes as zone id */ uint8_t *b = sys->this_node.addr + 12; diff --git a/sheep/sheep.c b/sheep/sheep.c index 94b4a9e..b3b834b 100644 --- a/sheep/sheep.c +++ b/sheep/sheep.c @@ -36,12 +36,13 @@ static struct option const long_options[] = { {"debug", no_argument, NULL, 'd'}, {"directio", no_argument, NULL, 'D'}, {"zone", required_argument, NULL, 'z'}, + {"vnodes", required_argument, NULL, 'v'}, {"cluster", required_argument, NULL, 'c'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}, }; -static const char *short_options = "p:fl:dDz:c:h"; +static const char *short_options = "p:fl:dDz:v:c:h"; static void usage(int status) { @@ -59,6 +60,7 @@ Options:\n\ -d, --debug include debug messages in the log\n\ -D, --directio use direct IO when accessing the object store\n\ -z, --zone specify the zone id\n\ + -v, --vnodes specify the number of virtual nodes\n\ -c, --cluster specify the cluster driver\n\ -h, --help display this help and exit\n\ ", PACKAGE_VERSION, program_name); @@ -92,6 +94,7 @@ int main(int argc, char **argv) int log_level = SDOG_INFO; char path[PATH_MAX]; int64_t zone = -1; + int nr_vnodes = SD_DEFAULT_VNODES; char *p; struct cluster_driver *cdrv; @@ -139,6 +142,15 @@ int main(int argc, char **argv) } sys->this_node.zone = zone; break; + case 'v': + nr_vnodes = strtol(optarg, &p, 10); + if (optarg == p || nr_vnodes < 0 || SD_MAX_VNODES < nr_vnodes) { + fprintf(stderr, "Invalid number of virtual nodes '%s': " + "must be an integer between 0 and %u\n", + optarg, SD_MAX_VNODES); + exit(1); + } + break; case 'c': sys->cdrv = find_cdrv(optarg); if (!sys->cdrv) { @@ -192,7 +204,7 @@ int main(int argc, char **argv) if (ret) exit(1); - ret = create_cluster(port, zone); + ret = create_cluster(port, zone, nr_vnodes); if (ret) { eprintf("failed to create sheepdog cluster\n"); exit(1); diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index 880bb74..db70c57 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -235,7 +235,7 @@ int is_access_local(struct sd_vnode *e, int nr_nodes, void resume_pending_requests(void); -int create_cluster(int port, int64_t zone); +int create_cluster(int port, int64_t zone, int nr_vnodes); int leave_cluster(void); void start_cpg_event_work(void); -- 1.7.2.5 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
