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

Reply via email to