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

Make cpg_membership_get() functional.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2855 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 15 лет назад
Родитель
Сommit
0e9f0bfeb4
4 измененных файлов с 62 добавлено и 33 удалено
  1. 8 2
      include/corosync/ipc_cpg.h
  2. 16 6
      lib/cpg.c
  3. 20 25
      services/cpg.c
  4. 18 0
      test/testcpg.c

+ 8 - 2
include/corosync/ipc_cpg.h

@@ -237,9 +237,15 @@ struct res_lib_cpg_flowcontrol_callback {
 	mar_uint32_t flow_control_state __attribute__((aligned(8)));
 };
 
-struct req_lib_cpg_membership {
+struct req_lib_cpg_membership_get {
 	coroipc_request_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_membership_get {
+	coroipc_response_header_t header __attribute__((aligned(8)));
+	mar_uint32_t member_count __attribute__((aligned(8)));
+	mar_cpg_address_t member_list[PROCESSOR_COUNT_MAX];
 };
 
 struct res_lib_cpg_confchg_callback {

+ 16 - 6
lib/cpg.c

@@ -582,24 +582,34 @@ cs_error_t cpg_membership_get (
 	cs_error_t error;
 	struct cpg_inst *cpg_inst;
 	struct iovec iov;
-	struct req_lib_cpg_membership req_lib_cpg_membership_get;
-	struct res_lib_cpg_confchg_callback res_lib_cpg_membership_get;
+	struct req_lib_cpg_membership_get req_lib_cpg_membership_get;
+	struct res_lib_cpg_membership_get res_lib_cpg_membership_get;
 	unsigned int i;
 
+	if (member_list == NULL) {
+		return (CS_ERR_INVALID_PARAM);
+	}
+	if (member_list_entries == NULL) {
+		return (CS_ERR_INVALID_PARAM);
+	}
+
 	error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst));
 	if (error != CS_OK) {
 		return (error);
 	}
 
-	req_lib_cpg_membership_get.header.size = sizeof (coroipc_request_header_t);
+	req_lib_cpg_membership_get.header.size = sizeof (struct req_lib_cpg_membership_get);
 	req_lib_cpg_membership_get.header.id = MESSAGE_REQ_CPG_MEMBERSHIP;
 
+	memcpy (&req_lib_cpg_membership_get.group_name, group_name,
+		sizeof (struct cpg_name));
+
 	iov.iov_base = (void *)&req_lib_cpg_membership_get;
 	iov.iov_len = sizeof (coroipc_request_header_t);
 
 	do {
 		error = coroipcc_msg_send_reply_receive (cpg_inst->handle, &iov, 1,
-			&res_lib_cpg_membership_get, sizeof (coroipc_response_header_t));
+			&res_lib_cpg_membership_get, sizeof (res_lib_cpg_membership_get));
 
  		if (error != CS_OK) {
  			goto error_exit;
@@ -611,9 +621,9 @@ cs_error_t cpg_membership_get (
 	/*
 	 * Copy results to caller
 	 */
-	*member_list_entries = res_lib_cpg_membership_get.member_list_entries;
+	*member_list_entries = res_lib_cpg_membership_get.member_count;
 	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_count; i++) {
 			marshall_from_mar_cpg_address_t (&member_list[i],
 				&res_lib_cpg_membership_get.member_list[i]);
 		}

+ 20 - 25
services/cpg.c

@@ -1463,36 +1463,31 @@ static void message_handler_req_lib_cpg_mcast (void *conn, const void *message)
 static void message_handler_req_lib_cpg_membership (void *conn,
 						    const void *message)
 {
-	struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
-	cs_error_t error = CPG_ERR_NOT_EXIST;
-	coroipc_response_header_t res;
+	struct req_lib_cpg_membership_get *req_lib_cpg_membership_get =
+		(struct req_lib_cpg_membership_get *)message;
+	struct res_lib_cpg_membership_get res_lib_cpg_membership_get;
+	struct list_head *iter;
+	int member_count = 0;
 
-	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_ERR_BUSY;
-		break;
-	case CPD_STATE_JOIN_COMPLETED:
-		error = CPG_OK;
-		break;
-	}
+	res_lib_cpg_membership_get.header.id = MESSAGE_RES_CPG_MEMBERSHIP;
+	res_lib_cpg_membership_get.header.error = CPG_OK;
+	res_lib_cpg_membership_get.header.size =
+		sizeof (struct req_lib_cpg_membership_get);
 
-	res.size = sizeof (res);
-	res.id = MESSAGE_RES_CPG_MEMBERSHIP;
-	res.error = error;
-	api->ipc_response_send (conn, &res, sizeof(res));
-		return;
+	for (iter = process_info_list_head.next;
+		iter != &process_info_list_head; iter = iter->next) {
 
-	if (error == CPG_OK) {
-		notify_lib_joinlist (&cpd->group_name, conn, 0, NULL, 0, NULL,
-			MESSAGE_RES_CPG_MEMBERSHIP);
+		struct process_info *pi = list_entry (iter, struct process_info, list);
+		if (mar_name_compare (&pi->group, &req_lib_cpg_membership_get->group_name) == 0) {
+			res_lib_cpg_membership_get.member_list[member_count].nodeid = pi->nodeid;
+			res_lib_cpg_membership_get.member_list[member_count].pid = pi->pid;
+			member_count += 1;
+		}
 	}
+	res_lib_cpg_membership_get.member_count = member_count;
 
+	api->ipc_response_send (conn, &res_lib_cpg_membership_get,
+		sizeof (res_lib_cpg_membership_get));
 }
 
 static void message_handler_req_lib_cpg_local_get (void *conn,

+ 18 - 0
test/testcpg.c

@@ -174,6 +174,9 @@ int main (int argc, char *argv[]) {
 	int opt;
 	unsigned int nodeid;
 	char *fgets_res;
+	struct cpg_address member_list[64];
+	int member_list_entries;
+	int i;
 
 	while ( (opt = getopt(argc, argv, options)) != -1 ) {
 		switch (opt) {
@@ -210,6 +213,21 @@ int main (int argc, char *argv[]) {
 		exit (1);
 	}
 
+	sleep (1);
+	result = cpg_membership_get (handle, &group_name,
+		(struct cpg_address *)&member_list, &member_list_entries);
+	if (result != CS_OK) {
+		printf ("Could not get current membership list %d\n", result);
+		exit (1);
+	}
+
+	printf ("membership list\n");
+	for (i = 0; i < member_list_entries; i++) {
+		printf ("node id %d pid %d\n", member_list[i].nodeid,
+			member_list[i].pid);
+	}
+
+
 	FD_ZERO (&read_fds);
 	cpg_fd_get(handle, &select_fd);
 	printf ("Type EXIT to finish\n");