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

(Logical change 1.175)

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@592 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 21 лет назад
Родитель
Сommit
94a50283e7
2 измененных файлов с 211 добавлено и 65 удалено
  1. 28 65
      exec/evs.c
  2. 183 0
      test/testevsth.c

+ 28 - 65
exec/evs.c

@@ -1,4 +1,6 @@
 /*
+ * vi: set autoindent tabstop=4 shiftwidth=4 :
+ *
  * Copyright (c) 2004 MontaVista Software, Inc.
  *
  * All rights reserved.
@@ -76,13 +78,9 @@ static int evs_confchg_fn (
     struct in_addr *joined_list, int joined_list_entries,
 	struct memb_ring_id *ring_id);
 
-static int message_handler_req_exec_mcast (void *message, struct in_addr source_addr, int endian_conversion_required);
-
-static int message_handler_req_evs_init (struct conn_info *conn_info,
-	void *message);
+static int evs_init_two_fn (struct conn_info *conn_info);
 
-static int message_handler_req_lib_activatepoll (struct conn_info *conn_info,
-	void *message);
+static int message_handler_req_exec_mcast (void *message, struct in_addr source_addr, int endian_conversion_required);
 
 static int message_handler_req_evs_join (struct conn_info *conn_info, void *message);
 static int message_handler_req_evs_leave (struct conn_info *conn_info, void *message);
@@ -94,30 +92,24 @@ static int evs_exit_fn (struct conn_info *conn_info);
 struct libais_handler evs_libais_handlers[] =
 {
 	{ /* 0 */
-		.libais_handler_fn			= message_handler_req_lib_activatepoll,
-		.response_size				= sizeof (struct res_lib_activatepoll),
-		.response_id				= MESSAGE_RES_LIB_ACTIVATEPOLL, // TODO RESPONSE
-		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
-	},
-	{ /* 1 */
 		.libais_handler_fn			= message_handler_req_evs_join,
 		.response_size				= sizeof (struct res_lib_evs_join),
 		.response_id				= MESSAGE_RES_EVS_JOIN,
 		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
 	},
-	{ /* 2 */
+	{ /* 1 */
 		.libais_handler_fn			= message_handler_req_evs_leave,
 		.response_size				= sizeof (struct res_lib_evs_leave),
 		.response_id				= MESSAGE_RES_EVS_LEAVE,
 		.flow_control				= FLOW_CONTROL_NOT_REQUIRED
 	},
-	{ /* 3 */
+	{ /* 2 */
 		.libais_handler_fn			= message_handler_req_evs_mcast_joined,
 		.response_size				= sizeof (struct res_lib_evs_mcast_joined),
 		.response_id				= MESSAGE_RES_EVS_MCAST_JOINED,
 		.flow_control				= FLOW_CONTROL_REQUIRED
 	},
-	{ /* 4 */
+	{ /* 3 */
 		.libais_handler_fn			= message_handler_req_evs_mcast_groups,
 		.response_size				= sizeof (struct res_lib_evs_mcast_groups),
 		.response_id				= MESSAGE_RES_EVS_MCAST_GROUPS,
@@ -135,7 +127,7 @@ struct service_handler evs_service_handler = {
 	.aisexec_handler_fns		= evs_aisexec_handler_fns,
 	.aisexec_handler_fns_count	= sizeof (evs_aisexec_handler_fns) / sizeof (int (*)),
 	.confchg_fn					= evs_confchg_fn,
-	.libais_init_fn				= message_handler_req_evs_init,
+	.libais_init_two_fn			= evs_init_two_fn,
 	.libais_exit_fn				= evs_exit_fn,
 	.exec_init_fn				= evs_executive_initialize,
 	.exec_dump_fn				= 0
@@ -148,6 +140,7 @@ static int evs_executive_initialize (void)
 
 static int evs_exit_fn (struct conn_info *conn_info)
 {
+
 	list_del (&conn_info->conn_list);
 	return (0);
 }
@@ -197,43 +190,12 @@ static int evs_confchg_fn (
 	return (0);
 }
 
-static int message_handler_req_evs_init (struct conn_info *conn_info, void *message)
+static int evs_init_two_fn (struct conn_info *conn_info)
 {
-	SaErrorT error = SA_ERR_SECURITY;
-	struct res_lib_init res_lib_init;
-
 	log_printf (LOG_LEVEL_DEBUG, "Got request to initalize evs service.\n");
-	if (conn_info->authenticated) {
-		conn_info->service = SOCKET_SERVICE_EVS;
-		error = SA_OK;
-	}
-
-	res_lib_init.header.size = sizeof (struct res_lib_init);
-	res_lib_init.header.id = MESSAGE_RES_INIT;
-	res_lib_init.header.error = error;
-
-	libais_send_response (conn_info, &res_lib_init, sizeof (res_lib_init));
-
-
+	list_init (&conn_info->conn_list);
 	list_add (&conn_info->conn_list, &confchg_notify);
 
-	if (conn_info->authenticated) {
-		return (0);
-	}
-
-	return (-1);
-}
-
-static int message_handler_req_lib_activatepoll (struct conn_info *conn_info, void *message)
-{
-	struct res_lib_activatepoll res_lib_activatepoll;
-
-	res_lib_activatepoll.header.size = sizeof (struct res_lib_activatepoll);
-	res_lib_activatepoll.header.id = MESSAGE_RES_LIB_ACTIVATEPOLL;
-	res_lib_activatepoll.header.error = SA_OK;
-	libais_send_response (conn_info, &res_lib_activatepoll,
-		sizeof (struct res_lib_activatepoll));
-
 	return (0);
 }
 
@@ -256,20 +218,21 @@ static int message_handler_req_evs_join (struct conn_info *conn_info, void *mess
 	}
 }
 #endif
-	addr = realloc (conn_info->ais_ci.u.libevs_ci.groups,
+	addr = realloc (conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups,
 		sizeof (struct evs_group) * 
-		(conn_info->ais_ci.u.libevs_ci.group_entries + req_lib_evs_join->group_entries));
+		(conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries +
+		req_lib_evs_join->group_entries));
 	if (addr == 0) {
 		error = SA_ERR_NO_MEMORY;
 		goto exit_error;
 	}
-	conn_info->ais_ci.u.libevs_ci.groups = addr;
+	conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups = addr;
 
-	memcpy (&conn_info->ais_ci.u.libevs_ci.groups[conn_info->ais_ci.u.libevs_ci.group_entries],
+	memcpy (&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries],
 		req_lib_evs_join->groups,
 		sizeof (struct evs_group) * req_lib_evs_join->group_entries);
 
-	conn_info->ais_ci.u.libevs_ci.group_entries += req_lib_evs_join->group_entries;
+	conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries += req_lib_evs_join->group_entries;
 
 exit_error:
 	res_lib_evs_join.header.size = sizeof (struct res_lib_evs_join);
@@ -293,20 +256,20 @@ static int message_handler_req_evs_leave (struct conn_info *conn_info, void *mes
 
 	for (i = 0; i < req_lib_evs_leave->group_entries; i++) {
 		found = 0;
-		for (j = 0; j < conn_info->ais_ci.u.libevs_ci.group_entries;) {
+		for (j = 0; j < conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries;) {
 			if (memcmp (&req_lib_evs_leave->groups[i],
-				&conn_info->ais_ci.u.libevs_ci.groups[j],
+				&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j],
 				sizeof (struct evs_group)) == 0) {
 
 				/*
 				 * Delete entry
 				 */
-				memmove (&conn_info->ais_ci.u.libevs_ci.groups[j],
-					&conn_info->ais_ci.u.libevs_ci.groups[j + 1],
-					(conn_info->ais_ci.u.libevs_ci.group_entries - j - 1) * 
+				memmove (&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j],
+					&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[j + 1],
+					(conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries - j - 1) * 
 					sizeof (struct evs_group));
 
-				conn_info->ais_ci.u.libevs_ci.group_entries -= 1;
+				conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries -= 1;
 
 				found = 1;
 				break;
@@ -322,9 +285,9 @@ static int message_handler_req_evs_leave (struct conn_info *conn_info, void *mes
 	}
 
 #ifdef DEBUG
-	for (i = 0; i < conn_info->ais_ci.u.libevs_ci.group_entries; i++) {
+	for (i = 0; i < conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries; i++) {
 		printf ("Groups Left %s\n", 
-					&conn_info->ais_ci.u.libevs_ci.groups[i].key);
+					&conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups[i].key);
 	}
 #endif
 	res_lib_evs_leave.header.size = sizeof (struct res_lib_evs_leave);
@@ -350,12 +313,12 @@ static int message_handler_req_evs_mcast_joined (struct conn_info *conn_info, vo
 	req_exec_evs_mcast.header.size = sizeof (struct req_exec_evs_mcast);
 	req_exec_evs_mcast.header.id = MESSAGE_REQ_EXEC_EVS_MCAST;
 	req_exec_evs_mcast.msg_len = req_lib_evs_mcast_joined->msg_len;
-	req_exec_evs_mcast.group_entries = conn_info->ais_ci.u.libevs_ci.group_entries;
+	req_exec_evs_mcast.group_entries = conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries;
 
 	req_exec_evs_mcast_iovec[0].iov_base = &req_exec_evs_mcast;
 	req_exec_evs_mcast_iovec[0].iov_len = sizeof (req_exec_evs_mcast);
-	req_exec_evs_mcast_iovec[1].iov_base = conn_info->ais_ci.u.libevs_ci.groups;
-	req_exec_evs_mcast_iovec[1].iov_len = conn_info->ais_ci.u.libevs_ci.group_entries * sizeof (struct evs_group);
+	req_exec_evs_mcast_iovec[1].iov_base = conn_info->conn_info_partner->ais_ci.u.libevs_ci.groups;
+	req_exec_evs_mcast_iovec[1].iov_len = conn_info->conn_info_partner->ais_ci.u.libevs_ci.group_entries * sizeof (struct evs_group);
 	req_exec_evs_mcast_iovec[2].iov_base = &req_lib_evs_mcast_joined->msg;
 	req_exec_evs_mcast_iovec[2].iov_len = req_lib_evs_mcast_joined->msg_len;
 // TODO this doesn't seem to work for some reason	

+ 183 - 0
test/testevsth.c

@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2004 MontaVista Software, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Steven Dake (sdake@mvista.com)
+ *
+ * This software licensed under BSD license, the text of which follows:
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <pthread.h>
+#include "../include/evs.h"
+
+char *delivery_string;
+
+#define CALLBACKS 200000
+int callback_count = 0;
+void evs_deliver_fn (struct in_addr source_addr, void *msg, int msg_len)
+{
+#ifdef PRINT_OUTPUT
+	char *buf;
+	buf += 100000;
+	printf ("Delivery callback\n");
+	printf ("callback %d '%s' msg '%s'\n", callback_count, delivery_string, buf);
+#endif
+	callback_count += 1;
+	if (callback_count % 50 == 0) {
+		printf ("Callback %d\n", callback_count);
+	}
+}
+
+void evs_confchg_fn (
+	struct in_addr *member_list, int member_list_entries,
+	struct in_addr *left_list, int left_list_entries,
+	struct in_addr *joined_list, int joined_list_entries)
+{
+	int i;
+
+	printf ("CONFIGURATION CHANGE\n");
+	printf ("--------------------\n");
+	printf ("New configuration\n");
+	for (i = 0; i < member_list_entries; i++) {
+		printf ("%s\n", inet_ntoa (member_list[i]));
+	}
+	printf ("Members Left:\n");
+	for (i = 0; i < left_list_entries; i++) {
+		printf ("%s\n", inet_ntoa (left_list[i]));
+	}
+	printf ("Members Joined:\n");
+	for (i = 0; i < joined_list_entries; i++) {
+		printf ("%s\n", inet_ntoa (joined_list[i]));
+	}
+}
+
+evs_callbacks_t callbacks = {
+	evs_deliver_fn,
+	evs_confchg_fn
+};
+
+struct evs_group groups[3] = {
+	{ "key1" },
+	{ "key2" },
+	{ "key3" }
+};
+
+char buffer[1000];
+struct iovec iov = {
+	.iov_base = buffer,
+	.iov_len = sizeof (buffer)
+};
+
+void *th_dispatch (void *arg)
+{
+	evs_error_t result;
+	evs_handle_t handle = *(evs_handle_t *)arg;
+
+	printf ("THREAD DISPATCH starting.\n");
+	result = evs_dispatch (handle, EVS_DISPATCH_BLOCKING);
+	printf ("THREAD DISPATCH return result is %d\n", result);
+	return (0);
+}
+
+static struct sched_param sched_param = {
+    sched_priority: 99
+};
+
+int main (void)
+{
+	evs_handle_t handle;
+	evs_error_t result;
+	int i = 0;
+	pthread_t dispatch_thread;
+	pthread_attr_t dispatch_thread_attribute;
+
+	result = evs_initialize (&handle, &callbacks);
+	if (result != EVS_OK) {
+		printf ("Couldn't initialize EVS service %d\n", result);
+		exit (0);
+	}
+
+        pthread_attr_init (&dispatch_thread_attribute);
+        pthread_attr_setschedpolicy (&dispatch_thread_attribute, SCHED_FIFO);
+        pthread_attr_setschedparam (&dispatch_thread_attribute, &sched_param);
+
+        pthread_create (&dispatch_thread, NULL, th_dispatch, &handle);
+
+	printf ("Init result %d\n", result);
+	result = evs_join (handle, groups, 3);
+	printf ("Join result %d\n", result);
+	result = evs_leave (handle, &groups[0], 1);
+	printf ("Leave result %d\n", result);
+	delivery_string = "evs_mcast_joined";
+
+	/*
+	 * Demonstrate evs_mcast_joined
+	 */
+	for (i = 0; i < CALLBACKS/2; i++) {
+		sprintf (buffer, "evs_mcast_joined: This is message %d", i);
+try_again_one:
+		result = evs_mcast_joined (handle, EVS_TYPE_AGREED, &iov, 1);
+		if (result == EVS_ERR_TRY_AGAIN) {
+			goto try_again_one;
+		} else
+		if (result != EVS_OK) {
+			printf ("Got error result, exiting %d\n", result);
+			exit (1);
+		}
+	}
+
+	/*
+	 * Demonstrate evs_mcast_joined
+	 */
+	delivery_string = "evs_mcast_groups";
+	for (i = 0; i < CALLBACKS/2; i++) {
+		sprintf (buffer, "evs_mcast_groups: This is message %d", i);
+try_again_two:
+		result = evs_mcast_groups (handle, EVS_TYPE_AGREED,
+			 &groups[1], 1, &iov, 1);
+		if (result == EVS_ERR_TRY_AGAIN) {
+			goto try_again_two;
+		}
+	}
+
+	/*
+	 * Wait until all callbacks have been executed by dispatch thread
+	 */
+	for (;;) {
+		if (callback_count == CALLBACKS) {
+		printf ("Test completed successfully\n");
+			exit (0);
+		}
+	}
+	return (0);
+}