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

Patch to allow cpg_membership_get to work properly.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1721 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 17 лет назад
Родитель
Сommit
db71709ada
3 измененных файлов с 37 добавлено и 13 удалено
  1. 1 1
      include/corosync/ipc_cpg.h
  2. 35 12
      lib/cpg.c
  3. 1 0
      services/cpg.c

+ 1 - 1
include/corosync/ipc_cpg.h

@@ -143,7 +143,7 @@ struct res_lib_cpg_flowcontrol_callback {
 
 
 struct req_lib_cpg_membership {
 struct req_lib_cpg_membership {
 	mar_req_header_t header __attribute__((aligned(8)));
 	mar_req_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_confchg_callback {
 struct res_lib_cpg_confchg_callback {

+ 35 - 12
lib/cpg.c

@@ -625,47 +625,70 @@ cs_error_t cpg_membership_get (
 	struct cpg_inst *cpg_inst;
 	struct cpg_inst *cpg_inst;
 	struct iovec iov;
 	struct iovec iov;
 	struct req_lib_cpg_membership req_lib_cpg_membership_get;
 	struct req_lib_cpg_membership req_lib_cpg_membership_get;
-	struct res_lib_cpg_confchg_callback res_lib_cpg_membership_get;
-	unsigned int i;
+	struct res_lib_cpg_confchg_callback *res_lib_cpg_membership_get;
+	mar_res_header_t header;
+	unsigned int i, bytesleft;
+	char *buffer = NULL;
 
 
 	error = saHandleInstanceGet (&cpg_handle_t_db, handle, (void *)&cpg_inst);
 	error = saHandleInstanceGet (&cpg_handle_t_db, handle, (void *)&cpg_inst);
 	if (error != CS_OK) {
 	if (error != CS_OK) {
 		return (error);
 		return (error);
 	}
 	}
 
 
-	req_lib_cpg_membership_get.header.size = sizeof (mar_req_header_t);
+	req_lib_cpg_membership_get.header.size = sizeof (req_lib_cpg_membership_get);
 	req_lib_cpg_membership_get.header.id = MESSAGE_REQ_CPG_MEMBERSHIP;
 	req_lib_cpg_membership_get.header.id = MESSAGE_REQ_CPG_MEMBERSHIP;
-	marshall_to_mar_cpg_name_t (&req_lib_cpg_membership_get.group_name,
-		group_name);
 
 
 	iov.iov_base = (char *)&req_lib_cpg_membership_get;
 	iov.iov_base = (char *)&req_lib_cpg_membership_get;
-	iov.iov_len = sizeof (mar_req_header_t);
+	iov.iov_len = sizeof (req_lib_cpg_membership_get);
 
 
 	pthread_mutex_lock (&cpg_inst->response_mutex);
 	pthread_mutex_lock (&cpg_inst->response_mutex);
 
 
 	error = saSendMsgReceiveReply (cpg_inst->response_fd, &iov, 1,
 	error = saSendMsgReceiveReply (cpg_inst->response_fd, &iov, 1,
-		&res_lib_cpg_membership_get, sizeof (mar_res_header_t));
+		&header, sizeof (header));
+	if (error != CS_OK) {
+		goto error_exit;
+	}
 
 
-	pthread_mutex_unlock (&cpg_inst->response_mutex);
+	buffer = malloc(header.size);
+	if (buffer == NULL) {
+		error = CS_ERR_NO_MEMORY;
+		goto error_exit;
+	}
+
+	memcpy (buffer, &header, sizeof (header));
+	bytesleft = header.size - sizeof (header);
 
 
+	error = saRecvRetry (cpg_inst->response_fd,
+		buffer + sizeof (header), bytesleft);
 	if (error != CS_OK) {
 	if (error != CS_OK) {
 		goto error_exit;
 		goto error_exit;
 	}
 	}
 
 
-	error = res_lib_cpg_membership_get.header.error;
+	error = header.error;
+	if (error != CS_OK) {
+		goto error_exit;
+	}
+
+	res_lib_cpg_membership_get = (struct res_lib_cpg_confchg_callback *) buffer;
 
 
 	/*
 	/*
 	 * Copy results to caller
 	 * Copy results to caller
 	 */
 	 */
-	*member_list_entries = res_lib_cpg_membership_get.member_list_entries;
+	*member_list_entries = res_lib_cpg_membership_get->member_list_entries;
 	if (member_list) {
 	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_list_entries; i++) {
 			marshall_from_mar_cpg_address_t (&member_list[i],
 			marshall_from_mar_cpg_address_t (&member_list[i],
-				&res_lib_cpg_membership_get.member_list[i]);
+				&res_lib_cpg_membership_get->member_list[i]);
 		}
 		}
 	}
 	}
 
 
 error_exit:
 error_exit:
+
+	if (buffer != NULL)
+		free(buffer);
+
+	pthread_mutex_unlock (&cpg_inst->response_mutex);
+
 	(void)saHandleInstancePut (&cpg_handle_t_db, handle);
 	(void)saHandleInstancePut (&cpg_handle_t_db, handle);
 
 
 	return (error);
 	return (error);

+ 1 - 0
services/cpg.c

@@ -404,6 +404,7 @@ static int notify_lib_joinlist(
 
 
 	res->header.size = size;
 	res->header.size = size;
 	res->header.id = id;
 	res->header.id = id;
+	res->header.error = CS_OK;
 	memcpy(&res->group_name, &gi->group_name, sizeof(mar_cpg_name_t));
 	memcpy(&res->group_name, &gi->group_name, sizeof(mar_cpg_name_t));
 
 
 	/* Build up the message */
 	/* Build up the message */