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