ack, code review. MInor comments inlined/Thanks HansN On 02/29/2016 04:14 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. > > 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 > [HansN] use #include <cstdint> > +#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; > 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; > + } > } 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; > 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; > - } > - > /* 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; > + } > + > + 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); [HansN] The const_cast below is not needed. > + 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); > + } > + } > } > } > } 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; > - 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