Hi Anders,

Please find some comments and queries inline with [Praveen]

Thanks,
Praveen


On 29-Feb-16 8:44 PM, Anders Widell wrote:
>   osaf/services/saf/amf/amfd/clm.cc         |  21 +++++-
>   osaf/services/saf/amf/amfd/include/amfd.h |   2 +
>   osaf/services/saf/amf/amfd/include/cb.h   |   1 +
>   osaf/services/saf/amf/amfd/include/role.h |   2 +
>   osaf/services/saf/amf/amfd/main.cc        |  78 ++++++---------------------
>   osaf/services/saf/amf/amfd/ndfsm.cc       |   9 ++-
>   osaf/services/saf/amf/amfd/node.cc        |   7 +--
>   osaf/services/saf/amf/amfd/role.cc        |  86 
> ++++++++++++++++++++++++++++++-
>   osaf/services/saf/amf/amfd/sgproc.cc      |  11 +++-
>   osaf/services/saf/amf/amfnd/clm.cc        |  27 ++++++--
>   10 files changed, 160 insertions(+), 84 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.
[Praveen] This patch does not contain any change for any restricton on 
locking of OpenSAF 2N SU as mentioned above.
>
> diff --git a/osaf/services/saf/amf/amfd/clm.cc 
> b/osaf/services/saf/amf/amfd/clm.cc
> --- a/osaf/services/saf/amf/amfd/clm.cc
> +++ b/osaf/services/saf/amf/amfd/clm.cc
> @@ -21,8 +21,7 @@
>   #include <amfd.h>
>   #include <clm.h>
>   #include <node.h>
> -
> -static SaVersionT clmVersion = { 'B', 4, 1 };
> +#include "osaf_time.h"
>
>   static void clm_node_join_complete(AVD_AVND *node)
>   {
> @@ -392,9 +391,21 @@ SaAisErrorT avd_clm_init(void)
>           SaAisErrorT error = SA_AIS_OK;
>
>       TRACE_ENTER();
> -     error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
> &clmVersion);
> -     if (SA_AIS_OK != error) {
> -             LOG_ER("Failed to initialize with CLM %u", error);
> +     for (;;) {
> +             SaVersionT Version = { 'B', 4, 1 };
> +             error = saClmInitialize_4(&avd_cb->clmHandle, &clm_callbacks, 
> &Version);
> +             if (error == SA_AIS_ERR_TRY_AGAIN ||
> +                 error == SA_AIS_ERR_TIMEOUT ||
> +                    error == SA_AIS_ERR_UNAVAILABLE) {
> +                     if (error != SA_AIS_ERR_TRY_AGAIN) {
> +                             LOG_WA("saClmInitialize_4 returned %u",
> +                                    (unsigned) error);
> +                     }
> +                     osaf_nanosleep(&kHundredMilliseconds);
> +                     continue;
> +             }
> +             if (error == SA_AIS_OK) break;
> +             LOG_ER("Failed to Initialize with CLM: %u", error);
>               goto done;
>       }
>       error = saClmSelectionObjectGet(avd_cb->clmHandle, 
> &avd_cb->clm_sel_obj);
> diff --git a/osaf/services/saf/amf/amfd/include/amfd.h 
> b/osaf/services/saf/amf/amfd/include/amfd.h
> --- a/osaf/services/saf/amf/amfd/include/amfd.h
> +++ b/osaf/services/saf/amf/amfd/include/amfd.h
> @@ -33,6 +33,7 @@
>   #ifndef AVD_H
>   #define AVD_H
>
> +#include <stdint.h>
>   #include "logtrace.h"
>
>   #include "amf.h"
> @@ -65,5 +66,6 @@
>   #include "ckpt_msg.h"
>   #include "ckpt_edu.h"
>   #include "ckpt_updt.h"
> +#include "saAmf.h"
>
>   #endif
> diff --git a/osaf/services/saf/amf/amfd/include/cb.h 
> b/osaf/services/saf/amf/amfd/include/cb.h
> --- a/osaf/services/saf/amf/amfd/include/cb.h
> +++ b/osaf/services/saf/amf/amfd/include/cb.h
> @@ -207,6 +207,7 @@ typedef struct cl_cb_tag {
>       SaClmHandleT clmHandle;
>       SaSelectionObjectT clm_sel_obj;
>
> +     bool fully_initialized;
>       bool swap_switch; /* true - In middle of role switch. */
>
>       /** true when active services (IMM, LOG, NTF, etc.) exist
> diff --git a/osaf/services/saf/amf/amfd/include/role.h 
> b/osaf/services/saf/amf/amfd/include/role.h
> --- a/osaf/services/saf/amf/amfd/include/role.h
> +++ b/osaf/services/saf/amf/amfd/include/role.h
> @@ -34,6 +34,8 @@ extern uint32_t amfd_switch_qsd_stdby(AV
>   extern uint32_t amfd_switch_stdby_actv(AVD_CL_CB *cb);
>   extern uint32_t amfd_switch_qsd_actv(AVD_CL_CB *cb);
>   extern uint32_t amfd_switch_actv_qsd(AVD_CL_CB *cb);
> +extern uint32_t initialize_for_assignment(cl_cb_tag* cb,
> +                                          SaAmfHAStateT ha_state);
>
>   #endif /* ROLE_H */
>
> diff --git a/osaf/services/saf/amf/amfd/main.cc 
> b/osaf/services/saf/amf/amfd/main.cc
> --- a/osaf/services/saf/amf/amfd/main.cc
> +++ b/osaf/services/saf/amf/amfd/main.cc
> @@ -56,6 +56,7 @@
>   #include <sutcomptype.h>
>   #include <sutype.h>
>   #include <su.h>
> +#include "osaf_utility.h"
>
>   static const char* internal_version_id_  __attribute__ ((used)) = "@(#) 
> $Id: " INTERNAL_VERSION_ID " $";
>
> @@ -445,7 +446,8 @@ static void rda_cb(uint32_t notused, PCS
>
>       if (((avd_cb->avail_state_avd == SA_AMF_HA_STANDBY) ||
>            (avd_cb->avail_state_avd == SA_AMF_HA_QUIESCED)) &&
> -         (cb_info->info.io_role == PCS_RDA_ACTIVE)) {
> +         (cb_info->info.io_role == PCS_RDA_ACTIVE ||
> +             cb_info->info.io_role == PCS_RDA_STANDBY)) {
>
>               uint32_t rc;
>               AVD_EVT *evt;
> @@ -474,7 +476,6 @@ static uint32_t initialize(void)
>   {
>       AVD_CL_CB *cb = avd_cb;
>       int rc = NCSCC_RC_FAILURE;
> -     SaVersionT ntfVersion = { 'A', 0x01, 0x01 };
>       SaAmfHAStateT role;
>       char *val;
>
> @@ -524,8 +525,13 @@ static uint32_t initialize(void)
>       }
>
>       cb->init_state = AVD_INIT_BGN;
> +     cb->mbcsv_sel_obj = -1;
> +     cb->imm_sel_obj = -1;
> +     cb->clm_sel_obj = -1;
> +     cb->fully_initialized = false;
>       cb->swap_switch = false;
>       cb->active_services_exist = true;
> +     cb->mbcsv_sel_obj = -1;
[Praveen] Duplicate initialization, already done above.
>       cb->stby_sync_state = AVD_STBY_IN_SYNC;
>       cb->sync_required = true;
>       
> @@ -544,67 +550,20 @@ static uint32_t initialize(void)
>       /* get the node id of the node on which the AVD is running. */
>       cb->node_id_avd = m_NCS_GET_NODE_ID;
>
> -     if (avd_mds_init(cb) != NCSCC_RC_SUCCESS) {
> -             LOG_ER("avd_mds_init FAILED");
> -             goto done;
> -     }
> -
> -     if (NCSCC_RC_FAILURE == avsv_mbcsv_register(cb)) {
> -             LOG_ER("avsv_mbcsv_register FAILED");
> -             goto done;
> -     }
> -
> -     if (avd_clm_init() != SA_AIS_OK) {
> -             LOG_EM("avd_clm_init FAILED");
> -             goto done;
> -     }
> -
> -     if (avd_imm_init(cb) != SA_AIS_OK) {
> -             LOG_ER("avd_imm_init FAILED");
> -             goto done;
> -     }
> -
> -     if ((rc = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) != 
> SA_AIS_OK) {
> -             LOG_ER("saNtfInitialize Failed (%u)", rc);
> -             rc = NCSCC_RC_FAILURE;
> -             goto done;
> -     }
> -
>       if ((rc = rda_get_role(&role)) != NCSCC_RC_SUCCESS) {
>               LOG_ER("rda_get_role FAILED");
>               goto done;
>       }
>
> -     cb->avail_state_avd = role;
> -
> -     if (NCSCC_RC_SUCCESS != avd_mds_set_vdest_role(cb, role)) {
> -             LOG_ER("avd_mds_set_vdest_role FAILED");
> -             goto done;
> -     }
> -
> -     if (NCSCC_RC_SUCCESS != avsv_set_ckpt_role(cb, role)) {
> -             LOG_ER("avsv_set_ckpt_role FAILED");
> -             goto done;
> -     }
> -
>       if ((rc = rda_register_callback(0, rda_cb)) != NCSCC_RC_SUCCESS) {
>               LOG_ER("rda_register_callback FAILED %u", rc);
>               goto done;
>       }
>
> -     if (role == SA_AMF_HA_ACTIVE) {
> -             rc = avd_active_role_initialization(cb, role);
> -             if (rc != NCSCC_RC_SUCCESS) {
> -                     LOG_ER("avd_active_role_initialization FAILED");
> -                     goto done;
> -             }
> -     }
> -     else {
> -             rc = avd_standby_role_initialization(cb);
> -             if (rc != NCSCC_RC_SUCCESS) {
> -                     LOG_ER("avd_standby_role_initialization FAILED");
> -                     goto done;
> -             }
> +     if ((rc = initialize_for_assignment(cb, role))
> +             != NCSCC_RC_SUCCESS) {
> +             LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
> +             goto done;
>       }
>
>       rc = NCSCC_RC_SUCCESS;
> @@ -647,14 +606,13 @@ static void main_loop(void)
>       fds[FD_TERM].events = POLLIN;
>       fds[FD_MBX].fd = mbx_fd.rmv_obj;
>       fds[FD_MBX].events = POLLIN;
> -     fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
> -     fds[FD_MBCSV].events = POLLIN;
> -     fds[FD_CLM].fd = cb->clm_sel_obj;
> -     fds[FD_CLM].events = POLLIN;
> -     fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in array
> -     fds[FD_IMM].events = POLLIN;
> -
>       while (1) {
> +             fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
> +             fds[FD_MBCSV].events = POLLIN;
> +             fds[FD_CLM].fd = cb->clm_sel_obj;
> +             fds[FD_CLM].events = POLLIN;
> +             fds[FD_IMM].fd = cb->imm_sel_obj; // IMM fd must be last in 
> array
> +             fds[FD_IMM].events = POLLIN;
>               
>               if (cb->immOiHandle != 0) {
>                       fds[FD_IMM].fd = cb->imm_sel_obj;
> diff --git a/osaf/services/saf/amf/amfd/ndfsm.cc 
> b/osaf/services/saf/amf/amfd/ndfsm.cc
> --- a/osaf/services/saf/amf/amfd/ndfsm.cc
> +++ b/osaf/services/saf/amf/amfd/ndfsm.cc
> @@ -190,8 +190,9 @@ void avd_nd_ncs_su_assigned(AVD_CL_CB *c
>       TRACE_ENTER();
>
>       for (const auto& ncs_su : avnd->list_of_ncs_su) {
> -             if ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
> -                 (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND)) {
> +             if ((ncs_su->sg_of_su->curr_assigned_sus() < 2) &&
> +                     ((ncs_su->list_of_susi == AVD_SU_SI_REL_NULL) ||
> +                     (ncs_su->list_of_susi->fsm != AVD_SU_SI_STATE_ASGND))) {
>                       TRACE_LEAVE();
>                       /* this is an unassigned SU so no need to scan further 
> return here. */
>                       return;
> @@ -328,6 +329,10 @@ void avd_mds_avnd_down_evh(AVD_CL_CB *cb
>
>               if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) {
>                       avd_node_failover(node);
> +                     // Update standby out of sync if standby sc goes down
> +                     if (avd_cb->node_id_avd_other == 
> node->node_info.nodeId) {
> +                             cb->stby_sync_state = AVD_STBY_OUT_OF_SYNC;
> +                     }
[Praveen] Deep down in a function call in  avd_node_failover(), AMF 
marks standby status IN_SYNC in some special case. AMF marks out of sync 
status whenever it gets sync request in chkop.cc so it is not needed here.

>               } else {
>                       /* Remove dynamic info for node but keep in nodeid tree.
>                        * Possibly used at the end of controller failover to
> diff --git a/osaf/services/saf/amf/amfd/node.cc 
> b/osaf/services/saf/amf/amfd/node.cc
> --- a/osaf/services/saf/amf/amfd/node.cc
> +++ b/osaf/services/saf/amf/amfd/node.cc
> @@ -120,7 +120,7 @@ void AVD_AVND::initialize() {
>     pg_csi_list = {};
>     pg_csi_list.order = NCS_DBLIST_ANY_ORDER;
>     pg_csi_list.cmp_cookie = avsv_dblist_uns32_cmp;
> -  type = AVSV_AVND_CARD_PAYLOAD;
> +  type = AVSV_AVND_CARD_SYS_CON;
[Praveen] Initially keeping as PAYLOAD, AMFD later changes node type of 
controller AMFNDs to SYS_CON after evaluating some parameters. Above 
default is set to SYS_CON, there is no change in this patch which sets 
payload as payload. In this way node type of a payload will also become 
SYS_CON.

>     rcv_msg_id = {};
>     snd_msg_id = {};
>     cluster_list_node_next = {};
> @@ -486,11 +486,6 @@ static SaAisErrorT node_ccb_completed_de
>               return SA_AIS_ERR_BAD_OPERATION;
>       }
>
> -     if (node->type == AVSV_AVND_CARD_SYS_CON) {
> -             report_ccb_validation_error(opdata, "Cannot remove controller 
> node");
> -             return SA_AIS_ERR_BAD_OPERATION;
> -     }
> -
[Praveen] Based on some earliar discussion, I remember deletion of sys 
controller is restricted. So check should modified to reject the 
operation if there are only two system controlers in the system.
>       /* Check to see that the node is in admin locked state before delete */
>       if (node->saAmfNodeAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) {
>               report_ccb_validation_error(opdata, "Node '%s' is not locked 
> instantiation", opdata->objectName.value);
> diff --git a/osaf/services/saf/amf/amfd/role.cc 
> b/osaf/services/saf/amf/amfd/role.cc
> --- a/osaf/services/saf/amf/amfd/role.cc
> +++ b/osaf/services/saf/amf/amfd/role.cc
> @@ -46,6 +46,7 @@
>   #include <si_dep.h>
>   #include "osaf_utility.h"
>   #include "role.h"
> +#include "nid_api.h"
>
>   extern pthread_mutex_t imm_reinit_mutex;
>
> @@ -73,7 +74,15 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       AVD_ROLE_CHG_CAUSE_T cause = msg->msg_info.d2d_chg_role_req.cause;
>       SaAmfHAStateT role = msg->msg_info.d2d_chg_role_req.role;
>
> -     TRACE_ENTER2("cause=%u, role=%u", cause, role);
> +     TRACE_ENTER2("cause=%u, role=%u, current_role=%u", cause, role,
> +             cb->avail_state_avd);
> +
> +     if ((status = initialize_for_assignment(cb, role))
> +             != NCSCC_RC_SUCCESS) {
> +             LOG_ER("initialize_for_assignment FAILED %u",
> +                     (unsigned) status);
> +             _exit(EXIT_FAILURE);
> +     }
>
>       if (cb->avail_state_avd == role) {
>               goto done;
> @@ -128,6 +137,13 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       }
>
>       if ((cause == AVD_FAIL_OVER) &&
> +         (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
> SA_AMF_HA_STANDBY)) {
> +             /* Fail-over Quiesced to Active */
> +             status = NCSCC_RC_SUCCESS;
> +             goto done;
> +     }
[Praveen] A quiesced controller never goes from quiesced to stanby only 
in swichover and not in failover.
So comment must be /*Fail-over Quiesced to standby (spare controller 
role change)*/

> +
> +     if ((cause == AVD_FAIL_OVER) &&
>           (cb->avail_state_avd == SA_AMF_HA_QUIESCED) && (role == 
> SA_AMF_HA_ACTIVE)) {
>               /* Fail-over Quiesced to Active */
>               status = avd_role_failover_qsd_actv(cb, role);
> @@ -155,7 +171,73 @@ void avd_role_change_evh(AVD_CL_CB *cb,
>       return;
>   }
>
> -/****************************************************************************\
> +uint32_t initialize_for_assignment(cl_cb_tag* cb, SaAmfHAStateT ha_state)
> +{
> +     TRACE_ENTER2("ha_state = %d", static_cast<int>(ha_state));
> +     SaVersionT ntfVersion = {'A', 0x01, 0x01};
> +     uint32_t rc = NCSCC_RC_SUCCESS;
> +     SaAisErrorT error;
> +     if (cb->fully_initialized) goto done;
> +     cb->avail_state_avd = ha_state;
> +     if (ha_state == SA_AMF_HA_QUIESCED) {
> +             if ((rc = nid_notify(const_cast<char*>("AMFD"),
> +                                  NCSCC_RC_SUCCESS, nullptr)) != 
> NCSCC_RC_SUCCESS) {
> +                     LOG_ER("nid_notify failed");
> +             }
> +             goto done;
> +     }
> +     if ((rc = avd_mds_init(cb)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avd_mds_init FAILED");
> +             goto done;
> +     }
> +     if ((rc = avsv_mbcsv_register(cb)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avsv_mbcsv_register FAILED");
> +             goto done;
> +     }
> +     if (avd_clm_init() != SA_AIS_OK) {
> +             LOG_EM("avd_clm_init FAILED");
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if (avd_imm_init(cb) != SA_AIS_OK) {
> +             LOG_ER("avd_imm_init FAILED");
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if ((error = saNtfInitialize(&cb->ntfHandle, nullptr, &ntfVersion)) !=
> +         SA_AIS_OK) {
> +             LOG_ER("saNtfInitialize Failed (%u)", error);
> +             rc = NCSCC_RC_FAILURE;
> +             goto done;
> +     }
> +     if ((rc = avd_mds_set_vdest_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avd_mds_set_vdest_role FAILED");
> +             goto done;
> +     }
> +     if ((rc = avsv_set_ckpt_role(cb, ha_state)) != NCSCC_RC_SUCCESS) {
> +             LOG_ER("avsv_set_ckpt_role FAILED");
> +             goto done;
> +     }
> +     if (ha_state == SA_AMF_HA_ACTIVE) {
> +             rc = avd_active_role_initialization(cb, ha_state);
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     LOG_ER("avd_active_role_initialization FAILED");
> +                     goto done;
> +             }
> +     } else if (ha_state == SA_AMF_HA_STANDBY) {
> +             rc = avd_standby_role_initialization(cb);
> +             if (rc != NCSCC_RC_SUCCESS) {
> +                     LOG_ER("avd_standby_role_initialization FAILED");
> +                     goto done;
> +             }
> +     }
> +     cb->fully_initialized = true;
> +done:
> +     TRACE_LEAVE2("rc = %u", rc);
> +     return rc;
> +}
> +
> +/****************************************************************************
>  \
>    * Function: avd_init_role_set
>    *
>    * Purpose:  AVSV function to handle AVD's initial role setting.
> diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
> b/osaf/services/saf/amf/amfd/sgproc.cc
> --- a/osaf/services/saf/amf/amfd/sgproc.cc
> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
> @@ -1390,7 +1390,16 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
>                                       /* Since a NCS SU has been assigned 
> trigger the node FSM. */
>                                       /* For (ncs_spec == SA_TRUE), su will 
> not be external, so su
>                                                  will have node attached. */
> -                                     avd_nd_ncs_su_assigned(cb, 
> susi->su->su_on_node);
> +                                     for (AmfDb<uint32_t, 
> AVD_AVND>::const_iterator it = node_id_db->begin();
> +                                             it != node_id_db->end(); it++) {
> +                                             AVD_AVND *node = 
> const_cast<AVD_AVND*>((*it).second);
> +
> +                                             if (node->node_state == 
> AVD_AVND_STATE_NCS_INIT && node->adest != 0) {
> +                                                     
> avd_nd_ncs_su_assigned(cb, node);
> +                                             } else {
> +                                                     TRACE("Node_state: %u 
> adest: %" PRIx64 " node not ready for assignments", node->node_state, 
> node->adest);
> +                                             }
> +                                     }
[Praveen] Could not understand this change? Since spare controllers are 
also payloads, in which case adest can be 0. Is this for headless case, 
there comp and su assignment information comes before node up message.
>                               }
>                       }
>               } else {
> diff --git a/osaf/services/saf/amf/amfnd/clm.cc 
> b/osaf/services/saf/amf/amfnd/clm.cc
> --- a/osaf/services/saf/amf/amfnd/clm.cc
> +++ b/osaf/services/saf/amf/amfnd/clm.cc
> @@ -37,6 +37,7 @@
>   #include "avnd.h"
>   #include "mds_pvt.h"
>   #include "nid_api.h"
> +#include "osaf_time.h"
>
>   static void clm_node_left(SaClmNodeIdT node_id)
>   {
> @@ -166,7 +167,6 @@ uint32_t avnd_evt_avd_node_up_evh(AVND_C
>       info = &evt->info.avd->msg_info.d2n_node_up;
>
>       /*** update this node with the supplied parameters ***/
> -     cb->type = info->node_type;
>       cb->su_failover_max = info->su_failover_max;
>       cb->su_failover_prob = info->su_failover_prob;
>
> @@ -249,8 +249,6 @@ done:
>       return;
>   }
>
> -static SaVersionT Version = { 'B', 4, 1 };
> -
>   static const SaClmCallbacksT_4 callbacks = {
>           0,
>           /*.saClmClusterTrackCallback =*/ clm_track_cb
> @@ -263,11 +261,24 @@ SaAisErrorT avnd_clm_init(void)
>
>       TRACE_ENTER();
>       avnd_cb->first_time_up = true;
[Praveen] Did not get the reason for its removal?
Not being updated any where else in the patch.
> -     error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks, &Version);
> -        if (SA_AIS_OK != error) {
> -                LOG_ER("Failed to Initialize with CLM: %u", error);
> -                goto done;
> -        }
> +     for (;;) {
> +             SaVersionT Version = { 'B', 4, 1 };
> +             error = saClmInitialize_4(&avnd_cb->clmHandle, &callbacks,
> +                                       &Version);
> +             if (error == SA_AIS_ERR_TRY_AGAIN ||
> +                 error == SA_AIS_ERR_TIMEOUT ||
> +                    error == SA_AIS_ERR_UNAVAILABLE) {
> +                     if (error != SA_AIS_ERR_TRY_AGAIN) {
> +                             LOG_WA("saClmInitialize_4 returned %u",
> +                                    (unsigned) error);
> +                     }
> +                     osaf_nanosleep(&kHundredMilliseconds);
> +                     continue;
> +             }
> +             if (error == SA_AIS_OK) break;
> +             LOG_ER("Failed to Initialize with CLM: %u", error);
> +             goto done;
> +     }
>       error = saClmSelectionObjectGet(avnd_cb->clmHandle, 
> &avnd_cb->clm_sel_obj);
>           if (SA_AIS_OK != error) {
>                   LOG_ER("Failed to get CLM selectionObject: %u", error);
>

------------------------------------------------------------------------------
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=278785231&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to