[Sheepdog] [PATCH] sheep: support specifying the initial count of virtual nodes
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Tue Feb 28 17:48:09 CET 2012
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 <morita.kazutaka at lab.ntt.co.jp>
---
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
More information about the sheepdog
mailing list