great work

good for merge

On Wed, 2010-02-03 at 22:06 +1100, Angus Salkeld wrote:
> Hi
> 
> This fixes Fedora bz506255.
> 
> I have tested with compat=none & compat=whitetank
> 
> Steve I have updated your patch to make allowance for the syncv2 case.
> 
> This depends on: "move sync_v2_init() into main_service_ready".
> 
> -Angus
> 
> Signed-off-by: Angus Salkeld <[email protected]>
> ---
>  exec/evil.c                       |    8 +++--
>  exec/main.c                       |   20 ++++++++++--
>  exec/sync.c                       |   20 ++++++++++--
>  exec/sync.h                       |   16 ++++++++-
>  exec/syncv2.c                     |   63 ++++++++++++++++++++++++++++++------
>  exec/syncv2.h                     |    5 +++
>  include/corosync/engine/coroapi.h |    5 ++-
>  services/cpg.c                    |   16 ++++++---
>  8 files changed, 123 insertions(+), 30 deletions(-)
> 
> diff --git a/exec/evil.c b/exec/evil.c
> index 6d25f9a..9d61c5b 100644
> --- a/exec/evil.c
> +++ b/exec/evil.c
> @@ -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;
> diff --git a/exec/main.c b/exec/main.c
> index 5b50086..beedc2c 100644
> --- a/exec/main.c
> +++ b/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);
>       }
> diff --git a/exec/sync.c b/exec/sync.c
> index cb3c300..ce115a3 100644
> --- a/exec/sync.c
> +++ b/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));
> diff --git a/exec/sync.h b/exec/sync.h
> index b642120..a8071d4 100644
> --- a/exec/sync.h
> +++ b/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);
> diff --git a/exec/syncv2.c b/exec/syncv2.c
> index 3cdf52d..e0521f0 100644
> --- a/exec/syncv2.c
> +++ b/exec/syncv2.c
> @@ -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) {
> diff --git a/exec/syncv2.h b/exec/syncv2.h
> index c383636..91b9aff 100644
> --- a/exec/syncv2.h
> +++ b/exec/syncv2.h
> @@ -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);
> diff --git a/include/corosync/engine/coroapi.h 
> b/include/corosync/engine/coroapi.h
> index 556a568..b3c9777 100644
> --- a/include/corosync/engine/coroapi.h
> +++ b/include/corosync/engine/coroapi.h
> @@ -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 {
> diff --git a/services/cpg.c b/services/cpg.c
> index 59d59b2..68bd1ed 100644
> --- a/services/cpg.c
> +++ b/services/cpg.c
> @@ -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;
>                               }

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to