Просмотр исходного кода

defect 792
saClmTrackStop not returning SA_AIS_ERR_NOT_EXIST


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@784 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 20 лет назад
Родитель
Сommit
89a60a2caa
4 измененных файлов с 36 добавлено и 17 удалено
  1. 21 5
      exec/clm.c
  2. 1 0
      exec/clm.h
  3. 2 2
      include/ipc_clm.h
  4. 12 10
      lib/clm.c

+ 21 - 5
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,
 static int message_handler_req_clm_clustertrack (struct conn_info *conn_info,
 	void *message);
 	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);
 	void *message);
 
 
 static int message_handler_req_clm_nodeget (struct conn_info *conn_info,
 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
 		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
 	},
 	},
 	{ /* 1 */
 	{ /* 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
 		.response_id				= MESSAGE_RES_CLM_TRACKSTOP, // TODO RESPONSE
 		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
 		.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.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);
 	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);
 	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);
 	return (0);
 }
 }
 
 

+ 1 - 0
exec/clm.h

@@ -42,6 +42,7 @@
 
 
 struct libclm_ci {
 struct libclm_ci {
 	SaUint8T trackFlags;
 	SaUint8T trackFlags;
+	int tracking_enabled;
 };
 };
 
 
 extern SaClmClusterNodeT *clm_get_by_nodeid (struct in_addr node_id);
 extern SaClmClusterNodeT *clm_get_by_nodeid (struct in_addr node_id);

+ 2 - 2
include/ipc_clm.h

@@ -63,13 +63,13 @@ struct req_clm_clustertrack {
 struct res_clm_clustertrack {
 struct res_clm_clustertrack {
 	struct res_header header;
 	struct res_header header;
 };
 };
-struct req_clm_trackstop {
+struct req_lib_clm_trackstop {
 	struct req_header header;
 	struct req_header header;
 	SaSizeT dataRead;
 	SaSizeT dataRead;
 	SaErrorT error;
 	SaErrorT error;
 };
 };
 
 
-struct res_clm_trackstop {
+struct res_lib_clm_trackstop {
 	struct res_header header;
 	struct res_header header;
 };
 };
 
 

+ 12 - 10
lib/clm.c

@@ -478,11 +478,12 @@ saClmClusterTrackStop (
 	SaClmHandleT clmHandle)
 	SaClmHandleT clmHandle)
 {
 {
 	struct clmInstance *clmInstance;
 	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;
 	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,
 	error = saHandleInstanceGet (&clmHandleDatabase, clmHandle,
 		(void *)&clmInstance);
 		(void *)&clmInstance);
@@ -492,18 +493,19 @@ saClmClusterTrackStop (
 
 
 	pthread_mutex_lock (&clmInstance->response_mutex);
 	pthread_mutex_lock (&clmInstance->response_mutex);
 
 
-	error = saSendRetry (clmInstance->response_fd, &req_trackstop,
-		sizeof (struct req_clm_trackstop), MSG_NOSIGNAL);
-
-	clmInstance->notificationBuffer.notification = 0;
+	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);
 	pthread_mutex_unlock (&clmInstance->response_mutex);
-	// TODO what about getting response from executive?  The
-	// executive should send a response
+
+	clmInstance->notificationBuffer.notification = 0;
 
 
 	saHandleInstancePut (&clmHandleDatabase, clmHandle);
 	saHandleInstancePut (&clmHandleDatabase, clmHandle);
 
 
-	return (error);
+        return (error == SA_AIS_OK ? res_lib_clm_trackstop.header.error : error);
 }
 }
 
 
 SaAisErrorT
 SaAisErrorT