From: Yunkai Zhang <[email protected]>

Show recovery status and inner joining/leaving nodes to user.
 $ collie cluster recover info
 Status: disable
 Joining nodes in inner temporary list:
 --------------------------------------
 Id               Host:Port
  0               127.0.0.1:7005
  1               127.0.0.1:7008
  2               127.0.0.1:7007
  3               127.0.0.1:7006

 Leaving nodes in inner temporary list:
 --------------------------------------
 Id               Host:Port
  4               127.0.0.1:7004
  5               127.0.0.1:7003

Signed-off-by: Yunkai Zhang <[email protected]>
---
 collie/cluster.c | 39 ++++++++++++++++++++++++++++++---------
 sheep/ops.c      | 16 ++++++++++++++--
 2 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/collie/cluster.c b/collie/cluster.c
index 9302b78..b0b5e95 100644
--- a/collie/cluster.c
+++ b/collie/cluster.c
@@ -13,6 +13,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <sys/time.h>
+#include <assert.h>
 
 #include "collie.h"
 
@@ -350,14 +351,17 @@ Are you sure you want to continue? [yes/no]: "
 
 static int cluster_info_recover(int argc, char **argv)
 {
-       int fd, ret = EXIT_SYSFAIL;
+       int i, fd, ret = EXIT_SYSFAIL;
        struct sd_req hdr;
        struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
        unsigned rlen, wlen;
        void *buf;
-       int i, nr_nodes;
+       char ipaddr[128];
+       struct sd_node *nodes;
+       size_t nr_nodes, nr_joining_nodes, nr_leaving_nodes, *p;
        const char *status[] = {"enable", "disable"};
 
+
        wlen = 0;
        rlen = SD_MAX_NODES * sizeof(struct sd_node);
 
@@ -387,20 +391,37 @@ static int cluster_info_recover(int argc, char **argv)
        }
        nr_nodes = rsp->data_length/sizeof(struct sd_node);
 
+       p = (size_t *)&rsp->__pad[1];
+       nr_joining_nodes = *p++;
+       nr_leaving_nodes = *p;
+
+       assert(nr_nodes == (nr_joining_nodes + nr_leaving_nodes));
+
        printf("Status: %s\n", status[rsp->__pad[0]]);
        printf("Joining nodes in inner temporary list:\n"
               "--------------------------------------\n"
               "Id               Host:Port\n");
-       for (i = 0; i < nr_nodes; i++) {
-               char ipaddr[128];
-               struct sd_node *rnodes;
-
-               rnodes = (struct sd_node *)buf;
-               addr_to_str(ipaddr, sizeof(ipaddr), rnodes[i].nid.addr,
-                           rnodes[i].nid.port);
+       for (i = 0; i < nr_joining_nodes; i++) {
+               nodes = (struct sd_node *)buf;
+               addr_to_str(ipaddr, sizeof(ipaddr), nodes[i].nid.addr,
+                           nodes[i].nid.port);
                printf("%2d               %s\n", i, ipaddr);
        }
 
+       printf("\nLeaving nodes in inner temporary list:\n"
+              "--------------------------------------\n"
+              "Id               Host:Port\n");
+       for (i = nr_joining_nodes; i < nr_nodes; i++) {
+               nodes = (struct sd_node *)buf;
+
+               /* ignore joined back node */
+               if (!nodes[i].left)
+                       continue;
+
+               addr_to_str(ipaddr, sizeof(ipaddr), nodes[i].nid.addr,
+                           nodes[i].nid.port);
+               printf("%2d               %s\n", i, ipaddr);
+       }
 
 out:
        free(buf);
diff --git a/sheep/ops.c b/sheep/ops.c
index de0dae7..ed8c7d4 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -323,10 +323,22 @@ static int cluster_disable_recover(const struct sd_req 
*req,
 static int local_info_recover(const struct sd_req *req,
                              struct sd_rsp *rsp, void *data)
 {
+       size_t nr, *p;
+       struct sd_node *nodes = data;
+
        rsp->__pad[0] = sys->disable_recovery;
-       rsp->data_length = nr_joining_nodes * sizeof(struct sd_node);
-       memcpy(data, joining_nodes, rsp->data_length);
 
+       p = (size_t *)&rsp->__pad[1];
+       memcpy(p, &nr_joining_nodes, sizeof(nr_joining_nodes));
+       memcpy(p + 1, &nr_leaving_nodes, sizeof(nr_leaving_nodes));
+
+       nr = nr_joining_nodes;
+       memcpy(nodes, joining_nodes, nr * sizeof(*nodes));
+
+       nr += nr_leaving_nodes;
+       memcpy(nodes + nr_joining_nodes, leaving_nodes, nr * sizeof(*nodes));
+
+       rsp->data_length = nr * sizeof(*nodes);
        return SD_RES_SUCCESS;
 }
 
-- 
1.7.11.2

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to