better ways to get this information now, but the api should return
proper results.
Regards
-stve
Index: test/testcpg.c
===================================================================
--- test/testcpg.c (revision 2850)
+++ test/testcpg.c (working copy)
@@ -174,6 +174,9 @@
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 @@
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");
Index: services/cpg.c
===================================================================
--- services/cpg.c (revision 2850)
+++ services/cpg.c (working copy)
@@ -1463,36 +1463,31 @@
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_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);
- res.size = sizeof (res);
- res.id = MESSAGE_RES_CPG_MEMBERSHIP;
- res.error = error;
- api->ipc_response_send (conn, &res, sizeof(res));
- return;
+ for (iter = process_info_list_head.next;
+ iter != &process_info_list_head; iter = iter->next) {
- if (error == CPG_OK) {
- notify_lib_joinlist (&cpd->group_name, conn, 0, NULL, 0, NULL,
- MESSAGE_RES_CPG_MEMBERSHIP);
+ 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,
Index: include/corosync/ipc_cpg.h
===================================================================
--- include/corosync/ipc_cpg.h (revision 2850)
+++ include/corosync/ipc_cpg.h (working copy)
@@ -237,11 +237,17 @@
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 {
coroipc_response_header_t header __attribute__((aligned(8)));
mar_cpg_name_t group_name __attribute__((aligned(8)));
Index: lib/cpg.c
===================================================================
--- lib/cpg.c (revision 2850)
+++ lib/cpg.c (working copy)
@@ -582,24 +582,34 @@
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 @@
/*
* 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]);
}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais