From: Yunkai Zhang <[email protected]>

Next patch need variale-length of join_message when master need to share
more data for joining node.

Signed-off-by: Yunkai Zhang <[email protected]>
---
 sheep/cluster.h           | 6 ++++--
 sheep/cluster/accord.c    | 2 +-
 sheep/cluster/corosync.c  | 9 ++++++---
 sheep/cluster/local.c     | 2 +-
 sheep/cluster/zookeeper.c | 2 +-
 sheep/group.c             | 7 ++++++-
 6 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/sheep/cluster.h b/sheep/cluster.h
index 75596a8..b5c3a30 100644
--- a/sheep/cluster.h
+++ b/sheep/cluster.h
@@ -20,11 +20,13 @@
 #include <memory.h>
 
 #include "sheepdog_proto.h"
+#include "internal_proto.h"
 #include "sheep.h"
 #include "logger.h"
 
 /* maximum payload size sent in ->notify and ->unblock */
-#define SD_MAX_EVENT_BUF_SIZE (64 * 1024)
+#define SD_MAX_EVENT_BUF_SIZE (sizeof(struct join_message) \
+                              + SD_MAX_NODES * sizeof(struct sd_node))
 
 enum cluster_join_result {
        CJ_RES_SUCCESS, /* Success */
@@ -197,7 +199,7 @@ void sd_leave_handler(struct sd_node *left, struct sd_node 
*members,
 void sd_notify_handler(struct sd_node *sender, void *msg, size_t msg_len);
 bool sd_block_handler(struct sd_node *sender);
 enum cluster_join_result sd_check_join_cb(struct sd_node *joining,
-               void *opaque);
+               void *opaque, size_t *opaque_len);
 void recalculate_vnodes(struct sd_node *nodes, int nr_nodes);
 
 #endif
diff --git a/sheep/cluster/accord.c b/sheep/cluster/accord.c
index a0f1d00..d0fb892 100644
--- a/sheep/cluster/accord.c
+++ b/sheep/cluster/accord.c
@@ -481,7 +481,7 @@ static void acrd_handler(int listen_fd, int events, void 
*data)
                        break;
                }
 
-               res = sd_check_join_cb(&ev.sender, ev.buf);
+               res = sd_check_join_cb(&ev.sender, ev.buf, &ev.buf_len);
                ev.join_result = res;
                ev.type = EVENT_JOIN_RESPONSE;
                acrd_queue_push_back(ahandle, &ev);
diff --git a/sheep/cluster/corosync.c b/sheep/cluster/corosync.c
index b3f6471..af6c1da 100644
--- a/sheep/cluster/corosync.c
+++ b/sheep/cluster/corosync.c
@@ -283,6 +283,8 @@ static int __corosync_dispatch_one(struct corosync_event 
*cevent)
 {
        enum cluster_join_result res;
        struct sd_node entries[SD_MAX_NODES];
+       char *buf[SD_MAX_EVENT_BUF_SIZE];
+       size_t buf_len;
        int idx;
        static bool blocked = false;
 
@@ -299,14 +301,15 @@ static int __corosync_dispatch_one(struct corosync_event 
*cevent)
                        /* check_join() must be called only once */
                        return 0;
 
-               res = sd_check_join_cb(&cevent->sender.ent,
-                                                    cevent->msg);
+               buf_len = cevent->msg_len;
+               memcpy(buf, cevent->msg, buf_len);
+               res = sd_check_join_cb(&cevent->sender.ent, buf, &buf_len);
                if (res == CJ_RES_MASTER_TRANSFER)
                        nr_cpg_nodes = 0;
 
                send_message(COROSYNC_MSG_TYPE_JOIN_RESPONSE, res,
                             &cevent->sender, cpg_nodes, nr_cpg_nodes,
-                            cevent->msg, cevent->msg_len);
+                            buf, buf_len);
 
                if (res == CJ_RES_MASTER_TRANSFER) {
                        eprintf("failed to join sheepdog cluster: please retry 
when master is up\n");
diff --git a/sheep/cluster/local.c b/sheep/cluster/local.c
index 3e6333a..38ad320 100644
--- a/sheep/cluster/local.c
+++ b/sheep/cluster/local.c
@@ -357,7 +357,7 @@ static bool local_process_event(void)
                if (!node_eq(&ev->nodes[0], &this_node))
                        return false;
 
-               res = sd_check_join_cb(&ev->sender, ev->buf);
+               res = sd_check_join_cb(&ev->sender, ev->buf, &ev->buf_len);
                ev->join_result = res;
                ev->type = EVENT_JOIN_RESPONSE;
                msync(ev, sizeof(*ev), MS_SYNC);
diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index 4cd5be8..f70fc1c 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -681,7 +681,7 @@ static void zk_handler(int listen_fd, int events, void 
*data)
                        break;
                }
 
-               res = sd_check_join_cb(&ev.sender.node, ev.buf);
+               res = sd_check_join_cb(&ev.sender.node, ev.buf, &ev.buf_len);
                ev.join_result = res;
                ev.type = EVENT_JOIN_RESPONSE;
                ev.sender.joined = 1;
diff --git a/sheep/group.c b/sheep/group.c
index 05ffb3e..cb244f7 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -917,10 +917,12 @@ void sd_notify_handler(struct sd_node *sender, void 
*data, size_t data_len)
        }
 }
 
-enum cluster_join_result sd_check_join_cb(struct sd_node *joining, void 
*opaque)
+enum cluster_join_result sd_check_join_cb(struct sd_node *joining,
+                                         void *opaque, size_t *opaque_len)
 {
        struct join_message *jm = opaque;
        char str[256];
+       size_t n;
        int ret;
 
        if (jm->proto_ver != SD_SHEEP_PROTO_VER) {
@@ -1010,6 +1012,9 @@ enum cluster_join_result sd_check_join_cb(struct sd_node 
*joining, void *opaque)
        if (jm->cluster_status != SD_STATUS_OK &&
            (ret == CJ_RES_SUCCESS || ret == CJ_RES_JOIN_LATER))
                format_exceptional_node_list(jm);
+
+       n = jm->nr_failed_nodes + jm->nr_delayed_nodes;
+       *opaque_len = sizeof(*jm) + n * sizeof(jm->nodes[0]);
        return ret;
 }
 
-- 
1.7.11.2

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

Reply via email to