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