Releated to https://bugzilla.redhat.com/show_bug.cgi?id=569525
Support for lib_cpg_finalize Add support for MESSAGE_REQ_CPG_FINALIZE message. This will allow us remove cpg_pd from list of active connections, and remove problem, when cpg_finalize + cpg_initialize + cpg_join can result in CPG_ERR_EXIST error. Regards, Honza
commit 6368d70729864eac85b7ed1ee4c12131bc85661b Author: Jan Friesse <[email protected]> Date: Mon Mar 1 17:32:13 2010 +0100 Support for lib_cpg_finalize Add support for MESSAGE_REQ_CPG_FINALIZE message. This will allow us remove cpg_pd from list of active connections, and remove problem, when cpg_finalize + cpg_initialize + cpg_join can result in CPG_ERR_EXIST error. diff --git a/trunk/include/corosync/ipc_cpg.h b/trunk/include/corosync/ipc_cpg.h index 7df1891..8f55ae8 100644 --- a/trunk/include/corosync/ipc_cpg.h +++ b/trunk/include/corosync/ipc_cpg.h @@ -47,7 +47,8 @@ enum req_cpg_types { MESSAGE_REQ_CPG_LOCAL_GET = 4, MESSAGE_REQ_CPG_ITERATIONINITIALIZE = 5, MESSAGE_REQ_CPG_ITERATIONNEXT = 6, - MESSAGE_REQ_CPG_ITERATIONFINALIZE = 7 + MESSAGE_REQ_CPG_ITERATIONFINALIZE = 7, + MESSAGE_REQ_CPG_FINALIZE = 8 }; enum res_cpg_types { @@ -63,6 +64,7 @@ enum res_cpg_types { MESSAGE_RES_CPG_ITERATIONINITIALIZE = 9, MESSAGE_RES_CPG_ITERATIONNEXT = 10, MESSAGE_RES_CPG_ITERATIONFINALIZE = 11, + MESSAGE_RES_CPG_FINALIZE = 12, }; enum lib_cpg_confchg_reason { @@ -157,6 +159,14 @@ struct res_lib_cpg_join { coroipc_response_header_t header __attribute__((aligned(8))); }; +struct req_lib_cpg_finalize { + coroipc_request_header_t header __attribute__((aligned(8))); +}; + +struct res_lib_cpg_finalize { + coroipc_response_header_t header __attribute__((aligned(8))); +}; + struct req_lib_cpg_trackstart { coroipc_request_header_t header __attribute__((aligned(8))); mar_cpg_name_t group_name __attribute__((aligned(8))); diff --git a/trunk/lib/cpg.c b/trunk/lib/cpg.c index 780e79f..79836e4 100644 --- a/trunk/lib/cpg.c +++ b/trunk/lib/cpg.c @@ -164,6 +164,9 @@ cs_error_t cpg_finalize ( cpg_handle_t handle) { struct cpg_inst *cpg_inst; + struct iovec iov; + struct req_lib_cpg_finalize req_lib_cpg_finalize; + struct res_lib_cpg_finalize res_lib_cpg_finalize; cs_error_t error; error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst)); @@ -181,12 +184,36 @@ cs_error_t cpg_finalize ( cpg_inst->finalize = 1; + /* + * Send service request + */ + req_lib_cpg_finalize.header.size = sizeof (struct req_lib_cpg_finalize); + req_lib_cpg_finalize.header.id = MESSAGE_REQ_CPG_FINALIZE; + + iov.iov_base = (void *)&req_lib_cpg_finalize; + iov.iov_len = sizeof (struct req_lib_cpg_finalize); + + error = coroipcc_msg_send_reply_receive (cpg_inst->handle, + &iov, + 1, + &res_lib_cpg_finalize, + sizeof (struct req_lib_cpg_finalize)); + + if (error != CS_OK) { + goto error_put; + } + coroipcc_service_disconnect (cpg_inst->handle); cpg_inst_finalize (cpg_inst, handle); hdb_handle_put (&cpg_handle_t_db, handle); return (CPG_OK); + +error_put: + hdb_handle_put (&cpg_iteration_handle_t_db, handle); + cpg_inst->finalize = 0; + return (error); } cs_error_t cpg_fd_get ( diff --git a/trunk/services/cpg.c b/trunk/services/cpg.c index af5f6c4..7b57d57 100644 --- a/trunk/services/cpg.c +++ b/trunk/services/cpg.c @@ -214,6 +214,8 @@ static void message_handler_req_lib_cpg_join (void *conn, const void *message); static void message_handler_req_lib_cpg_leave (void *conn, const void *message); +static void message_handler_req_lib_cpg_finalize (void *conn, const void *message); + static void message_handler_req_lib_cpg_mcast (void *conn, const void *message); static void message_handler_req_lib_cpg_membership (void *conn, @@ -290,6 +292,10 @@ static struct corosync_lib_handler cpg_lib_engine[] = .lib_handler_fn = message_handler_req_lib_cpg_iteration_finalize, .flow_control = CS_LIB_FLOW_CONTROL_NOT_REQUIRED }, + { /* 8 */ + .lib_handler_fn = message_handler_req_lib_cpg_finalize, + .flow_control = CS_LIB_FLOW_CONTROL_REQUIRED + }, }; static struct corosync_exec_handler cpg_exec_engine[] = @@ -1149,6 +1155,32 @@ static void message_handler_req_lib_cpg_leave (void *conn, const void *message) api->ipc_response_send(conn, &res_lib_cpg_leave, sizeof(res_lib_cpg_leave)); } +/* Finalize message from library */ +static void message_handler_req_lib_cpg_finalize ( + void *conn, + const void *message) +{ + struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn); + struct res_lib_cpg_finalize res_lib_cpg_finalize; + cs_error_t error = CS_OK; + + log_printf (LOGSYS_LEVEL_DEBUG, "cpg finalize for conn=%p\n", conn); + + /* + * We will just remove cpd from list. After this call, connection will be + * closed on lib side, and cpg_lib_exit_fn will be called + */ + list_del (&cpd->list); + list_init (&cpd->list); + + res_lib_cpg_finalize.header.size = sizeof (res_lib_cpg_finalize); + res_lib_cpg_finalize.header.id = MESSAGE_RES_CPG_FINALIZE; + res_lib_cpg_finalize.header.error = error; + + api->ipc_response_send (conn, &res_lib_cpg_finalize, + sizeof (res_lib_cpg_finalize)); +} + /* Mcast message from the library */ static void message_handler_req_lib_cpg_mcast (void *conn, const void *message) {
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
