Signed-off-by: Angus Salkeld <asalk...@redhat.com>
---
 cts/agents/cpg_test_agent.c |    7 ++---
 lib/cpg.c                   |    2 +-
 services/cpg.c              |   57 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 60 insertions(+), 6 deletions(-)

diff --git a/cts/agents/cpg_test_agent.c b/cts/agents/cpg_test_agent.c
index 542dcf2..586ff56 100644
--- a/cts/agents/cpg_test_agent.c
+++ b/cts/agents/cpg_test_agent.c
@@ -93,7 +93,7 @@ static struct list_head msg_log_head;
 static pid_t my_pid;
 static uint32_t my_nodeid;
 static int32_t my_seq;
-static int32_t use_zcb = 0;
+static int32_t use_zcb = QB_FALSE;
 static int32_t my_msgs_to_send;
 static int32_t my_msgs_sent;
 static int32_t total_stored_msgs = 0;
@@ -492,7 +492,6 @@ static void send_some_more_messages_normal (void)
 
 static void send_some_more_messages (void * unused)
 {
-       use_zcb = QB_FALSE;
        if (use_zcb) {
                send_some_more_messages_zcb ();
        } else {
@@ -507,7 +506,7 @@ static void msg_blaster (int sock, char* num_to_send_str)
        my_seq = 1;
        my_pid = getpid();
 
-       use_zcb = 0;
+       use_zcb = QB_FALSE;
        total_stored_msgs = 0;
 
        cpg_local_get (cpg_handle, &my_nodeid);
@@ -544,7 +543,7 @@ static void msg_blaster_zcb (int sock, char* 
num_to_send_str)
        my_seq = 1;
        my_pid = getpid();
 
-       use_zcb = 1;
+       use_zcb = QB_TRUE;
        total_stored_msgs = 0;
 
        cpg_local_get (cpg_handle, &my_nodeid);
diff --git a/lib/cpg.c b/lib/cpg.c
index 48296c0..4c84163 100644
--- a/lib/cpg.c
+++ b/lib/cpg.c
@@ -97,7 +97,7 @@ coroipcc_msg_send_reply_receive (
        void *res_msg,
        size_t res_len)
 {
-       return errno_to_cs(qb_ipcc_sendv_recv(c, iov, iov_len, res_msg, 
res_len));
+       return qb_to_cs_error(qb_ipcc_sendv_recv(c, iov, iov_len, res_msg, 
res_len));
 }
 
 static void cpg_iteration_instance_finalize (struct cpg_iteration_instance_t 
*cpg_iteration_instance)
diff --git a/services/cpg.c b/services/cpg.c
index 6537caa..7610156 100644
--- a/services/cpg.c
+++ b/services/cpg.c
@@ -1701,11 +1701,66 @@ static void message_handler_req_lib_cpg_zc_execute (
 {
        mar_req_coroipcc_zc_execute_t *hdr = (mar_req_coroipcc_zc_execute_t 
*)message;
        struct qb_ipc_request_header *header;
+       struct res_lib_cpg_mcast res_lib_cpg_mcast;
+       struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
+       struct iovec req_exec_cpg_iovec[2];
+       struct req_exec_cpg_mcast req_exec_cpg_mcast;
+       struct req_lib_cpg_mcast *req_lib_cpg_mcast;
+       int result;
+       cs_error_t error = CPG_ERR_NOT_EXIST;
+       struct coroipcs_zc_header *zc_hdr;
+
        log_printf(LOGSYS_LEVEL_DEBUG, "got ZC mcast request on %p\n", conn);
 
+       zc_hdr = (struct coroipcs_zc_header *)((char 
*)serveraddr2void(hdr->server_address));
        header = (struct qb_ipc_request_header *)(((char 
*)serveraddr2void(hdr->server_address) + sizeof (struct coroipcs_zc_header)));
+       req_lib_cpg_mcast = (struct req_lib_cpg_mcast *)header;
+
+       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_OK;
+               break;
+       case CPD_STATE_JOIN_COMPLETED:
+               error = CPG_OK;
+               break;
+       }
+
+       res_lib_cpg_mcast.header.size = sizeof(res_lib_cpg_mcast);
+       res_lib_cpg_mcast.header.id = MESSAGE_RES_CPG_MCAST;
+       if (error == CPG_OK) {
+               req_exec_cpg_mcast.header.size = sizeof(req_exec_cpg_mcast) + 
req_lib_cpg_mcast->msglen;
+               req_exec_cpg_mcast.header.id = SERVICE_ID_MAKE(CPG_SERVICE,
+                       MESSAGE_REQ_EXEC_CPG_MCAST);
+               req_exec_cpg_mcast.pid = cpd->pid;
+               req_exec_cpg_mcast.msglen = req_lib_cpg_mcast->msglen;
+               api->ipc_source_set (&req_exec_cpg_mcast.source, conn);
+               memcpy(&req_exec_cpg_mcast.group_name, &cpd->group_name,
+                       sizeof(mar_cpg_name_t));
+
+               req_exec_cpg_iovec[0].iov_base = (char *)&req_exec_cpg_mcast;
+               req_exec_cpg_iovec[0].iov_len = sizeof(req_exec_cpg_mcast);
+               req_exec_cpg_iovec[1].iov_base = (char *)header + sizeof(struct 
req_lib_cpg_mcast);
+               req_exec_cpg_iovec[1].iov_len = req_exec_cpg_mcast.msglen;
+
+               result = api->totem_mcast (req_exec_cpg_iovec, 2, TOTEM_AGREED);
+               if (result == 0) {
+                       res_lib_cpg_mcast.header.error = CS_OK;
+               } else {
+                       res_lib_cpg_mcast.header.error = CS_ERR_TRY_AGAIN;
+               }
+       } else {
+               res_lib_cpg_mcast.header.error = error;
+       }
+
+       api->ipc_response_send (conn, &res_lib_cpg_mcast,
+               sizeof (res_lib_cpg_mcast));
 
-       message_handler_req_lib_cpg_mcast(conn, header);
 }
 
 static void message_handler_req_lib_cpg_membership (void *conn,
-- 
1.7.3.1

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to