Currently we rely on confchg_fn calls into the coroapi to determine the
membership change.  This is unsafe for a variety of reasons.  This patch
changes the sync_init coroapi function so that it takes the member list,
size, and ring id.  From this information a proper synchronization
decision can be made.

Patches for corosync and openais included.

Regards
-steve


Index: include/corosync/engine/coroapi.h
===================================================================
--- include/corosync/engine/coroapi.h	(revision 2303)
+++ include/corosync/engine/coroapi.h	(working copy)
@@ -629,7 +629,10 @@
 		const unsigned int *joined_list, size_t joined_list_entries,
 		const struct memb_ring_id *ring_id);
 	enum cs_sync_mode sync_mode;
-	void (*sync_init) (void);
+	void (*sync_init) (
+		const unsigned int *member_list,
+		size_t member_list_entries,
+		const struct memb_ring_id *ring_id);
 	int (*sync_process) (void);
 	void (*sync_activate) (void);
 	void (*sync_abort) (void);
Index: services/cpg.c
===================================================================
--- services/cpg.c	(revision 2303)
+++ services/cpg.c	(working copy)
@@ -206,7 +206,11 @@
 
 static int cpg_exec_send_joinlist(void);
 
-static void cpg_sync_init (void);
+static void cpg_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
+
 static int  cpg_sync_process (void);
 static void cpg_sync_activate (void);
 static void cpg_sync_abort (void);
@@ -354,7 +358,10 @@
 
 static struct req_exec_cpg_downlist g_req_exec_cpg_downlist;
 
-static void cpg_sync_init (void)
+static void cpg_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 }
 
Index: exec/evil.c
===================================================================
--- exec/evil.c	(revision 2303)
+++ exec/evil.c	(working copy)
@@ -76,7 +76,10 @@
 #include "sync.h"
 #include "evil.h"
 
-static void clm_sync_init (void);
+static void clm_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
 
 static int clm_sync_process (void);
 
@@ -98,7 +101,10 @@
 
 static struct corosync_api_v1 *api = NULL;
 
-static void sync_dummy_init (void)
+static void sync_dummy_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 }
 
@@ -329,7 +335,10 @@
 /*
  * This is a noop for this service
  */
-static void clm_sync_init (void)
+static void clm_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	return;
 }
Index: exec/syncv2.c
===================================================================
--- exec/syncv2.c	(revision 2303)
+++ exec/syncv2.c	(working copy)
@@ -80,7 +80,10 @@
 
 struct service_entry {
 	int service_id;
-	void (*sync_init) (void);
+	void (*sync_init) (
+		const unsigned int *member_list,
+		size_t member_list_entries,
+		const struct memb_ring_id *ring_id);
 	void (*sync_abort) (void);
 	int (*sync_process) (void);
 	void (*sync_activate) (void);
@@ -113,8 +116,12 @@
 
 static hdb_handle_t my_schedwrk_handle;
 
-static struct processor_entry my_processor_list[128];
+static struct processor_entry my_processor_list[PROCESSOR_COUNT_MAX];
 
+static unsigned int my_member_list[PROCESSOR_COUNT_MAX];
+
+static size_t my_member_list_entries = 0;
+
 static int my_processor_list_entries = 0;
 
 static struct service_entry my_service_list[128];
@@ -123,7 +130,7 @@
 
 static const struct memb_ring_id sync_ring_id;
 
-static struct service_entry my_initial_service_list[128];
+static struct service_entry my_initial_service_list[PROCESSOR_COUNT_MAX];
 
 static int my_initial_service_list_entries;
 
@@ -229,7 +236,10 @@
 	}
 }
 
-static void dummy_sync_init (void)
+static void dummy_sync_init (
+	const unsigned int *member_list,
+	unsigned int member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 }
 
@@ -438,7 +448,8 @@
 
 	if (my_service_list[my_processing_idx].state == INIT) {
 		my_service_list[my_processing_idx].state = PROCESS;
-		my_service_list[my_processing_idx].sync_init ();
+		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].state == PROCESS) {
 		my_service_list[my_processing_idx].state = PROCESS;
Index: exec/sync.c
===================================================================
--- exec/sync.c	(revision 2303)
+++ exec/sync.c	(working copy)
@@ -78,7 +78,7 @@
 static int sync_processing = 0;
 
 static void (*sync_next_start) (
-	unsigned int *member_list,
+	const unsigned int *member_list,
 	size_t member_list_entries,
 	const struct memb_ring_id *ring_id);
 
@@ -176,7 +176,7 @@
 
 static void sync_service_init (struct memb_ring_id *ring_id)
 {
-	sync_callbacks.sync_init ();
+	sync_callbacks.sync_init (my_member_list, my_member_list_entries, ring_id);
 	totempg_callback_token_destroy (&sync_callback_token_handle);
 
 	/*
@@ -264,7 +264,7 @@
 		struct sync_callbacks *callbacks),
 
 	void (*next_start) (
-		unsigned int *member_list,
+		const unsigned int *member_list,
 		size_t member_list_entries,
 		const struct memb_ring_id *ring_id))
 {
Index: exec/sync.h
===================================================================
--- exec/sync.h	(revision 2303)
+++ exec/sync.h	(working copy)
@@ -40,7 +40,10 @@
 #include "totemsrp.h"
 
 struct sync_callbacks {
-	void (*sync_init) (void);
+	void (*sync_init) (
+		const unsigned int *member_list,
+		size_t member_list_entries,
+		const struct memb_ring_id *ring_id);
 	int (*sync_process) (void);
 	void (*sync_activate) (void);
 	void (*sync_abort) (void);
@@ -53,7 +56,7 @@
 		struct sync_callbacks *callbacks),
 
 	void (*next_start) (
-		unsigned int *member_list,
+		const unsigned int *member_list,
 		size_t member_list_entries,
 		const struct memb_ring_id *ring_id));
 
Index: services/evt.c
===================================================================
--- services/evt.c	(revision 2003)
+++ services/evt.c	(working copy)
@@ -43,6 +43,9 @@
 #define REMOTE_OP_DEBUG LOGSYS_LEVEL_DEBUG
 #define RETENTION_TIME_DEBUG LOGSYS_LEVEL_DEBUG
 
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
 #include <sys/types.h>
 #include <stdlib.h>
 #include <errno.h>
@@ -130,7 +133,10 @@
 /*
  * Recovery sync functions
  */
-static void evt_sync_init(void);
+static void evt_sync_init(
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
 static int evt_sync_process(void);
 static void evt_sync_activate(void);
 static void evt_sync_abort(void);
@@ -4010,7 +4016,10 @@
  * Set up initial conditions for processing event service
  * recovery.
  */
-static void evt_sync_init(void)
+static void evt_sync_init(
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	SaClmClusterNodeT *cn;
 	struct member_node_data *md;
Index: services/ckpt.c
===================================================================
--- services/ckpt.c	(revision 2003)
+++ services/ckpt.c	(working copy)
@@ -357,7 +357,11 @@
 static void exec_ckpt_sync_checkpoint_refcount_endian_convert (void *msg);
 
 
-static void ckpt_sync_init (void);
+static void ckpt_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
+
 static void ckpt_sync_activate (void);
 static int  ckpt_sync_process (void);
 static void ckpt_sync_abort(void);
@@ -3416,7 +3420,10 @@
 	my_iteration_state_checkpoint_list = checkpoint_list_head.next;
 }
 
-static void ckpt_sync_init (void)
+static void ckpt_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	ENTER();
 
Index: services/amf.c
===================================================================
--- services/amf.c	(revision 2003)
+++ services/amf.c	(working copy)
@@ -230,7 +230,10 @@
 static void message_handler_req_exec_amf_comp_cleanup_tmo(
 	const void *message, unsigned int nodeid);
 static void amf_dump_fn (void);
-static void amf_sync_init (void);
+static void amf_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
 static int amf_sync_process (void);
 static void amf_sync_abort (void);
 static void amf_sync_activate (void);
@@ -1116,7 +1119,10 @@
  * AMF Framework callback implementation                       *
  *****************************************************************************/
 
-static void amf_sync_init (void)
+static void amf_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	SYNCTRACE ("state %s", scsm_state_names[scsm.state]);
 
Index: services/lck.c
===================================================================
--- services/lck.c	(revision 2003)
+++ services/lck.c	(working copy)
@@ -279,7 +279,10 @@
 static void exec_lck_sync_resource_lock_endian_convert (void *msg);
 static void exec_lck_sync_resource_refcount_endian_convert (void *msg);
 
-static void lck_sync_init (void);
+static void lck_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
 static int  lck_sync_process (void);
 static void lck_sync_activate (void);
 static void lck_sync_abort (void);
@@ -1350,7 +1353,10 @@
 	lck_sync_iteration_resource_lock = resource->resource_lock_list_head.next;
 }
 
-static void lck_sync_init (void)
+static void lck_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	/* DEBUG */
 	log_printf (LOGSYS_LEVEL_DEBUG, "[DEBUG]: lck_sync_init\n");
Index: services/clm.c
===================================================================
--- services/clm.c	(revision 2003)
+++ services/clm.c	(working copy)
@@ -131,7 +131,10 @@
 	const unsigned int *joined_list, size_t joined_list_entries,
 	const struct memb_ring_id *ring_id);
 
-static void clm_sync_init (void);
+static void clm_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
 
 static int clm_sync_process (void);
 
@@ -590,7 +593,10 @@
 /*
  * This is a noop for this service
  */
-static void clm_sync_init (void)
+static void clm_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	return;
 }
Index: services/msg.c
===================================================================
--- services/msg.c	(revision 2003)
+++ services/msg.c	(working copy)
@@ -463,7 +463,11 @@
 static struct list_head *msg_sync_iteration_message;
 static struct list_head *msg_sync_iteration_refcount;
 
-static void msg_sync_init (void);
+static void msg_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id);
+
 static int  msg_sync_process (void);
 static void msg_sync_activate (void);
 static void msg_sync_abort (void);
@@ -2261,7 +2265,10 @@
 	msg_sync_iteration_queue = group->queue_head.next; /* ! */
 }
 
-static void msg_sync_init (void)
+static void msg_sync_init (
+	const unsigned int *member_list,
+	size_t member_list_entries,
+	const struct memb_ring_id *ring_id)
 {
 	/* DEBUG */
 	log_printf (LOGSYS_LEVEL_DEBUG, "[DEBUG]: msg_sync_init\n");
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to