From 0e9f0bfeb40776ce201cc0e93e3a885fd194a76c Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Wed, 19 May 2010 05:03:52 +0000 Subject: [PATCH] Make cpg_membership_get() functional. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2855 fd59a12c-fef9-0310-b244-a6a79926bd2f --- include/corosync/ipc_cpg.h | 10 ++++++-- lib/cpg.c | 22 ++++++++++++----- services/cpg.c | 49 +++++++++++++++++--------------------- test/testcpg.c | 18 ++++++++++++++ 4 files changed, 64 insertions(+), 35 deletions(-) diff --git a/include/corosync/ipc_cpg.h b/include/corosync/ipc_cpg.h index a1ecabf8..afdebaa4 100644 --- a/include/corosync/ipc_cpg.h +++ b/include/corosync/ipc_cpg.h @@ -237,9 +237,15 @@ struct res_lib_cpg_flowcontrol_callback { mar_uint32_t flow_control_state __attribute__((aligned(8))); }; -struct req_lib_cpg_membership { +struct req_lib_cpg_membership_get { coroipc_request_header_t header __attribute__((aligned(8))); -// mar_cpg_name_t group_name __attribute__((aligned(8))); + mar_cpg_name_t group_name __attribute__((aligned(8))); +}; + +struct res_lib_cpg_membership_get { + coroipc_response_header_t header __attribute__((aligned(8))); + mar_uint32_t member_count __attribute__((aligned(8))); + mar_cpg_address_t member_list[PROCESSOR_COUNT_MAX]; }; struct res_lib_cpg_confchg_callback { diff --git a/lib/cpg.c b/lib/cpg.c index 993a28ae..11bae386 100644 --- a/lib/cpg.c +++ b/lib/cpg.c @@ -582,24 +582,34 @@ cs_error_t cpg_membership_get ( cs_error_t error; struct cpg_inst *cpg_inst; struct iovec iov; - struct req_lib_cpg_membership req_lib_cpg_membership_get; - struct res_lib_cpg_confchg_callback res_lib_cpg_membership_get; + struct req_lib_cpg_membership_get req_lib_cpg_membership_get; + struct res_lib_cpg_membership_get res_lib_cpg_membership_get; unsigned int i; + if (member_list == NULL) { + return (CS_ERR_INVALID_PARAM); + } + if (member_list_entries == NULL) { + return (CS_ERR_INVALID_PARAM); + } + error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst)); if (error != CS_OK) { return (error); } - req_lib_cpg_membership_get.header.size = sizeof (coroipc_request_header_t); + req_lib_cpg_membership_get.header.size = sizeof (struct req_lib_cpg_membership_get); req_lib_cpg_membership_get.header.id = MESSAGE_REQ_CPG_MEMBERSHIP; + memcpy (&req_lib_cpg_membership_get.group_name, group_name, + sizeof (struct cpg_name)); + iov.iov_base = (void *)&req_lib_cpg_membership_get; iov.iov_len = sizeof (coroipc_request_header_t); do { error = coroipcc_msg_send_reply_receive (cpg_inst->handle, &iov, 1, - &res_lib_cpg_membership_get, sizeof (coroipc_response_header_t)); + &res_lib_cpg_membership_get, sizeof (res_lib_cpg_membership_get)); if (error != CS_OK) { goto error_exit; @@ -611,9 +621,9 @@ cs_error_t cpg_membership_get ( /* * Copy results to caller */ - *member_list_entries = res_lib_cpg_membership_get.member_list_entries; + *member_list_entries = res_lib_cpg_membership_get.member_count; if (member_list) { - for (i = 0; i < res_lib_cpg_membership_get.member_list_entries; i++) { + for (i = 0; i < res_lib_cpg_membership_get.member_count; i++) { marshall_from_mar_cpg_address_t (&member_list[i], &res_lib_cpg_membership_get.member_list[i]); } diff --git a/services/cpg.c b/services/cpg.c index 7661183a..eb4b5090 100644 --- a/services/cpg.c +++ b/services/cpg.c @@ -1463,36 +1463,31 @@ static void message_handler_req_lib_cpg_mcast (void *conn, const void *message) static void message_handler_req_lib_cpg_membership (void *conn, const void *message) { - struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn); - cs_error_t error = CPG_ERR_NOT_EXIST; - coroipc_response_header_t res; + struct req_lib_cpg_membership_get *req_lib_cpg_membership_get = + (struct req_lib_cpg_membership_get *)message; + struct res_lib_cpg_membership_get res_lib_cpg_membership_get; + struct list_head *iter; + int member_count = 0; - switch (cpd->cpd_state) { - case CPD_STATE_UNJOINED: - error = CPG_ERR_NOT_EXIST; - break; - case CPD_STATE_LEAVE_STARTED: - error = CPG_ERR_NOT_EXIST; - break; - case CPD_STATE_JOIN_STARTED: - error = CPG_ERR_BUSY; - break; - case CPD_STATE_JOIN_COMPLETED: - error = CPG_OK; - break; - } - - res.size = sizeof (res); - res.id = MESSAGE_RES_CPG_MEMBERSHIP; - res.error = error; - api->ipc_response_send (conn, &res, sizeof(res)); - return; - - if (error == CPG_OK) { - notify_lib_joinlist (&cpd->group_name, conn, 0, NULL, 0, NULL, - MESSAGE_RES_CPG_MEMBERSHIP); + res_lib_cpg_membership_get.header.id = MESSAGE_RES_CPG_MEMBERSHIP; + res_lib_cpg_membership_get.header.error = CPG_OK; + res_lib_cpg_membership_get.header.size = + sizeof (struct req_lib_cpg_membership_get); + + for (iter = process_info_list_head.next; + iter != &process_info_list_head; iter = iter->next) { + + struct process_info *pi = list_entry (iter, struct process_info, list); + if (mar_name_compare (&pi->group, &req_lib_cpg_membership_get->group_name) == 0) { + res_lib_cpg_membership_get.member_list[member_count].nodeid = pi->nodeid; + res_lib_cpg_membership_get.member_list[member_count].pid = pi->pid; + member_count += 1; + } } + res_lib_cpg_membership_get.member_count = member_count; + api->ipc_response_send (conn, &res_lib_cpg_membership_get, + sizeof (res_lib_cpg_membership_get)); } static void message_handler_req_lib_cpg_local_get (void *conn, diff --git a/test/testcpg.c b/test/testcpg.c index c8bfb3e8..bab6006a 100644 --- a/test/testcpg.c +++ b/test/testcpg.c @@ -174,6 +174,9 @@ int main (int argc, char *argv[]) { int opt; unsigned int nodeid; char *fgets_res; + struct cpg_address member_list[64]; + int member_list_entries; + int i; while ( (opt = getopt(argc, argv, options)) != -1 ) { switch (opt) { @@ -210,6 +213,21 @@ int main (int argc, char *argv[]) { exit (1); } + sleep (1); + result = cpg_membership_get (handle, &group_name, + (struct cpg_address *)&member_list, &member_list_entries); + if (result != CS_OK) { + printf ("Could not get current membership list %d\n", result); + exit (1); + } + + printf ("membership list\n"); + for (i = 0; i < member_list_entries; i++) { + printf ("node id %d pid %d\n", member_list[i].nodeid, + member_list[i].pid); + } + + FD_ZERO (&read_fds); cpg_fd_get(handle, &select_fd); printf ("Type EXIT to finish\n");