mirror of
https://git.proxmox.com/git/mirror_corosync
synced 2025-07-16 09:54:03 +00:00
pass transitional members into the sync_init() callbacks.
git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2653 fd59a12c-fef9-0310-b244-a6a79926bd2f
This commit is contained in:
parent
e88aebbac7
commit
c6beee076a
@ -117,16 +117,18 @@ static void deliver_fn_evt_compat (
|
||||
unsigned int endian_conversion_required);
|
||||
|
||||
static struct sync_callbacks clm_sync_operations = {
|
||||
.api_version = 1,
|
||||
.name = "dummy CLM service",
|
||||
.sync_init = clm_sync_init,
|
||||
.sync_init_api.sync_init_v1 = clm_sync_init,
|
||||
.sync_process = clm_sync_process,
|
||||
.sync_activate = clm_sync_activate,
|
||||
.sync_abort = clm_sync_abort,
|
||||
};
|
||||
|
||||
static struct sync_callbacks evt_sync_operations = {
|
||||
.api_version = 1,
|
||||
.name = "dummy EVT service",
|
||||
.sync_init = evt_sync_init,
|
||||
.sync_init_api.sync_init_v1 = evt_sync_init,
|
||||
.sync_process = evt_sync_process,
|
||||
.sync_activate = evt_sync_activate,
|
||||
.sync_abort = evt_sync_abort,
|
||||
@ -212,7 +214,7 @@ extern int evil_callbacks_load (int sync_id,
|
||||
|
||||
}
|
||||
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_activate = sync_dummy_activate;
|
||||
callbacks->sync_abort = sync_dummy_abort;
|
||||
|
20
exec/main.c
20
exec/main.c
@ -274,7 +274,8 @@ static int corosync_sync_callbacks_retrieve (int sync_id,
|
||||
ais_service_index++) {
|
||||
|
||||
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) {
|
||||
break;
|
||||
}
|
||||
@ -288,7 +289,11 @@ static int corosync_sync_callbacks_retrieve (int sync_id,
|
||||
return (res);
|
||||
}
|
||||
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_activate = ais_service[ais_service_index]->sync_activate;
|
||||
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->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_activate = ais_service[service_id]->sync_activate;
|
||||
callbacks->sync_abort = ais_service[service_id]->sync_abort;
|
||||
@ -359,6 +370,9 @@ static void confchg_fn (
|
||||
if (abort_activate) {
|
||||
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) {
|
||||
sync_v2_start (member_list, member_list_entries, ring_id);
|
||||
}
|
||||
|
20
exec/sync.c
20
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_trans_list[PROCESSOR_COUNT_MAX];
|
||||
|
||||
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_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)
|
||||
{
|
||||
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);
|
||||
|
||||
/*
|
||||
@ -227,7 +238,7 @@ static void sync_callbacks_load (void)
|
||||
break;
|
||||
}
|
||||
sync_recovery_index += 1;
|
||||
if (sync_callbacks.sync_init) {
|
||||
if (sync_callbacks.sync_init_api.sync_init_v1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -434,7 +445,7 @@ static void sync_deliver_fn (
|
||||
/*
|
||||
* 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,
|
||||
"Synchronization actions starting for (%s)\n",
|
||||
sync_callbacks.name);
|
||||
@ -460,6 +471,9 @@ static void sync_confchg_fn (
|
||||
sync_ring_id = ring_id;
|
||||
|
||||
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;
|
||||
}
|
||||
memcpy (my_member_list, member_list, member_list_entries * sizeof (unsigned int));
|
||||
|
16
exec/sync.h
16
exec/sync.h
@ -39,11 +39,23 @@
|
||||
#include <corosync/totem/totempg.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,
|
||||
size_t member_list_entries,
|
||||
const struct memb_ring_id *ring_id);
|
||||
};
|
||||
|
||||
struct sync_callbacks {
|
||||
int api_version;
|
||||
union sync_init_api sync_init_api;
|
||||
int (*sync_process) (void);
|
||||
void (*sync_activate) (void);
|
||||
void (*sync_abort) (void);
|
||||
|
@ -81,10 +81,8 @@ enum sync_state {
|
||||
|
||||
struct service_entry {
|
||||
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);
|
||||
int (*sync_process) (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_trans_list[PROCESSOR_COUNT_MAX];
|
||||
|
||||
static size_t my_member_list_entries = 0;
|
||||
|
||||
static size_t my_trans_list_entries = 0;
|
||||
|
||||
static int my_processor_list_entries = 0;
|
||||
|
||||
static struct service_entry my_service_list[128];
|
||||
@ -202,7 +204,7 @@ int sync_v2_init (
|
||||
if (res == -1) {
|
||||
continue;
|
||||
}
|
||||
if (sync_callbacks.sync_init == NULL) {
|
||||
if (sync_callbacks.sync_init_api.sync_init_v1 == NULL) {
|
||||
continue;
|
||||
}
|
||||
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;
|
||||
strcpy (my_initial_service_list[my_initial_service_list_entries].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_abort = sync_callbacks.sync_abort;
|
||||
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,
|
||||
"External Service (id = %d)\n",
|
||||
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;
|
||||
my_service_list[my_service_list_entries].sync_abort =
|
||||
dummy_sync_abort;
|
||||
@ -510,13 +514,39 @@ static void sync_servicelist_build_enter (
|
||||
|
||||
static int schedwrk_processor (const void *context)
|
||||
{
|
||||
int res;
|
||||
int res = 0;
|
||||
|
||||
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_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) {
|
||||
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)
|
||||
{
|
||||
if (my_state == SYNC_PROCESS) {
|
||||
|
@ -48,6 +48,11 @@ extern void sync_v2_start (
|
||||
size_t member_list_entries,
|
||||
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_memb_list_determine (const struct memb_ring_id *ring_id);
|
||||
|
@ -136,8 +136,9 @@ enum cs_flow_control_state {
|
||||
#endif /* COROSYNC_FLOW_CONTROL_STATE */
|
||||
|
||||
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 {
|
||||
|
@ -240,7 +240,9 @@ static int cpg_exec_send_downlist(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,
|
||||
size_t member_list_entries,
|
||||
const struct memb_ring_id *ring_id);
|
||||
@ -329,8 +331,8 @@ struct corosync_service_engine cpg_service_engine = {
|
||||
.exec_dump_fn = NULL,
|
||||
.exec_engine = cpg_exec_engine,
|
||||
.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_activate = cpg_sync_activate,
|
||||
.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 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,
|
||||
size_t member_list_entries,
|
||||
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++) {
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user