diff --git a/exec/clm.c b/exec/clm.c index c3028477..b7bfa9e9 100644 --- a/exec/clm.c +++ b/exec/clm.c @@ -124,7 +124,7 @@ static int message_handler_req_exec_clm_nodejoin (void *message, struct in_addr static int message_handler_req_clm_clustertrack (struct conn_info *conn_info, void *message); -static int message_handler_req_clm_trackstop (struct conn_info *conn_info, +static int message_handler_req_lib_clm_trackstop (struct conn_info *conn_info, void *message); static int message_handler_req_clm_nodeget (struct conn_info *conn_info, @@ -147,8 +147,8 @@ struct libais_handler clm_libais_handlers[] = .flow_control = FLOW_CONTROL_NOT_REQUIRED }, { /* 1 */ - .libais_handler_fn = message_handler_req_clm_trackstop, - .response_size = sizeof (struct res_clm_trackstop), + .libais_handler_fn = message_handler_req_lib_clm_trackstop, + .response_size = sizeof (struct res_lib_clm_trackstop), .response_id = MESSAGE_RES_CLM_TRACKSTOP, // TODO RESPONSE .flow_control = FLOW_CONTROL_NOT_REQUIRED }, @@ -541,6 +541,7 @@ int message_handler_req_clm_clustertrack (struct conn_info *conn_info, void *mes conn_info->conn_info_partner->ais_ci.u.libclm_ci.trackFlags = req_clm_clustertrack->trackFlags; + conn_info->conn_info_partner->ais_ci.u.libclm_ci.tracking_enabled = 1; list_add (&conn_info->conn_info_partner->conn_list, &library_notification_send_listhead); @@ -550,12 +551,27 @@ int message_handler_req_clm_clustertrack (struct conn_info *conn_info, void *mes } -static int message_handler_req_clm_trackstop (struct conn_info *conn_info, void *message) +static int message_handler_req_lib_clm_trackstop (struct conn_info *conn_info, void *message) { - conn_info->ais_ci.u.libclm_ci.trackFlags = 0; + struct res_lib_clm_trackstop res_lib_clm_trackstop; + + res_lib_clm_trackstop.header.size = sizeof (struct res_lib_clm_trackstop); + res_lib_clm_trackstop.header.id = MESSAGE_RES_CLM_TRACKSTOP; + + if (conn_info->conn_info_partner->ais_ci.u.libclm_ci.tracking_enabled) { + res_lib_clm_trackstop.header.error = SA_OK; + } else { + res_lib_clm_trackstop.header.error = SA_AIS_ERR_NOT_EXIST; + } + + conn_info->conn_info_partner->ais_ci.u.libclm_ci.trackFlags = 0; + conn_info->conn_info_partner->ais_ci.u.libclm_ci.tracking_enabled = 0; list_del (&conn_info->conn_info_partner->conn_list); + libais_send_response (conn_info, &res_lib_clm_trackstop, + sizeof (struct res_lib_clm_trackstop)); + return (0); } diff --git a/exec/clm.h b/exec/clm.h index 8be144b3..eea5addd 100644 --- a/exec/clm.h +++ b/exec/clm.h @@ -42,6 +42,7 @@ struct libclm_ci { SaUint8T trackFlags; + int tracking_enabled; }; extern SaClmClusterNodeT *clm_get_by_nodeid (struct in_addr node_id); diff --git a/include/ipc_clm.h b/include/ipc_clm.h index 26c3fa53..d5f12f44 100644 --- a/include/ipc_clm.h +++ b/include/ipc_clm.h @@ -63,13 +63,13 @@ struct req_clm_clustertrack { struct res_clm_clustertrack { struct res_header header; }; -struct req_clm_trackstop { +struct req_lib_clm_trackstop { struct req_header header; SaSizeT dataRead; SaErrorT error; }; -struct res_clm_trackstop { +struct res_lib_clm_trackstop { struct res_header header; }; diff --git a/lib/clm.c b/lib/clm.c index a7103595..bd13d44d 100644 --- a/lib/clm.c +++ b/lib/clm.c @@ -478,11 +478,12 @@ saClmClusterTrackStop ( SaClmHandleT clmHandle) { struct clmInstance *clmInstance; - struct req_clm_trackstop req_trackstop; + struct req_lib_clm_trackstop req_lib_clm_trackstop; + struct res_lib_clm_trackstop res_lib_clm_trackstop; SaAisErrorT error = SA_OK; - req_trackstop.header.size = sizeof (struct req_clm_trackstop); - req_trackstop.header.id = MESSAGE_REQ_CLM_TRACKSTOP; + req_lib_clm_trackstop.header.size = sizeof (struct req_lib_clm_trackstop); + req_lib_clm_trackstop.header.id = MESSAGE_REQ_CLM_TRACKSTOP; error = saHandleInstanceGet (&clmHandleDatabase, clmHandle, (void *)&clmInstance); @@ -492,18 +493,19 @@ saClmClusterTrackStop ( pthread_mutex_lock (&clmInstance->response_mutex); - error = saSendRetry (clmInstance->response_fd, &req_trackstop, - sizeof (struct req_clm_trackstop), MSG_NOSIGNAL); + error = saSendReceiveReply (clmInstance->response_fd, + &req_lib_clm_trackstop, + sizeof (struct req_lib_clm_trackstop), + &res_lib_clm_trackstop, + sizeof (struct res_lib_clm_trackstop)); + + pthread_mutex_unlock (&clmInstance->response_mutex); clmInstance->notificationBuffer.notification = 0; - pthread_mutex_unlock (&clmInstance->response_mutex); - // TODO what about getting response from executive? The - // executive should send a response - saHandleInstancePut (&clmHandleDatabase, clmHandle); - return (error); + return (error == SA_AIS_OK ? res_lib_clm_trackstop.header.error : error); } SaAisErrorT