Make cpg_membership_get() functional.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2855 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
Steven Dake 2010-05-19 05:03:52 +00:00
parent 7999995273
commit 0e9f0bfeb4
4 changed files with 64 additions and 35 deletions

View File

@ -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 {

View File

@ -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]);
}

View File

@ -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,

View File

@ -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");