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

adds evs_membership_get api

(Logical change 1.196)


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@642 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 21 лет назад
Родитель
Сommit
a7a2c41da3
16 измененных файлов с 142 добавлено и 12 удалено
  1. 28 0
      exec/evs.c
  2. 15 2
      include/ais_msg.h
  3. 9 0
      include/evs.h
  4. 58 1
      lib/evs.c
  5. 1 0
      man/Makefile
  6. 2 1
      man/evs_dispatch.3
  7. 2 1
      man/evs_fd_get.3
  8. 2 1
      man/evs_finalize.3
  9. 2 1
      man/evs_initialize.3
  10. 2 1
      man/evs_join.3
  11. 2 1
      man/evs_leave.3
  12. 2 1
      man/evs_mcast_groups.3
  13. 2 1
      man/evs_mcast_joined.3
  14. 2 1
      man/evs_overview.8
  15. 2 0
      man/index.html
  16. 11 0
      test/testevs.c

+ 28 - 0
exec/evs.c

@@ -86,6 +86,7 @@ static int message_handler_req_evs_join (struct conn_info *conn_info, void *mess
 static int message_handler_req_evs_leave (struct conn_info *conn_info, void *message);
 static int message_handler_req_evs_mcast_joined (struct conn_info *conn_info, void *message);
 static int message_handler_req_evs_mcast_groups (struct conn_info *conn_info, void *message);
+static int message_handler_req_evs_membership_get (struct conn_info *conn_info, void *message);
 
 static int evs_exit_fn (struct conn_info *conn_info);
 
@@ -114,6 +115,12 @@ struct libais_handler evs_libais_handlers[] =
 		.response_size				= sizeof (struct res_lib_evs_mcast_groups),
 		.response_id				= MESSAGE_RES_EVS_MCAST_GROUPS,
 		.flow_control				= FLOW_CONTROL_REQUIRED
+	},
+	{ /* 4 */
+		.libais_handler_fn			= message_handler_req_evs_membership_get,
+		.response_size				= sizeof (struct res_lib_evs_membership_get),
+		.response_id				= MESSAGE_RES_EVS_MEMBERSHIP_GET,
+		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
 	}
 };
 
@@ -396,6 +403,27 @@ static int message_handler_req_evs_mcast_groups (struct conn_info *conn_info, vo
 
 	return (0);
 }
+static int message_handler_req_evs_membership_get (struct conn_info *conn_info, void *message)
+{
+	struct res_lib_evs_membership_get res_lib_evs_membership_get;
+
+	res_lib_evs_membership_get.header.size = sizeof (struct res_lib_evs_membership_get);
+	res_lib_evs_membership_get.header.id = MESSAGE_RES_EVS_MEMBERSHIP_GET;
+	res_lib_evs_membership_get.header.error = EVS_OK;
+	res_lib_evs_membership_get.local_addr.s_addr = this_ip->sin_addr.s_addr;
+	memcpy (&res_lib_evs_membership_get.member_list,
+		&res_evs_confchg_callback.member_list,
+		sizeof (res_lib_evs_membership_get.member_list));
+
+	res_lib_evs_membership_get.member_list_entries =
+		res_evs_confchg_callback.member_list_entries;
+
+	libais_send_response (conn_info, &res_lib_evs_membership_get,
+		sizeof (struct res_lib_evs_membership_get));
+
+	return (0);
+}
+
 static int message_handler_req_exec_mcast (void *message, struct in_addr source_addr, int endian_conversion_required)
 {
 	struct req_exec_evs_mcast *req_exec_evs_mcast = (struct req_exec_evs_mcast *)message;

+ 15 - 2
include/ais_msg.h

@@ -55,7 +55,8 @@ enum req_lib_evs_types {
 	MESSAGE_REQ_EVS_JOIN = 0,
 	MESSAGE_REQ_EVS_LEAVE = 1,
 	MESSAGE_REQ_EVS_MCAST_JOINED = 2,
-	MESSAGE_REQ_EVS_MCAST_GROUPS = 3
+	MESSAGE_REQ_EVS_MCAST_GROUPS = 3,
+	MESSAGE_REQ_EVS_MEMBERSHIP_GET = 4
 };
 
 enum res_lib_evs_types {
@@ -64,7 +65,8 @@ enum res_lib_evs_types {
 	MESSAGE_RES_EVS_JOIN = 2,
 	MESSAGE_RES_EVS_LEAVE = 3,
 	MESSAGE_RES_EVS_MCAST_JOINED = 4,
-	MESSAGE_RES_EVS_MCAST_GROUPS = 5
+	MESSAGE_RES_EVS_MCAST_GROUPS = 5,
+	MESSAGE_RES_EVS_MEMBERSHIP_GET = 6
 };
 
 enum req_amf_types {
@@ -170,6 +172,17 @@ struct req_exec_evs_mcast {
 	/* data goes here */
 };
 
+struct req_lib_evs_membership_get {
+	struct req_header header;
+};
+
+struct res_lib_evs_membership_get {
+	struct res_header header;
+	struct in_addr local_addr;
+	struct in_addr member_list[16];
+	int member_list_entries;
+};
+
 struct req_lib_resdis_init {
 	int size;
 	int id;

+ 9 - 0
include/evs.h

@@ -157,4 +157,13 @@ evs_error_t evs_mcast_groups (
 	struct iovec *iovec,
 	int iov_len);
 
+/*
+ * Get membership information from evs
+ */
+evs_error_t evs_membership_get (
+	evs_handle_t handle,
+	struct in_addr *local_addr,
+	struct in_addr *member_list,
+	int *member_list_entries);
+
 #endif /* OPENAIS_EVS_H_DEFINED */

+ 58 - 1
lib/evs.c

@@ -1,7 +1,7 @@
 /*
  * vi: set autoindent tabstop=4 shiftwidth=4 :
 
- * Copyright (c) 2004 MontaVista Software, Inc.
+ * Copyright (c) 2004-2005 MontaVista Software, Inc.
  *
  * All rights reserved.
  *
@@ -539,3 +539,60 @@ error_exit:
 
 	return (error);
 }
+
+evs_error_t evs_membership_get (
+	evs_handle_t handle,
+	struct in_addr *local_addr,
+	struct in_addr *member_list,
+	int *member_list_entries)
+{
+	evs_error_t error;
+	struct evs_inst *evs_inst;
+	struct iovec iov;
+	struct req_lib_evs_membership_get req_lib_evs_membership_get;
+	struct res_lib_evs_membership_get res_lib_evs_membership_get;
+
+	error = saHandleInstanceGet (&evs_handle_t_db, handle, (void *)&evs_inst);
+	if (error != SA_OK) {
+		return (error);
+	}
+
+	req_lib_evs_membership_get.header.size = sizeof (struct req_lib_evs_membership_get);
+	req_lib_evs_membership_get.header.id = MESSAGE_REQ_EVS_MEMBERSHIP_GET;
+
+	iov.iov_base = &req_lib_evs_membership_get;
+	iov.iov_len = sizeof (struct req_lib_evs_membership_get);
+
+	pthread_mutex_lock (&evs_inst->response_mutex);
+
+	error = saSendMsgReceiveReply (evs_inst->response_fd, &iov, 1,
+		&res_lib_evs_membership_get, sizeof (struct res_lib_evs_membership_get));
+
+	pthread_mutex_unlock (&evs_inst->response_mutex);
+
+	if (error != SA_OK) {
+	printf ("error\n");
+		goto error_exit;
+	}
+
+	error = res_lib_evs_membership_get.header.error;
+	printf ("members is %d\n", res_lib_evs_membership_get.member_list_entries);
+
+	/*
+	 * Copy results to caller
+	 */
+	if (local_addr) {
+		memcpy (local_addr, &res_lib_evs_membership_get.local_addr, sizeof (struct in_addr));
+ 	}
+	*member_list_entries = *member_list_entries < res_lib_evs_membership_get.member_list_entries ?
+		*member_list_entries : res_lib_evs_membership_get.member_list_entries;
+	if (member_list) {
+		memcpy (member_list, &res_lib_evs_membership_get.member_list, 
+			*member_list_entries * sizeof (struct in_addr));
+	}
+
+error_exit:
+	saHandleInstancePut (&evs_handle_t_db, handle);
+
+	return (error);
+}

+ 1 - 0
man/Makefile

@@ -42,6 +42,7 @@ html:
 	groff -mandoc -Thtml evs_leave.3 > html/evs_leave.html
 	groff -mandoc -Thtml evs_mcast_groups.3 > html/evs_mcast_groups.html
 	groff -mandoc -Thtml evs_mcast_joined.3 > html/evs_mcast_joined.html
+	groff -mandoc -Thtml evs_membership_get.3 > html/evs_membership_get.html
 	cp index.html html
 
 clean:

+ 2 - 1
man/evs_dispatch.3

@@ -96,5 +96,6 @@ The errors are undocumented.
 .BR evs_join (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_fd_get.3

@@ -63,5 +63,6 @@ The errors are undocumented.
 .BR evs_join (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_finalize.3

@@ -59,5 +59,6 @@ The errors are undocumented.
 .BR evs_join (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_initialize.3

@@ -114,5 +114,6 @@ The errors are undocumented.
 .BR evs_join (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_join.3

@@ -98,5 +98,6 @@ The errors are undocumented.
 .BR evs_dispatch (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_leave.3

@@ -93,5 +93,6 @@ The errors are undocumented.
 .BR evs_dispatch (3),
 .BR evs_join (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_mcast_groups.3

@@ -157,5 +157,6 @@ The errors are undocumented.
 .BR evs_dispatch (3),
 .BR evs_leave (3),
 .BR evs_join (3),
-.BR evs_mcast_joined (3)
+.BR evs_mcast_joined (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_mcast_joined.3

@@ -130,5 +130,6 @@ The errors are undocumented.
 .BR evs_dispatch (3),
 .BR evs_leave (3),
 .BR evs_join (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 .PP

+ 2 - 1
man/evs_overview.8

@@ -175,6 +175,7 @@ there are very few since nobody reports any unknown bugs at this point.
 .BR evs_join (3),
 .BR evs_leave (3),
 .BR evs_mcast_joined (3),
-.BR evs_mcast_groups (3)
+.BR evs_mcast_groups (3),
+.BR evs_mmembership_get (3)
 
 .PP

+ 2 - 0
man/index.html

@@ -26,4 +26,6 @@ Welcome to the OpenAIS EVS (extended virtual synchrony) documentation.
 <BR>
 <A HREF="evs_mcast_joined.html">evs_mcast_joined(3)</A>
 <P>
+<A HREF="evs_membership_get.html">evs_membership_get(3)</A>
+<P>
 </body>

+ 11 - 0
test/testevs.c

@@ -98,12 +98,23 @@ int main (void)
 	evs_error_t result;
 	int i = 0;
 	int fd;
+	struct in_addr member_list[16];
+	struct in_addr local_addr;
+	int member_list_entries = sizeof (member_list) / sizeof (struct in_addr);
 
 	result = evs_initialize (&handle, &callbacks);
 	if (result != EVS_OK) {
 		printf ("Couldn't initialize EVS service %d\n", result);
 		exit (0);
 	}
+	
+	result = evs_membership_get (handle, &local_addr, member_list, &member_list_entries);
+	printf ("Current membership from evs_membership_get entries %d\n", member_list_entries);
+	for (i = 0; i < member_list_entries; i++) {
+		printf ("Member [%d] is %s\n", i, inet_ntoa (member_list[i]));
+	}
+	printf ("local processor from evs_membership_get %s\n", inet_ntoa (local_addr));
+
 	printf ("Init result %d\n", result);
 	result = evs_join (handle, groups, 3);
 	printf ("Join result %d\n", result);