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 +#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); + 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); ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel