mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-07-24 09:58:16 +00:00
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:
parent
7999995273
commit
0e9f0bfeb4
@ -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 {
|
||||
|
22
lib/cpg.c
22
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]);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user