Răsfoiți Sursa

pass transitional members into the sync_init() callbacks.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2653 fd59a12c-fef9-0310-b244-a6a79926bd2f
Angus Salkeld 16 ani în urmă
părinte
comite
c6beee076a
8 a modificat fișierele cu 123 adăugiri și 30 ștergeri
  1. 5 3
      exec/evil.c
  2. 17 3
      exec/main.c
  3. 17 3
      exec/sync.c
  4. 14 2
      exec/sync.h
  5. 52 11
      exec/syncv2.c
  6. 5 0
      exec/syncv2.h
  7. 3 2
      include/corosync/engine/coroapi.h
  8. 10 6
      services/cpg.c

+ 5 - 3
exec/evil.c

@@ -117,16 +117,18 @@ static void deliver_fn_evt_compat (
 	unsigned int endian_conversion_required);
 	unsigned int endian_conversion_required);
 
 
 static struct sync_callbacks clm_sync_operations = {
 static struct sync_callbacks clm_sync_operations = {
+	.api_version		= 1,
 	.name			= "dummy CLM service",
 	.name			= "dummy CLM service",
-	.sync_init		= clm_sync_init,
+	.sync_init_api.sync_init_v1 = clm_sync_init,
 	.sync_process		= clm_sync_process,
 	.sync_process		= clm_sync_process,
 	.sync_activate		= clm_sync_activate,
 	.sync_activate		= clm_sync_activate,
 	.sync_abort		= clm_sync_abort,
 	.sync_abort		= clm_sync_abort,
 };
 };
 
 
 static struct sync_callbacks evt_sync_operations = {
 static struct sync_callbacks evt_sync_operations = {
+	.api_version		= 1,
 	.name			= "dummy EVT service",
 	.name			= "dummy EVT service",
-	.sync_init		= evt_sync_init,
+	.sync_init_api.sync_init_v1 = evt_sync_init,
 	.sync_process		= evt_sync_process,
 	.sync_process		= evt_sync_process,
 	.sync_activate		= evt_sync_activate,
 	.sync_activate		= evt_sync_activate,
 	.sync_abort		= evt_sync_abort,
 	.sync_abort		= evt_sync_abort,
@@ -212,7 +214,7 @@ extern int evil_callbacks_load (int sync_id,
 
 
 	}
 	}
 	if (callbacks_init) {
 	if (callbacks_init) {
-		callbacks->sync_init = sync_dummy_init;
+		callbacks->sync_init_api.sync_init_v1 = sync_dummy_init;
 		callbacks->sync_process = sync_dummy_process;
 		callbacks->sync_process = sync_dummy_process;
 		callbacks->sync_activate = sync_dummy_activate;
 		callbacks->sync_activate = sync_dummy_activate;
 		callbacks->sync_abort = sync_dummy_abort;
 		callbacks->sync_abort = sync_dummy_abort;

+ 17 - 3
exec/main.c

@@ -274,7 +274,8 @@ static int corosync_sync_callbacks_retrieve (int sync_id,
 		ais_service_index++) {
 		ais_service_index++) {
 
 
 		if (ais_service[ais_service_index] != NULL
 		if (ais_service[ais_service_index] != NULL
-			&& ais_service[ais_service_index]->sync_mode == CS_SYNC_V1) {
+			&& (ais_service[ais_service_index]->sync_mode == CS_SYNC_V1
+				|| ais_service[ais_service_index]->sync_mode == CS_SYNC_V1_APIV2)) {
 			if (ais_service_index == sync_id) {
 			if (ais_service_index == sync_id) {
 				break;
 				break;
 			}
 			}
@@ -288,7 +289,11 @@ static int corosync_sync_callbacks_retrieve (int sync_id,
 		return (res);
 		return (res);
 	}
 	}
 	callbacks->name = ais_service[ais_service_index]->name;
 	callbacks->name = ais_service[ais_service_index]->name;
-	callbacks->sync_init = ais_service[ais_service_index]->sync_init;
+	callbacks->sync_init_api.sync_init_v1 = ais_service[ais_service_index]->sync_init;
+	callbacks->api_version = 1;
+	if (ais_service[ais_service_index]->sync_mode == CS_SYNC_V1_APIV2) {
+		callbacks->api_version = 2;
+	}
 	callbacks->sync_process = ais_service[ais_service_index]->sync_process;
 	callbacks->sync_process = ais_service[ais_service_index]->sync_process;
 	callbacks->sync_activate = ais_service[ais_service_index]->sync_activate;
 	callbacks->sync_activate = ais_service[ais_service_index]->sync_activate;
 	callbacks->sync_abort = ais_service[ais_service_index]->sync_abort;
 	callbacks->sync_abort = ais_service[ais_service_index]->sync_abort;
@@ -317,7 +322,13 @@ static int corosync_sync_v2_callbacks_retrieve (
 	}
 	}
 
 
 	callbacks->name = ais_service[service_id]->name;
 	callbacks->name = ais_service[service_id]->name;
-	callbacks->sync_init = ais_service[service_id]->sync_init;
+
+	callbacks->api_version = 1;
+	if (ais_service[service_id]->sync_mode == CS_SYNC_V1_APIV2) {
+		callbacks->api_version = 2;
+	}
+
+	callbacks->sync_init_api.sync_init_v1 = ais_service[service_id]->sync_init;
 	callbacks->sync_process = ais_service[service_id]->sync_process;
 	callbacks->sync_process = ais_service[service_id]->sync_process;
 	callbacks->sync_activate = ais_service[service_id]->sync_activate;
 	callbacks->sync_activate = ais_service[service_id]->sync_activate;
 	callbacks->sync_abort = ais_service[service_id]->sync_abort;
 	callbacks->sync_abort = ais_service[service_id]->sync_abort;
@@ -359,6 +370,9 @@ static void confchg_fn (
 	if (abort_activate) {
 	if (abort_activate) {
 		sync_v2_abort ();
 		sync_v2_abort ();
 	}
 	}
+	if (minimum_sync_mode == CS_SYNC_V2 && configuration_type == TOTEM_CONFIGURATION_TRANSITIONAL) {
+		sync_v2_save_transitional (member_list, member_list_entries, ring_id);
+	}
 	if (minimum_sync_mode == CS_SYNC_V2 && configuration_type == TOTEM_CONFIGURATION_REGULAR) {
 	if (minimum_sync_mode == CS_SYNC_V2 && configuration_type == TOTEM_CONFIGURATION_REGULAR) {
 		sync_v2_start (member_list, member_list_entries, ring_id);
 		sync_v2_start (member_list, member_list_entries, ring_id);
 	}
 	}

+ 17 - 3
exec/sync.c

@@ -99,8 +99,12 @@ static struct barrier_data barrier_data_process[PROCESSOR_COUNT_MAX];
 
 
 static unsigned int my_member_list[PROCESSOR_COUNT_MAX];
 static unsigned int my_member_list[PROCESSOR_COUNT_MAX];
 
 
+static unsigned int my_trans_list[PROCESSOR_COUNT_MAX];
+
 static unsigned int my_member_list_entries;
 static unsigned int my_member_list_entries;
 
 
+static unsigned int my_trans_list_entries;
+
 static int sync_barrier_send (const struct memb_ring_id *ring_id);
 static int sync_barrier_send (const struct memb_ring_id *ring_id);
 
 
 static int sync_start_process (enum totem_callback_token_type type,
 static int sync_start_process (enum totem_callback_token_type type,
@@ -181,7 +185,14 @@ static void sync_start_init (const struct memb_ring_id *ring_id)
 
 
 static void sync_service_init (struct memb_ring_id *ring_id)
 static void sync_service_init (struct memb_ring_id *ring_id)
 {
 {
-	sync_callbacks.sync_init (my_member_list, my_member_list_entries, ring_id);
+	if (sync_callbacks.api_version == 1) {
+		sync_callbacks.sync_init_api.sync_init_v1 (my_member_list,
+			my_member_list_entries, ring_id);
+	} else {
+		sync_callbacks.sync_init_api.sync_init_v2 (my_trans_list,
+			my_trans_list_entries,
+			my_member_list, my_member_list_entries, ring_id);
+	}
 	totempg_callback_token_destroy (&sync_callback_token_handle);
 	totempg_callback_token_destroy (&sync_callback_token_handle);
 
 
 	/*
 	/*
@@ -227,7 +238,7 @@ static void sync_callbacks_load (void)
 			break;
 			break;
 		}
 		}
 		sync_recovery_index += 1;
 		sync_recovery_index += 1;
-		if (sync_callbacks.sync_init) {
+		if (sync_callbacks.sync_init_api.sync_init_v1) {
 			break;
 			break;
 		}
 		}
 	}
 	}
@@ -434,7 +445,7 @@ static void sync_deliver_fn (
 		/*
 		/*
 		 * if sync service found, execute it
 		 * if sync service found, execute it
 		 */
 		 */
-		if (sync_processing && sync_callbacks.sync_init) {
+		if (sync_processing && sync_callbacks.sync_init_api.sync_init_v1) {
 			log_printf (LOGSYS_LEVEL_DEBUG,
 			log_printf (LOGSYS_LEVEL_DEBUG,
 				"Synchronization actions starting for (%s)\n",
 				"Synchronization actions starting for (%s)\n",
 				sync_callbacks.name);
 				sync_callbacks.name);
@@ -460,6 +471,9 @@ static void sync_confchg_fn (
 	sync_ring_id = ring_id;
 	sync_ring_id = ring_id;
 
 
 	if (configuration_type != TOTEM_CONFIGURATION_REGULAR) {
 	if (configuration_type != TOTEM_CONFIGURATION_REGULAR) {
+		memcpy (my_trans_list, member_list, member_list_entries *
+			sizeof (unsigned int));
+		my_trans_list_entries = member_list_entries;
 		return;
 		return;
 	}
 	}
 	memcpy (my_member_list, member_list, member_list_entries * sizeof (unsigned int));
 	memcpy (my_member_list, member_list, member_list_entries * sizeof (unsigned int));

+ 14 - 2
exec/sync.h

@@ -39,11 +39,23 @@
 #include <corosync/totem/totempg.h>
 #include <corosync/totem/totempg.h>
 #include "totemsrp.h"
 #include "totemsrp.h"
 
 
-struct sync_callbacks {
-	void (*sync_init) (
+union sync_init_api {
+	void (*sync_init_v1) (
+		const unsigned int *member_list,
+		size_t member_list_entries,
+		const struct memb_ring_id *ring_id);
+
+	void (*sync_init_v2) (
+		const unsigned int *trans_list,
+		size_t trans_list_entries,
 		const unsigned int *member_list,
 		const unsigned int *member_list,
 		size_t member_list_entries,
 		size_t member_list_entries,
 		const struct memb_ring_id *ring_id);
 		const struct memb_ring_id *ring_id);
+};
+
+struct sync_callbacks {
+	int api_version;
+	union sync_init_api sync_init_api;
 	int (*sync_process) (void);
 	int (*sync_process) (void);
 	void (*sync_activate) (void);
 	void (*sync_activate) (void);
 	void (*sync_abort) (void);
 	void (*sync_abort) (void);

+ 52 - 11
exec/syncv2.c

@@ -81,10 +81,8 @@ enum sync_state {
 
 
 struct service_entry {
 struct service_entry {
 	int service_id;
 	int service_id;
-	void (*sync_init) (
-		const unsigned int *member_list,
-		size_t member_list_entries,
-		const struct memb_ring_id *ring_id);
+	int api_version;
+	union sync_init_api sync_init_api;
 	void (*sync_abort) (void);
 	void (*sync_abort) (void);
 	int (*sync_process) (void);
 	int (*sync_process) (void);
 	void (*sync_activate) (void);
 	void (*sync_activate) (void);
@@ -134,8 +132,12 @@ static struct processor_entry my_processor_list[PROCESSOR_COUNT_MAX];
 
 
 static unsigned int my_member_list[PROCESSOR_COUNT_MAX];
 static unsigned int my_member_list[PROCESSOR_COUNT_MAX];
 
 
+static unsigned int my_trans_list[PROCESSOR_COUNT_MAX];
+
 static size_t my_member_list_entries = 0;
 static size_t my_member_list_entries = 0;
 
 
+static size_t my_trans_list_entries = 0;
+
 static int my_processor_list_entries = 0;
 static int my_processor_list_entries = 0;
 
 
 static struct service_entry my_service_list[128];
 static struct service_entry my_service_list[128];
@@ -202,7 +204,7 @@ int sync_v2_init (
 		if (res == -1) {
 		if (res == -1) {
 			continue;
 			continue;
 		}
 		}
-		if (sync_callbacks.sync_init == NULL) {
+		if (sync_callbacks.sync_init_api.sync_init_v1 == NULL) {
 			continue;
 			continue;
 		}
 		}
 		my_initial_service_list[my_initial_service_list_entries].state =
 		my_initial_service_list[my_initial_service_list_entries].state =
@@ -210,7 +212,8 @@ int sync_v2_init (
 		my_initial_service_list[my_initial_service_list_entries].service_id = i;
 		my_initial_service_list[my_initial_service_list_entries].service_id = i;
 		strcpy (my_initial_service_list[my_initial_service_list_entries].name,
 		strcpy (my_initial_service_list[my_initial_service_list_entries].name,
 			sync_callbacks.name);
 			sync_callbacks.name);
-		my_initial_service_list[my_initial_service_list_entries].sync_init = sync_callbacks.sync_init;
+		my_initial_service_list[my_initial_service_list_entries].api_version = sync_callbacks.api_version;
+		my_initial_service_list[my_initial_service_list_entries].sync_init_api = sync_callbacks.sync_init_api;
 		my_initial_service_list[my_initial_service_list_entries].sync_process = sync_callbacks.sync_process;
 		my_initial_service_list[my_initial_service_list_entries].sync_process = sync_callbacks.sync_process;
 		my_initial_service_list[my_initial_service_list_entries].sync_abort = sync_callbacks.sync_abort;
 		my_initial_service_list[my_initial_service_list_entries].sync_abort = sync_callbacks.sync_abort;
 		my_initial_service_list[my_initial_service_list_entries].sync_activate = sync_callbacks.sync_activate;
 		my_initial_service_list[my_initial_service_list_entries].sync_activate = sync_callbacks.sync_activate;
@@ -334,7 +337,8 @@ static void sync_service_build_handler (unsigned int nodeid, const void *msg)
 			sprintf (my_service_list[my_service_list_entries].name,
 			sprintf (my_service_list[my_service_list_entries].name,
 				"External Service (id = %d)\n",
 				"External Service (id = %d)\n",
 				req_exec_service_build_message->service_list[i]);
 				req_exec_service_build_message->service_list[i]);
-			my_service_list[my_service_list_entries].sync_init =
+			my_service_list[my_service_list_entries].api_version = 1;
+			my_service_list[my_service_list_entries].sync_init_api.sync_init_v1 =
 				dummy_sync_init;
 				dummy_sync_init;
 			my_service_list[my_service_list_entries].sync_abort =
 			my_service_list[my_service_list_entries].sync_abort =
 				dummy_sync_abort;
 				dummy_sync_abort;
@@ -510,13 +514,39 @@ static void sync_servicelist_build_enter (
 
 
 static int schedwrk_processor (const void *context)
 static int schedwrk_processor (const void *context)
 {
 {
-	int res;
+	int res = 0;
 
 
 	if (my_service_list[my_processing_idx].state == INIT) {
 	if (my_service_list[my_processing_idx].state == INIT) {
 		my_service_list[my_processing_idx].state = PROCESS;
 		my_service_list[my_processing_idx].state = PROCESS;
-		my_service_list[my_processing_idx].sync_init (my_member_list,
-			my_member_list_entries,
-			&my_ring_id);
+		if (my_service_list[my_processing_idx].api_version == 1) {
+			my_service_list[my_processing_idx].sync_init_api.sync_init_v1 (my_member_list,
+				my_member_list_entries,
+				&my_ring_id);
+		} else {
+			unsigned int old_trans_list[PROCESSOR_COUNT_MAX];
+			size_t old_trans_list_entries = 0;
+			int o, m;
+
+			memcpy (old_trans_list, my_trans_list, my_trans_list_entries *
+				sizeof (unsigned int));
+			old_trans_list_entries = my_trans_list_entries;
+
+			my_trans_list_entries = 0;
+			for (o = 0; o < old_trans_list_entries; o++) {
+				for (m = 0; m < my_member_list_entries; m++) {
+					if (old_trans_list[o] == my_member_list[m]) {
+						my_trans_list[my_trans_list_entries] = my_member_list[m];
+						my_trans_list_entries++;
+						break;
+					}
+				}
+			}
+
+			my_service_list[my_processing_idx].sync_init_api.sync_init_v2 (my_trans_list,
+				my_trans_list_entries, my_member_list,
+				my_member_list_entries,
+				&my_ring_id);
+		}
 	}
 	}
 	if (my_service_list[my_processing_idx].state == PROCESS) {
 	if (my_service_list[my_processing_idx].state == PROCESS) {
 		my_service_list[my_processing_idx].state = PROCESS;
 		my_service_list[my_processing_idx].state = PROCESS;
@@ -554,6 +584,17 @@ void sync_v2_start (
 	}
 	}
 }
 }
 
 
+void sync_v2_save_transitional (
+        const unsigned int *member_list,
+        size_t member_list_entries,
+        const struct memb_ring_id *ring_id)
+{
+	log_printf (LOGSYS_LEVEL_DEBUG, "saving transitional configuration\n");
+	memcpy (my_trans_list, member_list, member_list_entries *
+		sizeof (unsigned int));
+	my_trans_list_entries = member_list_entries;
+}
+
 void sync_v2_abort (void)
 void sync_v2_abort (void)
 {
 {
 	if (my_state == SYNC_PROCESS) {
 	if (my_state == SYNC_PROCESS) {

+ 5 - 0
exec/syncv2.h

@@ -48,6 +48,11 @@ extern void sync_v2_start (
         size_t member_list_entries,
         size_t member_list_entries,
         const struct memb_ring_id *ring_id);
         const struct memb_ring_id *ring_id);
 
 
+extern void sync_v2_save_transitional (
+        const unsigned int *member_list,
+        size_t member_list_entries,
+        const struct memb_ring_id *ring_id);
+
 extern void sync_v2_abort (void);
 extern void sync_v2_abort (void);
 
 
 extern void sync_v2_memb_list_determine (const struct memb_ring_id *ring_id);
 extern void sync_v2_memb_list_determine (const struct memb_ring_id *ring_id);

+ 3 - 2
include/corosync/engine/coroapi.h

@@ -136,8 +136,9 @@ enum cs_flow_control_state {
 #endif /* COROSYNC_FLOW_CONTROL_STATE */
 #endif /* COROSYNC_FLOW_CONTROL_STATE */
 
 
 enum cs_sync_mode {
 enum cs_sync_mode {
-	CS_SYNC_V1	= 0,
-	CS_SYNC_V2	= 1
+	CS_SYNC_V1	 = 0,
+	CS_SYNC_V2	 = 1,
+	CS_SYNC_V1_APIV2 = 2
 };
 };
 
 
 typedef enum {
 typedef enum {

+ 10 - 6
services/cpg.c

@@ -240,7 +240,9 @@ static int cpg_exec_send_downlist(void);
 
 
 static int cpg_exec_send_joinlist(void);
 static int cpg_exec_send_joinlist(void);
 
 
-static void cpg_sync_init (
+static void cpg_sync_init_v2 (
+	const unsigned int *trans_list,
+	size_t trans_list_entries,
 	const unsigned int *member_list,
 	const unsigned int *member_list,
 	size_t member_list_entries,
 	size_t member_list_entries,
 	const struct memb_ring_id *ring_id);
 	const struct memb_ring_id *ring_id);
@@ -329,8 +331,8 @@ struct corosync_service_engine cpg_service_engine = {
 	.exec_dump_fn				= NULL,
 	.exec_dump_fn				= NULL,
 	.exec_engine				= cpg_exec_engine,
 	.exec_engine				= cpg_exec_engine,
 	.exec_engine_count		        = sizeof (cpg_exec_engine) / sizeof (struct corosync_exec_handler),
 	.exec_engine_count		        = sizeof (cpg_exec_engine) / sizeof (struct corosync_exec_handler),
-	.sync_mode				= CS_SYNC_V1,
-	.sync_init                              = cpg_sync_init,
+	.sync_mode				= CS_SYNC_V1_APIV2,
+	.sync_init                              = cpg_sync_init_v2,
 	.sync_process                           = cpg_sync_process,
 	.sync_process                           = cpg_sync_process,
 	.sync_activate                          = cpg_sync_activate,
 	.sync_activate                          = cpg_sync_activate,
 	.sync_abort                             = cpg_sync_abort
 	.sync_abort                             = cpg_sync_abort
@@ -406,7 +408,9 @@ struct req_exec_cpg_downlist {
 
 
 static struct req_exec_cpg_downlist g_req_exec_cpg_downlist;
 static struct req_exec_cpg_downlist g_req_exec_cpg_downlist;
 
 
-static void cpg_sync_init (
+static void cpg_sync_init_v2 (
+	const unsigned int *trans_list,
+	size_t trans_list_entries,
 	const unsigned int *member_list,
 	const unsigned int *member_list,
 	size_t member_list_entries,
 	size_t member_list_entries,
 	const struct memb_ring_id *ring_id)
 	const struct memb_ring_id *ring_id)
@@ -435,8 +439,8 @@ static void cpg_sync_init (
 		 */
 		 */
 		for (i = 0; i < my_old_member_list_entries; i++) {
 		for (i = 0; i < my_old_member_list_entries; i++) {
 			found = 0;
 			found = 0;
-			for (j = 0; j < my_member_list_entries; j++) {
-				if (my_old_member_list[i] == my_member_list[j]) {
+			for (j = 0; j < trans_list_entries; j++) {
+				if (my_old_member_list[i] == trans_list[j]) {
 					found = 1;
 					found = 1;
 					break;
 					break;
 				}
 				}