From: Liu Yuan <tailai...@taobao.com> We need this to do mastership transfer in join phase.
Signed-off-by: Liu Yuan <tailai...@taobao.com> --- sheep/cluster/corosync.c | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sheep/cluster/corosync.c b/sheep/cluster/corosync.c index 971a796..6f1eda4 100644 --- a/sheep/cluster/corosync.c +++ b/sheep/cluster/corosync.c @@ -19,6 +19,7 @@ struct cpg_node { uint32_t nodeid; uint32_t pid; + uint32_t gone; struct sheepdog_node_list_entry ent; }; @@ -242,13 +243,24 @@ static struct corosync_event *find_block_event(enum corosync_event_type type, return NULL; } -static int is_master(void) +static int is_master(struct cpg_node *node) { + int i; + struct cpg_node *n = node; + if (!n) + n = &this_node; if (nr_cpg_nodes == 0) /* this node should be the first cpg node */ - return 1; + return 0; - return cpg_node_equal(&cpg_nodes[0], &this_node); + for (i = 0; i < SD_MAX_NODES; i++) { + if (!cpg_nodes[i].gone) + break; + } + + if (cpg_node_equal(&cpg_nodes[i], n)) + return i; + return -1; } static void build_node_list(struct cpg_node *nodes, size_t nr_nodes, @@ -275,7 +287,7 @@ static int __corosync_dispatch_one(struct corosync_event *cevent) switch (cevent->type) { case COROSYNC_EVENT_TYPE_JOIN: if (cevent->blocked) { - if (!is_master()) + if (is_master(&this_node) < 0) return 0; if (!cevent->msg) -- 1.7.8.rc3 -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog