From: Liu Yuan <tailai.ly at taobao.com> This patch adds a new function, which get vdi bitmap from the targeted node. Rename get_vdi_bitmap_from_all() into get_vdi_bitmap_from_sd_list() to make it more accurately described by name. As side effect, fix some error return paths in get_vdi_bitmap_from_all(). Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheep/group.c | 81 ++++++++++++++++++++++++++++++++------------------------ 1 files changed, 46 insertions(+), 35 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index eb0c4e2..89176d5 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -519,56 +519,67 @@ static void join(struct join_message *msg) } } -static void get_vdi_bitmap_from_all(void) +static int get_vdi_bitmap_from(struct sheepdog_node_list_entry *node) { struct sd_req hdr; struct sd_rsp *rsp = (struct sd_rsp *)&hdr; - int i, j, ret, nr_nodes, fd; - /* fixme: we need this until starting up. */ static DECLARE_BITMAP(tmp_vdi_inuse, SD_NR_VDIS); - struct sheepdog_node_list_entry entry[SD_MAX_NODES]; + int fd, i, ret = SD_RES_SUCCESS; unsigned int rlen, wlen; char host[128]; - /* - * we don't need the proper order but this is the simplest - * way. - */ - nr_nodes = get_ordered_sd_node_list(entry); - - for (i = 0; i < nr_nodes; i++) { - if (is_myself(entry[i].addr, entry[i].port)) - continue; + if (is_myself(node->addr, node->port)) + goto out; - addr_to_str(host, sizeof(host), entry[i].addr, 0); + addr_to_str(host, sizeof(host), node->addr, 0); - fd = connect_to(host, entry[i].port); - if (fd < 0) { - vprintf(SDOG_ERR "can't get the vdi bitmap %s, %m\n", host); - } + fd = connect_to(host, node->port); + if (fd < 0) { + vprintf(SDOG_ERR "can't get the vdi bitmap %s, %m\n", host); + ret = -SD_RES_EIO; + goto out; + } - vprintf(SDOG_ERR "get the vdi bitmap %d %s\n", i, host); + vprintf(SDOG_ERR "get the vdi bitmap from %s\n", host); - memset(&hdr, 0, sizeof(hdr)); - hdr.opcode = SD_OP_READ_VDIS; - hdr.epoch = sys->epoch; - hdr.data_length = sizeof(tmp_vdi_inuse); - rlen = hdr.data_length; - wlen = 0; + memset(&hdr, 0, sizeof(hdr)); + hdr.opcode = SD_OP_READ_VDIS; + hdr.epoch = sys->epoch; + hdr.data_length = sizeof(tmp_vdi_inuse); + rlen = hdr.data_length; + wlen = 0; - ret = exec_req(fd, &hdr, (char *)tmp_vdi_inuse, - &wlen, &rlen); + ret = exec_req(fd, &hdr, (char *)tmp_vdi_inuse, + &wlen, &rlen); - close(fd); + close(fd); - if (ret || rsp->result != SD_RES_SUCCESS) { - vprintf(SDOG_ERR "can't get the vdi bitmap %d %d\n", ret, + if (ret || rsp->result != SD_RES_SUCCESS) { + vprintf(SDOG_ERR "can't get the vdi bitmap %d %d\n", ret, rsp->result); - } - - for (j = 0; j < ARRAY_SIZE(sys->vdi_inuse); j++) - sys->vdi_inuse[j] |= tmp_vdi_inuse[j]; + goto out; } + + for (i = 0; i < ARRAY_SIZE(sys->vdi_inuse); i++) + sys->vdi_inuse[i] |= tmp_vdi_inuse[i]; +out: + return ret; +} + +static void get_vdi_bitmap_from_sd_list(void) +{ + int i, nr_nodes; + /* fixme: we need this until starting up. */ + struct sheepdog_node_list_entry nodes[SD_MAX_NODES]; + + /* + * we don't need the proper order but this is the simplest + * way. + */ + nr_nodes = get_ordered_sd_node_list(nodes); + + for (i = 0; i < nr_nodes; i++) + get_vdi_bitmap_from(&nodes[i]); } static int move_node_to_sd_list(uint32_t nodeid, uint32_t pid, @@ -869,7 +880,7 @@ static void __sd_deliver(struct cpg_event *cevent) case SD_MSG_JOIN: if (((struct join_message *)m)->cluster_status == SD_STATUS_OK) if (sys->status != SD_STATUS_OK) - get_vdi_bitmap_from_all(); + get_vdi_bitmap_from_sd_list(); break; } } -- 1.7.5.1 |