Yes, I got BAD_HANDLE during testing. IMM can return BAD_HANDLE at any 
time, and I have created a generic ticket [#1607] for introducing proper 
handling of AIS error codes.

regards,
Anders Widell

On 03/31/2016 03:06 PM, Mathivanan Naickan Palanivelu wrote:
> There's a check for BAD_HANDLE error code for  implementerSet(),
> Do you foresee a new flow where this API can receive a BAD_HANDLE error code?
> Other than that Ack for this patch 1.
>
> Mathi.
>
>> -----Original Message-----
>> From: Anders Widell [mailto:anders.wid...@ericsson.com]
>> Sent: Monday, February 29, 2016 8:39 PM
>> To: Mathivanan Naickan Palanivelu
>> Cc: opensaf-devel@lists.sourceforge.net
>> Subject: [PATCH 1 of 2] clm: Support AMF configurations containing more than
>> two OpenSAF 2N SUs [#79]
>>
>> osaf/services/saf/clmsv/clms/clms.h       |    4 +
>> osaf/services/saf/clmsv/clms/clms_amf.c   |   37 ++--
>> osaf/services/saf/clmsv/clms/clms_cb.h    |    2 +-
>> osaf/services/saf/clmsv/clms/clms_evt.c   |   20 ++-
>> osaf/services/saf/clmsv/clms/clms_imm.c   |  208
>> ++++++++++++++++++++++++-----
>> osaf/services/saf/clmsv/clms/clms_main.c  |  120 +++++++++-------
>> osaf/services/saf/clmsv/clms/clms_mbcsv.c |    8 +-
>> osaf/services/saf/clmsv/clms/clms_mbcsv.h |    7 +-
>> osaf/services/saf/clmsv/clms/clms_ntf.c   |   18 +-
>> osaf/services/saf/clmsv/clms/clms_util.c  |   20 ++-
>> 10 files changed, 322 insertions(+), 122 deletions(-)
>>
>>
>> Add support for configuring the system with more than two OpenSAF 2N SUs.
>> In particular, this means that all OpenSAF directors must support starting up
>> and running without (initially) getting any assignment from AMF. Locking of 
>> an
>> OpenSAF 2N SU is currently not supported on a system configured with more
>> than two OpenSAF 2N SUs.
>>
>> diff --git a/osaf/services/saf/clmsv/clms/clms.h
>> b/osaf/services/saf/clmsv/clms/clms.h
>> --- a/osaf/services/saf/clmsv/clms/clms.h
>> +++ b/osaf/services/saf/clmsv/clms/clms.h
>> @@ -31,6 +31,8 @@
>> #include <string.h>
>> #include <signal.h>
>> #include <time.h>
>> +#include <stdint.h>
>> +#include "saAmf.h"
>>
>> #include <ncsgl_defs.h>
>> #include <ncs_lib.h>
>> @@ -85,6 +87,7 @@ extern CLMS_CB *clms_cb;  extern
>> CLMS_CLUSTER_INFO *osaf_cluster;  extern const SaNameT
>> *clmSvcUsrName;
>>
>> +extern uint32_t initialize_for_assignment(CLMS_CB *cb, SaAmfHAStateT
>> +ha_state);
>> extern uint32_t clms_amf_init(CLMS_CB *);  extern uint32_t
>> clms_mds_init(CLMS_CB * cb);  extern uint32_t clms_cb_init(CLMS_CB *
>> clms_cb); @@ -111,6 +114,7 @@ extern SaAisErrorT clms_plm_init(CLMS_CB
>> #endif  extern void clms_node_add_to_model(CLMS_CLUSTER_NODE *
>> node);  extern SaTimeT clms_get_SaTime(void);
>> +extern SaTimeT clms_get_BootTime(void);
>> extern void clms_imm_impl_set(CLMS_CB * cb);  extern uint32_t
>> clms_rda_init(CLMS_CB * cb);  extern void clms_adminop_pending(void); diff
>> --git a/osaf/services/saf/clmsv/clms/clms_amf.c
>> b/osaf/services/saf/clmsv/clms/clms_amf.c
>> --- a/osaf/services/saf/clmsv/clms/clms_amf.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_amf.c
>> @@ -188,7 +188,8 @@ static void clms_amf_health_chk_callback
>>   * Notes         : None.
>>
>> ***********************************************************
>> ******************/
>> static void clms_amf_csi_set_callback(SaInvocationT invocation,
>> -                                  const SaNameT *compName,
>> SaAmfHAStateT haState, SaAmfCSIDescriptorT csiDescriptor)
>> +    const SaNameT *compName, SaAmfHAStateT new_haState,
>> +    SaAmfCSIDescriptorT csiDescriptor)
>> {
>>      SaAisErrorT error = SA_AIS_OK;
>>      SaAmfHAStateT prev_haState;
>> @@ -202,8 +203,15 @@ static void clms_amf_csi_set_callback(Sa
>>       */
>>      prev_haState = clms_cb->ha_state;
>>
>> +    if ((rc = initialize_for_assignment(clms_cb, new_haState)) !=
>> +            NCSCC_RC_SUCCESS) {
>> +            LOG_ER("initialize_for_assignment FAILED %u", (unsigned)
>> rc);
>> +            error = SA_AIS_ERR_FAILED_OPERATION;
>> +            goto response;
>> +    }
>> +
>>      /* Invoke the appropriate state handler routine */
>> -    switch (haState) {
>> +    switch (new_haState) {
>>      case SA_AMF_HA_ACTIVE:
>>              error = amf_active_state_handler(clms_cb, invocation);
>>              break;
>> @@ -219,7 +227,7 @@ static void clms_amf_csi_set_callback(Sa
>>              error = amf_quiescing_state_handler(clms_cb, invocation);
>>              break;
>>      default:
>> -            LOG_WA("invalid state: %d ", haState);
>> +            LOG_WA("invalid state: %d ", new_haState);
>>              error = SA_AIS_ERR_FAILED_OPERATION;
>>              break;
>>      }
>> @@ -227,44 +235,39 @@ static void clms_amf_csi_set_callback(Sa
>>      if (error != SA_AIS_OK)
>>              goto response;
>>
>> -    if (haState == SA_AMF_HA_QUIESCED) {
>> +    if (new_haState == SA_AMF_HA_QUIESCED) {
>>              /* AMF response will be done later when MDS quiesced ack
>> has been received */
>>              goto done;
>>      }
>>
>>      /* Update control block */
>> -    clms_cb->ha_state = haState;
>> +    clms_cb->ha_state = new_haState;
>>
>> -    if (clms_cb->csi_assigned == false) {
>> -            clms_cb->csi_assigned = true;
>> -            /* We shall open checkpoint only once in our life time.
>> currently doing at lib init  */
>> -    } else if ((haState == SA_AMF_HA_ACTIVE) || (haState ==
>> SA_AMF_HA_STANDBY)) {        /* It is a switch over */
>> +    if (new_haState == SA_AMF_HA_ACTIVE || new_haState ==
>> +SA_AMF_HA_STANDBY) {
>>              clms_cb->ckpt_state = COLD_SYNC_IDLE;
>> -            /* NOTE: This behaviour has to be checked later, when scxb
>> redundancy is available
>> -             * Also, change role of mds, mbcsv during quiesced has to be
>> done after mds
>> -             * supports the same.  TBD
>> -             */
>>      }
>>
>>      /* Handle active to active role change. */
>> -    if ((prev_haState == SA_AMF_HA_ACTIVE) && (haState ==
>> SA_AMF_HA_ACTIVE))
>> +    if ((prev_haState == SA_AMF_HA_ACTIVE) && (new_haState ==
>> +SA_AMF_HA_ACTIVE))
>>              role_change = false;
>>
>>      /* Handle Stby to Stby role change. */
>> -    if ((prev_haState == SA_AMF_HA_STANDBY) && (haState ==
>> SA_AMF_HA_STANDBY))
>> +    if ((prev_haState == SA_AMF_HA_STANDBY) && (new_haState ==
>> +SA_AMF_HA_STANDBY))
>>              role_change = false;
>>
>>      if (role_change == true) {
>>              /* i.e Set up the infrastructure first.
>>               * i.e. Declare yourself as ACTIVE first.
>>               */
>> -            if ((rc = clms_mds_change_role(clms_cb)) !=
>> NCSCC_RC_SUCCESS) {
>> +            if ((rc = clms_mds_change_role(clms_cb)) !=
>> +                    NCSCC_RC_SUCCESS) {
>>                      LOG_ER("clms_mds_change_role FAILED");
>>                      error = SA_AIS_ERR_FAILED_OPERATION;
>>              }
>>
>>              /* Inform MBCSV of HA state change */
>> -            if (NCSCC_RC_SUCCESS != (error =
>> clms_mbcsv_change_HA_state(clms_cb)))
>> +            if (NCSCC_RC_SUCCESS != (error =
>> clms_mbcsv_change_HA_state(
>> +                    clms_cb, new_haState)))
>>                      error = SA_AIS_ERR_FAILED_OPERATION;
>>
>>              if(clms_cb->ha_state == SA_AMF_HA_ACTIVE) { diff --git
>> a/osaf/services/saf/clmsv/clms/clms_cb.h
>> b/osaf/services/saf/clmsv/clms/clms_cb.h
>> --- a/osaf/services/saf/clmsv/clms/clms_cb.h
>> +++ b/osaf/services/saf/clmsv/clms/clms_cb.h
>> @@ -178,7 +178,7 @@ typedef struct clms_cb_t {
>>      SaSelectionObjectT amf_sel_obj; /* AMF provided selection
>> object */
>>      NCS_SEL_OBJ sighdlr_sel_obj;    /* Selection object to handle SIGUSR1
>> */
>>      SaAmfHAStateT ha_state; /* My current AMF HA state */
>> -    bool csi_assigned;
>> +    bool fully_initialized;
>>      NCS_MBCSV_HDL mbcsv_hdl;
>>      SaSelectionObjectT mbcsv_sel_obj;       /* MBCSv Selection Object to
>> maintain a HotStandBy CLMS */
>>      NCS_MBCSV_CKPT_HDL mbcsv_ckpt_hdl;
>> diff --git a/osaf/services/saf/clmsv/clms/clms_evt.c
>> b/osaf/services/saf/clmsv/clms/clms_evt.c
>> --- a/osaf/services/saf/clmsv/clms/clms_evt.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_evt.c
>> @@ -753,11 +753,17 @@ static uint32_t proc_rda_evt(CLMSV_CLMS_
>>      SaAmfHAStateT prev_haState;
>>      bool role_change = true;
>>
>> -    TRACE_ENTER2("%u", evt->info.rda_info.io_role);
>> +    TRACE_ENTER2("%d", (int) evt->info.rda_info.io_role);
>> +    prev_haState = clms_cb->ha_state;
>> +    if ((rc = initialize_for_assignment(clms_cb,
>> +            (SaAmfHAStateT) evt->info.rda_info.io_role))
>> +            != NCSCC_RC_SUCCESS) {
>> +            LOG_ER("initialize_for_assignment FAILED %u", (unsigned)
>> rc);
>> +            exit(EXIT_FAILURE);
>> +    }
>>
>> -    prev_haState = clms_cb->ha_state;
>> -
>> -    if (evt->info.rda_info.io_role == PCS_RDA_ACTIVE) {
>> +    if (evt->info.rda_info.io_role == PCS_RDA_ACTIVE &&
>> +            clms_cb->ha_state != SA_AMF_HA_ACTIVE) {
>>              LOG_NO("ACTIVE request");
>>              clms_cb->mds_role = V_DEST_RL_ACTIVE;
>>              clms_cb->ha_state = SA_AMF_HA_ACTIVE; @@ -780,7 +786,8
>> @@ static uint32_t proc_rda_evt(CLMSV_CLMS_
>>                              goto done;
>>                      }
>>
>> -                    if (NCSCC_RC_SUCCESS !=
>> clms_mbcsv_change_HA_state(clms_cb))
>> +                    if (NCSCC_RC_SUCCESS !=
>> clms_mbcsv_change_HA_state(
>> +                            clms_cb, clms_cb->ha_state))
>>                              goto done;
>>
>>                      /* fail over, become implementer */
>> @@ -1001,7 +1008,8 @@ static uint32_t proc_mds_quiesced_ack_ms
>>              (void)immutil_saImmOiImplementerClear(clms_cb-
>>> immOiHandle);
>>              clms_cb->ha_state = SA_AMF_HA_QUIESCED;
>>              /* Inform MBCSV of HA state change */
>> -            if (clms_mbcsv_change_HA_state(clms_cb) !=
>> NCSCC_RC_SUCCESS)
>> +            if (clms_mbcsv_change_HA_state(clms_cb, clms_cb-
>>> ha_state) !=
>> +                    NCSCC_RC_SUCCESS)
>>                      TRACE("clms_mbcsv_change_HA_state FAILED");
>>
>>              /* Update control block */
>> diff --git a/osaf/services/saf/clmsv/clms/clms_imm.c
>> b/osaf/services/saf/clmsv/clms/clms_imm.c
>> --- a/osaf/services/saf/clmsv/clms/clms_imm.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_imm.c
>> @@ -410,23 +410,92 @@ SaAisErrorT clms_imm_activate(CLMS_CB *c
>>      }
>>
>>      if (clms_cb->ha_state == SA_AMF_HA_ACTIVE) {
>> -            if ((rc = immutil_saImmOiImplementerSet(cb->immOiHandle,
>> IMPLEMENTER_NAME)) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiImplementerSet failed rc:%u", rc);
>> -                    goto done;
>> +            int msecs_waited = 0;
>> +            for (;;) {
>> +                    if (msecs_waited >= max_waiting_time_ms) {
>> +                            LOG_ER("Timeout in clms_imm_activate");
>> +                            goto done;
>> +                    }
>> +
>> +                    rc = immutil_saImmOiImplementerSet(cb-
>>> immOiHandle,
>> +
>> IMPLEMENTER_NAME);
>> +                    if (rc == SA_AIS_ERR_TIMEOUT ||
>> +                        rc == SA_AIS_ERR_BAD_HANDLE) {
>> +                            LOG_WA("saImmOiImplementerSet returned
>> %u",
>> +                                   (unsigned) rc);
>> +                            usleep(sleep_delay_ms * 1000);
>> +                            msecs_waited += sleep_delay_ms;
>> +                            saImmOiFinalize(cb->immOiHandle);
>> +                            cb->immOiHandle = 0;
>> +                            cb->imm_sel_obj = -1;
>> +                            cb->is_impl_set = false;
>> +                            if ((rc = clms_imm_init(clms_cb)) !=
>> +                                NCSCC_RC_SUCCESS) {
>> +                                    LOG_ER("clms_imm_init FAILED");
>> +                                    goto done;
>> +                            }
>> +                            continue;
>> +                    }
>> +                    if (rc != SA_AIS_OK) {
>> +                            LOG_ER("saImmOiImplementerSet failed rc:
>> %u",
>> +                                   (unsigned) rc);
>> +                            goto done;
>> +                    }
>> +
>> +                    rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle,
>> +                                                            "SaClmNode");
>> +                    if (rc == SA_AIS_ERR_TIMEOUT ||
>> +                        rc == SA_AIS_ERR_BAD_HANDLE) {
>> +                            LOG_WA("saImmOiClassImplementerSet
>> returned %u",
>> +                                   (unsigned) rc);
>> +                            usleep(sleep_delay_ms * 1000);
>> +                            msecs_waited += sleep_delay_ms;
>> +                            saImmOiFinalize(cb->immOiHandle);
>> +                            cb->immOiHandle = 0;
>> +                            cb->imm_sel_obj = -1;
>> +                            cb->is_impl_set = false;
>> +                            if ((rc = clms_imm_init(clms_cb)) !=
>> +                                NCSCC_RC_SUCCESS) {
>> +                                    LOG_ER("clms_imm_init FAILED");
>> +                                    goto done;
>> +                            }
>> +                            continue;
>> +                    }
>> +                    if (rc != SA_AIS_OK) {
>> +                            LOG_ER("saImmOiClassImplementerSet failed
>> for "
>> +                                   "class SaClmNode rc: %u", (unsigned) rc);
>> +                            goto done;
>> +                    }
>> +
>> +                    rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle,
>> +
>>      "SaClmCluster");
>> +                    if (rc == SA_AIS_ERR_TIMEOUT ||
>> +                        rc == SA_AIS_ERR_BAD_HANDLE) {
>> +                            LOG_WA("saImmOiClassImplementerSet
>> returned %u",
>> +                                   (unsigned) rc);
>> +                            usleep(sleep_delay_ms * 1000);
>> +                            msecs_waited += sleep_delay_ms;
>> +                            saImmOiFinalize(cb->immOiHandle);
>> +                            cb->immOiHandle = 0;
>> +                            cb->imm_sel_obj = -1;
>> +                            cb->is_impl_set = false;
>> +                            if ((rc = clms_imm_init(clms_cb)) !=
>> +                                NCSCC_RC_SUCCESS) {
>> +                                    LOG_ER("clms_imm_init FAILED");
>> +                                    goto done;
>> +                            }
>> +                            continue;
>> +                    }
>> +                    if (rc != SA_AIS_OK) {
>> +                            LOG_ER("saImmOiClassImplementerSet failed
>> for "
>> +                                   "class SaClmNode rc %u", (unsigned) rc);
>> +                            goto done;
>> +                    }
>> +
>> +                    cb->is_impl_set = true;
>> +                    clms_all_node_rattr_update();
>> +                    break;
>>              }
>> -
>> -            if ((rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle, "SaClmNode")) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiClassImplementerSet failed for
>> class SaClmNode rc:%u", rc);
>> -                    goto done;
>> -            }
>> -
>> -            if ((rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle, "SaClmCluster")) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiClassImplementerSet failed for
>> class SaClmCluster rc:%u", rc);
>> -                    goto done;
>> -            }
>> -
>> -            cb->is_impl_set = true;
>> -            clms_all_node_rattr_update();
>>      }
>>
>>      rc = SA_AIS_OK;
>> @@ -499,6 +568,7 @@ void clms_admin_state_update_rattr(CLMS_
>>
>>              saImmOiFinalize(clms_cb->immOiHandle);
>>              clms_cb->immOiHandle = 0;
>> +            clms_cb->imm_sel_obj = -1;
>>              clms_cb->is_impl_set = false;
>>
>>              /* Initiate IMM reinitializtion in the background */ @@ -590,6
>> +660,7 @@ void clms_node_update_rattr(CLMS_CLUSTER
>>
>>              saImmOiFinalize(clms_cb->immOiHandle);
>>              clms_cb->immOiHandle = 0;
>> +            clms_cb->imm_sel_obj = -1;
>>              clms_cb->is_impl_set = false;
>>
>>              /* Initiate IMM reinitializtion in the background */ @@ -766,6
>> +837,7 @@ void clms_cluster_update_rattr(CLMS_CLUS
>>
>>              saImmOiFinalize(clms_cb->immOiHandle);
>>              clms_cb->immOiHandle = 0;
>> +            clms_cb->imm_sel_obj = -1;
>>              clms_cb->is_impl_set = false;
>>
>>              /* Initiate IMM reinitializtion in the background */ @@ -
>> 2295,33 +2367,99 @@ static void  *clm_imm_reinit_thread(void
>>      CLMS_CB *cb = (CLMS_CB *)_cb;
>>
>>      TRACE_ENTER();
>> -    if ((ais_rc = immutil_saImmOiInitialize_2(&cb->immOiHandle,
>> &callbacks, &immVersion)) != SA_AIS_OK) {
>> -            LOG_ER("saImmOiInitialize_2 failed %u, exiting", ais_rc);
>> -            exit(EXIT_FAILURE);
>> -    }
>> -
>> -    if ((ais_rc = immutil_saImmOiSelectionObjectGet(cb->immOiHandle,
>> &cb->imm_sel_obj)) != SA_AIS_OK) {
>> -            LOG_ER("saImmOiSelectionObjectGet failed %u, exiting",
>> ais_rc);
>> -            exit(EXIT_FAILURE);
>> -    }
>> -
>> -    if (cb->ha_state == SA_AMF_HA_ACTIVE){
>> -            /* Update IMM */
>> -            if ((ais_rc = immutil_saImmOiImplementerSet(cb-
>>> immOiHandle, IMPLEMENTER_NAME)) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiImplementerSet failed rc:%u,
>> exiting", ais_rc);
>> +    int msecs_waited = 0;
>> +    for (;;) {
>> +            if (msecs_waited >= max_waiting_time_ms) {
>> +                    LOG_ER("Timeout in clm_imm_reinit_thread,
>> exiting");
>>                      exit(EXIT_FAILURE);
>>              }
>>
>> -            if ((ais_rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle, "SaClmNode")) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiClassImplementerSet failed for
>> class SaClmNode rc:%u, exiting", ais_rc);
>> +            if ((ais_rc = immutil_saImmOiInitialize_2(&cb->immOiHandle,
>> +                                                      &callbacks,
>> +                                                      &immVersion)) !=
>> +                SA_AIS_OK) {
>> +                    LOG_ER("saImmOiInitialize_2 failed %u, exiting",
>> +                           ais_rc);
>>                      exit(EXIT_FAILURE);
>>              }
>>
>> -            if ((ais_rc = immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle, "SaClmCluster")) != SA_AIS_OK) {
>> -                    LOG_ER("saImmOiClassImplementerSet failed for
>> class SaClmCluster rc:%u, exiting", ais_rc);
>> +            if ((ais_rc = immutil_saImmOiSelectionObjectGet(cb-
>>> immOiHandle,
>> +                                                            &cb->
>> +                                                            imm_sel_obj))
>> !=
>> +                SA_AIS_OK) {
>> +                    LOG_ER("saImmOiSelectionObjectGet failed %u,
>> exiting",
>> +                           ais_rc);
>>                      exit(EXIT_FAILURE);
>>              }
>> -            cb->is_impl_set = true;
>> +
>> +            if (cb->ha_state == SA_AMF_HA_ACTIVE) {
>> +                    /* Update IMM */
>> +                    if ((ais_rc =
>> +                         immutil_saImmOiImplementerSet(cb-
>>> immOiHandle,
>> +
>> IMPLEMENTER_NAME)) !=
>> +                        SA_AIS_OK) {
>> +                            if (ais_rc == SA_AIS_ERR_TIMEOUT) {
>> +                                    LOG_WA("saImmOiImplementerSet
>> returned "
>> +                                           "%u", (unsigned) ais_rc);
>> +                                    usleep(sleep_delay_ms * 1000);
>> +                                    msecs_waited += sleep_delay_ms;
>> +                                    saImmOiFinalize(cb->immOiHandle);
>> +                                    cb->immOiHandle = 0;
>> +                                    cb->imm_sel_obj = -1;
>> +                                    cb->is_impl_set = false;
>> +                                    continue;
>> +                            }
>> +                            LOG_ER("saImmOiImplementerSet failed rc:
>> %u, "
>> +                                   "exiting", (unsigned) ais_rc);
>> +                            exit(EXIT_FAILURE);
>> +                    }
>> +
>> +                    if ((ais_rc =
>> +                         immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle,
>> +
>>      "SaClmNode")) !=
>> +                        SA_AIS_OK) {
>> +                            if (ais_rc == SA_AIS_ERR_TIMEOUT) {
>> +
>>      LOG_WA("saImmOiClassImplementerSet "
>> +                                           "returned %u",
>> +                                           (unsigned) ais_rc);
>> +                                    usleep(sleep_delay_ms * 1000);
>> +                                    msecs_waited += sleep_delay_ms;
>> +                                    saImmOiFinalize(cb->immOiHandle);
>> +                                    cb->immOiHandle = 0;
>> +                                    cb->imm_sel_obj = -1;
>> +                                    cb->is_impl_set = false;
>> +                                    continue;
>> +                            }
>> +                            LOG_ER("saImmOiClassImplementerSet failed
>> for "
>> +                                   "class SaClmNode rc: %u, exiting",
>> +                                   (unsigned) ais_rc);
>> +                            exit(EXIT_FAILURE);
>> +                    }
>> +
>> +                    if ((ais_rc =
>> +                         immutil_saImmOiClassImplementerSet(cb-
>>> immOiHandle,
>> +
>>      "SaClmCluster"))
>> +                        != SA_AIS_OK) {
>> +                            if (ais_rc == SA_AIS_ERR_TIMEOUT) {
>> +
>>      LOG_WA("saImmOiClassImplementerSet "
>> +                                           "returned %u",
>> +                                           (unsigned) ais_rc);
>> +                                    usleep(sleep_delay_ms * 1000);
>> +                                    msecs_waited += sleep_delay_ms;
>> +                                    saImmOiFinalize(cb->immOiHandle);
>> +                                    cb->immOiHandle = 0;
>> +                                    cb->imm_sel_obj = -1;
>> +                                    cb->is_impl_set = false;
>> +                                    continue;
>> +                            }
>> +                            LOG_ER("saImmOiClassImplementerSet failed
>> for "
>> +                                   "class SaClmCluster rc: %u, exiting",
>> +                                   (unsigned) ais_rc);
>> +                            exit(EXIT_FAILURE);
>> +                    }
>> +                    cb->is_impl_set = true;
>> +            }
>> +            break;
>>      }
>>
>>      TRACE_LEAVE();
>> diff --git a/osaf/services/saf/clmsv/clms/clms_main.c
>> b/osaf/services/saf/clmsv/clms/clms_main.c
>> --- a/osaf/services/saf/clmsv/clms/clms_main.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_main.c
>> @@ -174,11 +174,11 @@ static uint32_t clms_self_node_info(void
>>      if (node->admin_state == SA_CLM_ADMIN_UNLOCKED) {
>>              node->member = SA_TRUE;
>>              ++(osaf_cluster->num_nodes);
>> -            node->boot_time = clms_get_SaTime();
>> +            node->boot_time = clms_get_BootTime();
>> #ifdef ENABLE_AIS_PLM
>>              node->ee_red_state = SA_PLM_READINESS_IN_SERVICE;
>>      /*TBD : changed when plm scripts are added to rc scripts */
>> #endif
>> -            osaf_cluster->init_time = node->boot_time;
>> +            osaf_cluster->init_time = clms_get_SaTime();
>>      }
>>      rc = NCSCC_RC_SUCCESS;
>>   done:
>> @@ -221,7 +221,7 @@ uint32_t clms_cb_init(CLMS_CB * clms_cb)
>>      osaf_cluster = NULL;
>>      clms_cb->reg_with_plm = SA_FALSE;
>>      clms_cb->cluster_view_num = 0;
>> -    clms_cb->csi_assigned = false;
>> +    clms_cb->fully_initialized = false;
>>      clms_cb->curr_invid = 1;
>>      clms_cb->immOiHandle = 0;
>>      clms_cb->is_impl_set = false;
>> @@ -252,6 +252,12 @@ uint32_t clms_cb_init(CLMS_CB * clms_cb)
>>      clms_cb->clm_ver.releaseCode = CLM_RELEASE_CODE;
>>      clms_cb->clm_ver.majorVersion = CLM_MAJOR_VERSION_4;
>>      clms_cb->clm_ver.minorVersion = CLM_MINOR_VERSION;
>> +    clms_cb->amf_sel_obj = -1;
>> +    clms_cb->sighdlr_sel_obj.raise_obj = -1;
>> +    clms_cb->sighdlr_sel_obj.rmv_obj = -1;
>> +    clms_cb->mbcsv_sel_obj = -1;
>> +    clms_cb->imm_sel_obj = -1;
>> +    clms_cb->plm_sel_obj = -1;
>>
>>      /* Initialize patricia tree for reg list */
>>      if (NCSCC_RC_SUCCESS != ncs_patricia_tree_init(&clms_cb-
>>> client_db, &client_param)) @@ -326,18 +332,63 @@ static uint32_t
>> clms_init(void)
>>              goto done;
>>      }
>>
>> -    /*Initialize mds */
>> -    if ((rc = clms_mds_init(clms_cb)) != NCSCC_RC_SUCCESS) {
>> +    /* Create a selection object */
>> +    if (clms_cb->nid_started &&
>> +            (rc = ncs_sel_obj_create(&usr1_sel_obj)) !=
>> NCSCC_RC_SUCCESS) {
>> +            LOG_ER("ncs_sel_obj_create failed");
>> +            goto done;
>> +    }
>> +
>> +    /*
>> +     ** Initialize a signal handler that will use the selection object.
>> +     ** The signal is sent from our script when AMF does instantiate.
>> +     */
>> +    if (clms_cb->nid_started &&
>> +            signal(SIGUSR1, sigusr1_handler) == SIG_ERR) {
>> +            LOG_ER("signal USR1 failed: %s", strerror(errno));
>> +            goto done;
>> +    }
>> +
>> +    if (!clms_cb->nid_started &&
>> +            clms_amf_init(clms_cb) != NCSCC_RC_SUCCESS) {
>> +            LOG_ER("AMF Initialization failed");
>> +            goto done;
>> +    }
>> +
>> +    if ((rc = initialize_for_assignment(clms_cb, clms_cb->ha_state)) !=
>> +            NCSCC_RC_SUCCESS) {
>> +            LOG_ER("initialize_for_assignment FAILED %u", (unsigned)
>> rc);
>> +            goto done;
>> +    }
>> +
>> +    rc = NCSCC_RC_SUCCESS;
>> +
>> + done:
>> +    if (clms_cb->nid_started &&
>> +            nid_notify("CLMD", rc, NULL) != NCSCC_RC_SUCCESS) {
>> +            LOG_ER("nid_notify failed");
>> +            rc = NCSCC_RC_FAILURE;
>> +    }
>> +
>> +    TRACE_LEAVE();
>> +    return rc;
>> +}
>> +
>> +uint32_t initialize_for_assignment(CLMS_CB *cb, SaAmfHAStateT ha_state)
>> +{
>> +    TRACE_ENTER2("ha_state = %d", (int) ha_state);
>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>> +    if (cb->fully_initialized || ha_state == SA_AMF_HA_QUIESCED) goto
>> done;
>> +    cb->ha_state = ha_state;
>> +    if ((rc = clms_mds_init(cb)) != NCSCC_RC_SUCCESS) {
>>              LOG_ER("clms_mds_init FAILED %d", rc);
>>              goto done;
>>      }
>> -
>> -    /* Initialize with MBCSV */
>> -    if ((rc = clms_mbcsv_init(clms_cb)) != NCSCC_RC_SUCCESS) {
>> +    if ((rc = clms_mbcsv_init(cb, ha_state)) != NCSCC_RC_SUCCESS) {
>>              LOG_ER("clms_mbcsv_init FAILED");
>> +            clms_mds_finalize(cb);
>>              goto done;
>>      }
>> -
>>      /* Initialize with IMMSv */
>>      if ((rc = clms_imm_init(clms_cb)) != NCSCC_RC_SUCCESS) {
>>              LOG_ER("clms_imm_init FAILED");
>> @@ -366,44 +417,14 @@ static uint32_t clms_init(void)
>>      if ((rc = clms_self_node_info()) != NCSCC_RC_SUCCESS)
>>              goto done;
>>
>> -    /* Create a selection object */
>> -    if (clms_cb->nid_started &&
>> -            (rc = ncs_sel_obj_create(&usr1_sel_obj)) !=
>> NCSCC_RC_SUCCESS) {
>> -            LOG_ER("ncs_sel_obj_create failed");
>> -            goto done;
>> -    }
>> -
>> -    /*
>> -     ** Initialize a signal handler that will use the selection object.
>> -     ** The signal is sent from our script when AMF does instantiate.
>> -     */
>> -    if (clms_cb->nid_started &&
>> -            signal(SIGUSR1, sigusr1_handler) == SIG_ERR) {
>> -            LOG_ER("signal USR1 failed: %s", strerror(errno));
>> -            goto done;
>> -    }
>> -
>> -    if (!clms_cb->nid_started &&
>> -            clms_amf_init(clms_cb) != NCSCC_RC_SUCCESS) {
>> -            LOG_ER("AMF Initialization failed");
>> -            goto done;
>> -    }
>> -
>>      /* Initialize with saflog. This is necessary to avoid
>>       *  getting blocked by LOG during role change (switchover/failover)
>>       */
>>      saflog_init();
>>
>> -    rc = NCSCC_RC_SUCCESS;
>> -
>> - done:
>> -    if (clms_cb->nid_started &&
>> -            nid_notify("CLMD", rc, NULL) != NCSCC_RC_SUCCESS) {
>> -            LOG_ER("nid_notify failed");
>> -            rc = NCSCC_RC_FAILURE;
>> -    }
>> -
>> -    TRACE_LEAVE();
>> +    cb->fully_initialized = true;
>> +done:
>> +    TRACE_LEAVE2("rc = %u", rc);
>>      return rc;
>> }
>>
>> @@ -439,20 +460,16 @@ int main(int argc, char *argv[])
>>      fds[FD_AMF].fd = clms_cb->nid_started ?
>>              usr1_sel_obj.rmv_obj : clms_cb->amf_sel_obj;
>>      fds[FD_AMF].events = POLLIN;
>> -    fds[FD_MBCSV].fd = clms_cb->mbcsv_sel_obj;
>> -    fds[FD_MBCSV].events = POLLIN;
>>      fds[FD_MBX].fd = mbx_fd.rmv_obj;
>>      fds[FD_MBX].events = POLLIN;
>> -    fds[FD_IMM].fd = clms_cb->imm_sel_obj;
>> -    fds[FD_IMM].events = POLLIN;
>> -
>> +    while (1) {
>> +            fds[FD_MBCSV].fd = clms_cb->mbcsv_sel_obj;
>> +            fds[FD_MBCSV].events = POLLIN;
>> #ifdef ENABLE_AIS_PLM
>> -    fds[FD_PLM].fd = clms_cb->plm_sel_obj;
>> -    fds[FD_PLM].events = POLLIN;
>> +            fds[FD_PLM].fd = clms_cb->plm_sel_obj;
>> +            fds[FD_PLM].events = POLLIN;
>> #endif
>>
>> -    while (1) {
>> -
>>              if (clms_cb->rtu_pending == true) {
>>                      TRACE("There is an IMM task to be tried again. setting
>> poll time out to 500");
>>                      timeout = 500;
>> @@ -550,6 +567,7 @@ int main(int argc, char *argv[])
>>                                       */
>>                                      saImmOiFinalize(clms_cb-
>>> immOiHandle);
>>                                      clms_cb->immOiHandle = 0;
>> +                                    clms_cb->imm_sel_obj = -1;
>>                                      clms_cb->is_impl_set = false;
>>
>>                                      /* Initiate IMM reinitializtion in the
>> background */ diff --git a/osaf/services/saf/clmsv/clms/clms_mbcsv.c
>> b/osaf/services/saf/clmsv/clms/clms_mbcsv.c
>> --- a/osaf/services/saf/clmsv/clms/clms_mbcsv.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_mbcsv.c
>> @@ -557,7 +557,7 @@ static uint32_t process_ckpt_data(CLMS_C
>>   *
>>   * Notes         : None.
>>
>> ***********************************************************
>> ******************/
>> -uint32_t clms_mbcsv_init(CLMS_CB * cb)
>> +uint32_t clms_mbcsv_init(CLMS_CB * cb, SaAmfHAStateT ha_state)
>> {
>>      uint32_t rc;
>>      NCS_MBCSV_ARG arg;
>> @@ -613,7 +613,7 @@ uint32_t clms_mbcsv_init(CLMS_CB * cb)
>>              goto done;
>>      }
>>
>> -    rc = clms_mbcsv_change_HA_state(cb);
>> +    rc = clms_mbcsv_change_HA_state(cb, ha_state);
>>
>>      /* Set MBCSV role here itself */
>>   done:
>> @@ -636,7 +636,7 @@ uint32_t clms_mbcsv_init(CLMS_CB * cb)
>>   *                 during the first CSI assignment from AVSv  .
>>
>> ***********************************************************
>> ******************/
>>
>> -uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb)
>> +uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb, SaAmfHAStateT
>> +ha_state)
>> {
>>      NCS_MBCSV_ARG mbcsv_arg;
>>      uint32_t rc = SA_AIS_OK;
>> @@ -647,7 +647,7 @@ uint32_t clms_mbcsv_change_HA_state(CLMS
>>      mbcsv_arg.i_op = NCS_MBCSV_OP_CHG_ROLE;
>>      mbcsv_arg.i_mbcsv_hdl = cb->mbcsv_hdl;
>>      mbcsv_arg.info.chg_role.i_ckpt_hdl = cb->mbcsv_ckpt_hdl;
>> -    mbcsv_arg.info.chg_role.i_ha_state = cb->ha_state;
>> +    mbcsv_arg.info.chg_role.i_ha_state = ha_state;
>>
>>      if (SA_AIS_OK != (rc = ncs_mbcsv_svc(&mbcsv_arg))) {
>>              LOG_ER("ncs_mbcsv_svc FAILED");
>> diff --git a/osaf/services/saf/clmsv/clms/clms_mbcsv.h
>> b/osaf/services/saf/clmsv/clms/clms_mbcsv.h
>> --- a/osaf/services/saf/clmsv/clms/clms_mbcsv.h
>> +++ b/osaf/services/saf/clmsv/clms/clms_mbcsv.h
>> @@ -18,6 +18,9 @@
>> #ifndef CLMSV_CKPT_H
>> #define CLMSV_CKPT_H
>>
>> +#include <stdint.h>
>> +#include "saAmf.h"
>> +
>> #define CLMS_MBCSV_VERSION 1
>> #define CLMS_MBCSV_VERSION_MIN 1
>>
>> @@ -152,12 +155,12 @@ typedef struct clms_ckpt_rec_t {  } CLMS_CKPT_REC;
>>
>> typedef uint32_t (*CLMS_CKPT_HDLR) (CLMS_CB * cb, CLMS_CKPT_REC *
>> data); -extern uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb);
>> +extern uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb,
>> SaAmfHAStateT
>> +ha_state);
>> extern uint32_t clms_send_async_update(CLMS_CB * cb, CLMS_CKPT_REC *
>> ckpt_rec, uint32_t action);  extern void
>> prepare_ckpt_node(CLMSV_CKPT_NODE * node, CLMS_CLUSTER_NODE *
>> cluster_node);  extern void prepare_cluster_node(CLMS_CLUSTER_NODE *
>> node, CLMSV_CKPT_NODE * cluster_node);  extern void
>> prepare_ckpt_config_node(CLMSV_CKPT_NODE_CONFIG_REC * node,
>> CLMS_CLUSTER_NODE * cluster_node); -extern uint32_t
>> clms_mbcsv_init(CLMS_CB * cb);
>> +extern uint32_t clms_mbcsv_init(CLMS_CB * cb, SaAmfHAStateT ha_state);
>> extern uint32_t clms_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl);  extern
>> void prepare_ckpt_to_ckpt_node(CLMSV_CKPT_NODE * node,
>> CLMSV_CKPT_NODE * cluster_node);  extern void
>> prepare_ckpt_to_ckpt_config_node(CLMSV_CKPT_NODE_CONFIG_REC *
>> node, diff --git a/osaf/services/saf/clmsv/clms/clms_ntf.c
>> b/osaf/services/saf/clmsv/clms/clms_ntf.c
>> --- a/osaf/services/saf/clmsv/clms/clms_ntf.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_ntf.c
>> @@ -16,6 +16,7 @@
>>   */
>>
>> #include "clms.h"
>> +#include "osaf_time.h"
>>
>> #define ADDITION_TEXT_LENGTH 256
>> #define CLMS_NTF_SENDER "safApp=safClmService"
>> @@ -270,14 +271,21 @@ void clms_node_admin_state_change_ntf(CL
>>
>> SaAisErrorT clms_ntf_init(CLMS_CB * cb)  {
>> -
>> -    SaAisErrorT rc = SA_AIS_OK;
>> -    SaVersionT ntfVersion = { 'A', 0x01, 0x01 };
>> +    SaAisErrorT rc = SA_AIS_ERR_TRY_AGAIN;
>>
>>      TRACE_ENTER();
>>
>> -    rc = saNtfInitialize(&cb->ntf_hdl, NULL, &ntfVersion);
>> -    TRACE("saNtfInitialize rc value %u", rc);
>> +    while (rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_TIMEOUT)
>> {
>> +            SaVersionT ntfVersion = { 'A', 0x01, 0x01 };
>> +            rc = saNtfInitialize(&cb->ntf_hdl, NULL, &ntfVersion);
>> +            TRACE("saNtfInitialize rc value %u", rc);
>> +            if (rc == SA_AIS_ERR_TIMEOUT) {
>> +                    LOG_WA("saNtfInitialize returned
>> SA_AIS_ERR_TIMEOUT");
>> +            }
>> +            if (rc == SA_AIS_ERR_TRY_AGAIN || rc ==
>> SA_AIS_ERR_TIMEOUT) {
>> +                    osaf_nanosleep(&kHundredMilliseconds);
>> +            }
>> +    }
>>      if (rc != SA_AIS_OK) {
>>              LOG_ER("saNtfInitialize Failed (%u)", rc);
>>      }
>> diff --git a/osaf/services/saf/clmsv/clms/clms_util.c
>> b/osaf/services/saf/clmsv/clms/clms_util.c
>> --- a/osaf/services/saf/clmsv/clms/clms_util.c
>> +++ b/osaf/services/saf/clmsv/clms/clms_util.c
>> @@ -16,6 +16,7 @@
>>   */
>>
>> #include "clms.h"
>> +#include "osaf_time.h"
>>
>> static const SaNameT _clmSvcUsrName = {
>>      .value = "safApp=safClmService",
>> @@ -261,7 +262,24 @@ uint32_t clms_node_delete(CLMS_CLUSTER_N  */
>> SaTimeT clms_get_SaTime(void)  {
>> -    return time(NULL) * SA_TIME_ONE_SECOND;
>> +    struct timespec realtime;
>> +    osaf_clock_gettime(CLOCK_REALTIME, &realtime);
>> +    return osaf_timespec_to_nanos(&realtime);
>> +}
>> +
>> +SaTimeT clms_get_BootTime(void)
>> +{
>> +    struct timespec monotonic;
>> +    struct timespec realtime;
>> +    struct timespec boottime;
>> +    osaf_clock_gettime(CLOCK_MONOTONIC, &monotonic);
>> +    osaf_clock_gettime(CLOCK_REALTIME, &realtime);
>> +    if (osaf_timespec_compare(&realtime, &monotonic) >= 0) {
>> +            osaf_timespec_subtract(&realtime, &monotonic, &boottime);
>> +    } else {
>> +            boottime = realtime;
>> +    }
>> +    return osaf_timespec_to_nanos(&boottime);
>> }
>>
>> /**


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to