From: Anand Sundararaj <s.an...@gethighavailability.com> --- src/amf/amfd/chkop.cc | 9 +++++++ src/amf/amfd/ckpt.h | 3 ++- src/amf/amfd/ckpt_dec.cc | 49 ++++++++++++++++++++++++++++++++++++- src/amf/amfd/ckpt_enc.cc | 38 ++++++++++++++++++++++++++++- src/amf/amfd/ckpt_msg.h | 1 + src/amf/amfd/ckpt_updt.cc | 1 + src/amf/amfd/clm.cc | 3 ++- src/amf/amfd/node.cc | 56 +++++++++++++++++++++++++++++++++++++++++- src/amf/amfd/node.h | 2 ++ src/amf/amfd/sgproc.cc | 25 +++++++++++++++++++ src/amf/amfd/util.cc | 1 + src/amf/amfnd/avnd_su.h | 1 + src/amf/amfnd/di.cc | 62 +++++++++++++++++++++++++++++++++++++++++++++++ src/amf/amfnd/err.cc | 2 +- src/amf/amfnd/su.cc | 2 +- 15 files changed, 248 insertions(+), 7 deletions(-)
diff --git a/src/amf/amfd/chkop.cc b/src/amf/amfd/chkop.cc index 1ed6dd6..eb4ee62 100644 --- a/src/amf/amfd/chkop.cc +++ b/src/amf/amfd/chkop.cc @@ -883,6 +883,14 @@ uint32_t avsv_send_ckpt_data(AVD_CL_CB *cb, uint32_t action, cb->async_updt_cnt.node_updt++; break; + case AVSV_CKPT_RECVR_NODE_FOVER_SWOVER: + if (avd_cb->avd_peer_ver < AVD_MBCSV_SUB_PART_VERSION_12) { + /* No need to send the message to old std as this async is newly added. + */ + return NCSCC_RC_SUCCESS; + } + cb->async_updt_cnt.node_updt++; + break; case AVSV_CKPT_AVD_APP_CONFIG: if ((avd_cb->avd_peer_ver >= AVD_MBCSV_SUB_PART_VERSION_4) && ((action == NCS_MBCSV_ACT_ADD) || (action == NCS_MBCSV_ACT_RMV))) @@ -1348,6 +1356,7 @@ static uint32_t avsv_validate_reo_type_in_csync(AVD_CL_CB *cb, case AVSV_CKPT_AVND_RCV_MSG_ID: case AVSV_CKPT_AVND_SND_MSG_ID: case AVSV_CKPT_NODE_FAILOVER_STATE: + case AVSV_CKPT_RECVR_NODE_FOVER_SWOVER: if (cb->synced_reo_type >= AVSV_CKPT_AVD_NODE_CONFIG) status = NCSCC_RC_SUCCESS; break; diff --git a/src/amf/amfd/ckpt.h b/src/amf/amfd/ckpt.h index f092f5b..aa6d11c 100644 --- a/src/amf/amfd/ckpt.h +++ b/src/amf/amfd/ckpt.h @@ -35,9 +35,10 @@ #define AMF_AMFD_CKPT_H_ // current version -#define AVD_MBCSV_SUB_PART_VERSION 11 +#define AVD_MBCSV_SUB_PART_VERSION 12 // supported versions +#define AVD_MBCSV_SUB_PART_VERSION_12 12 #define AVD_MBCSV_SUB_PART_VERSION_11 11 #define AVD_MBCSV_SUB_PART_VERSION_10 10 #define AVD_MBCSV_SUB_PART_VERSION_9 9 diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc index 7030f43..3ec1e51 100644 --- a/src/amf/amfd/ckpt_dec.cc +++ b/src/amf/amfd/ckpt_dec.cc @@ -64,6 +64,7 @@ static uint32_t dec_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); +static uint32_t dec_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); @@ -164,7 +165,8 @@ const AVSV_DECODE_CKPT_DATA_FUNC_PTR avd_dec_data_func_list[] = { dec_su_restart_count, dec_si_dep_state, dec_ng_admin_state, dec_avd_to_avd_job_queue_status, dec_node_failover_state, - dec_su_inst_msg_processed + dec_su_inst_msg_processed, + dec_recvr_node_fover_swover }; /* @@ -282,6 +284,8 @@ void decode_node_config(NCS_UBAID *ub, AVD_AVND *avnd, osaf_extended_name_free(&node_name); if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_10) { osaf_decode_uint32(ub, &avnd->failover_state); + if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_12) + osaf_decode_bool(ub, &avnd->recvr_fail_sw); } TRACE_LEAVE(); } @@ -3090,3 +3094,46 @@ static uint32_t dec_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec) { return NCSCC_RC_SUCCESS; } + +/****************************************************************************\ + * Function: dec_recvr_node_fover_swover + * + * Purpose: Decode node failover/switchover recovery. + * + * Input: cb - CB pointer. + * dec - Decode arguments passed by MBCSV. + * + * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + * + * NOTES: + * + * +\**************************************************************************/ +static uint32_t dec_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec) { + AVD_AVND avnd; + AVD_AVND *avnd_struct; + + TRACE_ENTER(); + + /* + * Action in this case is just to update. + */ + SaNameT name; + osaf_decode_sanamet(&dec->i_uba, &name); + avnd.name = Amf::to_string(&name); + osaf_extended_name_free(&name); + osaf_decode_uint32(&dec->i_uba, + reinterpret_cast<uint32_t *>(&avnd.recvr_fail_sw)); + + if (nullptr == (avnd_struct = avd_node_get(avnd.name))) { + LOG_ER("%s: node not found, nodeid=%s", __FUNCTION__, avnd.name.c_str()); + return NCSCC_RC_FAILURE; + } + + /* Update the fields received in this checkpoint message */ + avnd_struct->recvr_fail_sw = avnd.recvr_fail_sw; + + cb->async_updt_cnt.node_updt++; + TRACE_LEAVE(); + return NCSCC_RC_SUCCESS; +} diff --git a/src/amf/amfd/ckpt_enc.cc b/src/amf/amfd/ckpt_enc.cc index 26f66ce..e96fe27 100644 --- a/src/amf/amfd/ckpt_enc.cc +++ b/src/amf/amfd/ckpt_enc.cc @@ -63,6 +63,7 @@ static uint32_t enc_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); +static uint32_t enc_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); @@ -166,7 +167,7 @@ const AVSV_ENCODE_CKPT_DATA_FUNC_PTR avd_enc_ckpt_data_func_list[] = { enc_comp_pres_state, enc_comp_restart_count, nullptr, /* AVSV_SYNC_COMMIT */ enc_su_restart_count, enc_si_dep_state, enc_ng_admin_state, enc_avd_to_avd_job_queue_status, - enc_node_failover_state, enc_su_inst_msg_processed}; + enc_node_failover_state, enc_su_inst_msg_processed, enc_recvr_node_fover_swover}; /* * Function list for encoding the cold sync response data @@ -269,6 +270,8 @@ void encode_node_config(NCS_UBAID *ub, const AVD_AVND *avnd, if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_10) { osaf_encode_uint32(ub, avnd->failover_state); } + if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_12) + osaf_encode_bool(ub, avnd->recvr_fail_sw); } /****************************************************************************\ @@ -2464,3 +2467,36 @@ static uint32_t enc_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc) { return NCSCC_RC_SUCCESS; } + +/****************************************************************************\ + * Function: enc_recvr_node_fover_swover + * + * Purpose: Encode node failover/switchover recovery. + * + * Input: cb - CB pointer. + * enc - Encode arguments passed by MBCSV. + * + * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + * + * NOTES: + * + * +\**************************************************************************/ +static uint32_t enc_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc) { + TRACE_ENTER(); + + const AVD_AVND *avnd = reinterpret_cast<AVD_AVND *>(enc->io_reo_hdl); + + /* + * Action in this case is just to update. If action passed is add/rmv then log + * error. Call EDU encode to encode this field. + */ + if (NCS_MBCSV_ACT_UPDATE == enc->io_action) { + osaf_encode_sanamet_o2(&enc->io_uba, avnd->name.c_str()); + osaf_encode_uint32(&enc->io_uba, avnd->recvr_fail_sw); + } else + osafassert(0); + + TRACE_LEAVE(); + return NCSCC_RC_SUCCESS; +} diff --git a/src/amf/amfd/ckpt_msg.h b/src/amf/amfd/ckpt_msg.h index 7b5960a..8b7c527 100644 --- a/src/amf/amfd/ckpt_msg.h +++ b/src/amf/amfd/ckpt_msg.h @@ -115,6 +115,7 @@ typedef enum avsv_ckpt_msg_reo_type { AVSV_CKPT_AVD_IMM_JOB_QUEUE_STATUS, AVSV_CKPT_NODE_FAILOVER_STATE, AVSV_CKPT_SU_INST_PROCESSED, + AVSV_CKPT_RECVR_NODE_FOVER_SWOVER, // Checkpoint Node failover/switchover recovery AVSV_CKPT_MSG_MAX } AVSV_CKPT_MSG_REO_TYPE; diff --git a/src/amf/amfd/ckpt_updt.cc b/src/amf/amfd/ckpt_updt.cc index b01eadb..b58877d 100644 --- a/src/amf/amfd/ckpt_updt.cc +++ b/src/amf/amfd/ckpt_updt.cc @@ -58,6 +58,7 @@ uint32_t avd_ckpt_node(AVD_CL_CB *cb, AVD_AVND *ckpt_node, /* Update all runtime attributes */ node->saAmfNodeAdminState = ckpt_node->saAmfNodeAdminState; node->saAmfNodeOperState = ckpt_node->saAmfNodeOperState; + node->recvr_fail_sw = ckpt_node->recvr_fail_sw; node->node_state = ckpt_node->node_state; node->rcv_msg_id = ckpt_node->rcv_msg_id; node->snd_msg_id = ckpt_node->snd_msg_id; diff --git a/src/amf/amfd/clm.cc b/src/amf/amfd/clm.cc index cfbe36a..620ce28 100644 --- a/src/amf/amfd/clm.cc +++ b/src/amf/amfd/clm.cc @@ -27,7 +27,8 @@ static void clm_node_join_complete(AVD_AVND *node) { TRACE_ENTER(); /* Enable the node in any case. */ - avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED); + if(node->recvr_fail_sw == false) + avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED); /* For each of the SUs calculate the readiness state. ** call the SG FSM with the new readiness state. diff --git a/src/amf/amfd/node.cc b/src/amf/amfd/node.cc index 2c04fca..4c63055 100644 --- a/src/amf/amfd/node.cc +++ b/src/amf/amfd/node.cc @@ -108,6 +108,7 @@ void AVD_AVND::initialize() { saAmfNodeOperState = SA_AMF_OPERATIONAL_DISABLED; admin_node_pend_cbk = {}; su_cnt_admin_oper = {}; + su_cnt_admin_repair = {}; node_state = AVD_AVND_STATE_ABSENT; list_of_ncs_su = {}; list_of_su = {}; @@ -1247,6 +1248,23 @@ void AVD_AVND::node_sus_termstate_set(bool term_state) const { } /** + * Update count of application SUs of the given node. + * + * @param node pointer + * @return None + */ +static uint32_t application_sus_count(AVD_AVND *node) { + uint32_t count = 0; + /* Count the applications SUs hosted on this node. */ + for (const auto &su : node->list_of_su) { + if (su->su_is_external == false) + count++; + } + TRACE("count '%u'", count); + return count; +} + +/** * Handle admin operations on SaAmfNode objects. * * @param immOiHandle @@ -1532,9 +1550,44 @@ static void node_admin_op_cb(SaImmOiHandleT immOiHandle, } break; + case SA_AMF_ADMIN_REPAIRED: + if (node->saAmfNodeOperState == SA_AMF_OPERATIONAL_ENABLED) { + report_admin_op_error( + immOiHandle, invocation, SA_AIS_ERR_NO_OP, nullptr, + "Admin repair request for '%s', op state already enabled", + node->name.c_str()); + goto done; + } + + if (node->node_info.member == false) { + LOG_NO("'%s' ADMIN_REPAIRED: CLM node is not member", + node->name.c_str()); + avd_saImmOiAdminOperationResult(immOiHandle, invocation, SA_AIS_ERR_TRY_AGAIN); + goto done; + } + + if (0 == application_sus_count(node)) { + // Node is configured without appl su, return from here. + avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED); + avd_saImmOiAdminOperationResult(immOiHandle, invocation, SA_AIS_OK); + goto done; + } + + /* forward the admin op req to the node director */ + if (avd_admin_op_msg_snd(node->name, AVSV_SA_AMF_NODE, SA_AMF_ADMIN_REPAIRED, + node) == NCSCC_RC_SUCCESS) { + node->admin_node_pend_cbk.admin_oper = SA_AMF_ADMIN_REPAIRED; + node->admin_node_pend_cbk.invocation = invocation; + node->su_cnt_admin_repair = application_sus_count(node); + } else { + report_admin_op_error(immOiHandle, invocation, SA_AIS_ERR_TIMEOUT, nullptr, + "Admin op request send failed '%s'", node->name.c_str()); + } + break; + default: report_admin_op_error(immOiHandle, invocation, SA_AIS_ERR_NOT_SUPPORTED, - nullptr, "UNSUPPORTED ADMIN OPERATION (%llu)", + nullptr, "UNSUPPORTED ADMIN OPERATION (%llu)", operationId); break; } @@ -1591,6 +1644,7 @@ void node_reset_su_try_inst_counter(const AVD_AVND *node) { su->sg_of_su->try_inst_counter = 0; } } + /** * @brief Checks all nodegroup of nodes are in UNLOCKED state. * @param ptr to Node (AVD_AVND). diff --git a/src/amf/amfd/node.h b/src/amf/amfd/node.h index 097f54b..37b8ce9 100644 --- a/src/amf/amfd/node.h +++ b/src/amf/amfd/node.h @@ -108,6 +108,8 @@ class AVD_AVND { callbacks on this node */ uint32_t su_cnt_admin_oper; /* count to keep track SUs on this node undergoing node admin op */ + uint32_t su_cnt_admin_repair; /* Count to keep track SUs on this node + being repaired by node admin repair op */ /************ AMF B.04 **************************************************/ diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc index 1d7e62a..78ccb31 100644 --- a/src/amf/amfd/sgproc.cc +++ b/src/amf/amfd/sgproc.cc @@ -877,6 +877,8 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) { */ avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_DISABLED); node->recvr_fail_sw = true; + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node, + AVSV_CKPT_RECVR_NODE_FOVER_SWOVER); for (const auto &i_su : node->list_of_su) { i_su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); } @@ -898,6 +900,8 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) { */ avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_DISABLED); node->recvr_fail_sw = true; + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node, + AVSV_CKPT_RECVR_NODE_FOVER_SWOVER); // if maintenance campaign is ongoing, disable node reboot if (su->restrict_auto_repair() == true) node_reboot_req = false; @@ -1025,6 +1029,26 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) { } } } else { /* if(su->sg_of_su->sg_ncs_spec == true) */ + // This is a case of Node repair + if ((n2d_msg->msg_info.n2d_opr_state.node_oper_state == + SA_AMF_OPERATIONAL_ENABLED) && + (node->admin_node_pend_cbk.invocation) && + (node->admin_node_pend_cbk.admin_oper == SA_AMF_ADMIN_REPAIRED)) { + avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED); + if (node->su_cnt_admin_repair > 0) node->su_cnt_admin_repair--; + if (node->su_cnt_admin_repair == 0) { + /* if this is the last SU then send out the pending callback */ + avd_saImmOiAdminOperationResult( + cb->immOiHandle, node->admin_node_pend_cbk.invocation, + SA_AIS_OK); + node->admin_node_pend_cbk.invocation = 0; + node->admin_node_pend_cbk.admin_oper = + static_cast<SaAmfAdminOperationIdT>(0); + node->recvr_fail_sw = false; + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node, + AVSV_CKPT_RECVR_NODE_FOVER_SWOVER); + } + } /* If oper state of Uninstantiated SU got ENABLED so try to instantiate it after evaluating SG. */ if (su->saAmfSUPresenceState == SA_AMF_PRESENCE_UNINSTANTIATED) { @@ -2326,6 +2350,7 @@ void avd_node_down_mw_susi_failover(AVD_CL_CB *cb, AVD_AVND *avnd) { SA_AIS_ERR_REPAIR_PENDING, &avnd->admin_node_pend_cbk, "node failure"); avnd->su_cnt_admin_oper = 0; + avnd->su_cnt_admin_repair = 0; } TRACE_LEAVE(); diff --git a/src/amf/amfd/util.cc b/src/amf/amfd/util.cc index 3b3c6dd..a7b6a77 100644 --- a/src/amf/amfd/util.cc +++ b/src/amf/amfd/util.cc @@ -1397,6 +1397,7 @@ int amfd_file_dump(const char *filename) { fprintf(f, " saAmfNodeOperState: %s\n", avd_oper_state_name[node->saAmfNodeOperState]); fprintf(f, " node_state: %u\n", node->node_state); + fprintf(f, " recvr_fail_sw: %u\n", node->recvr_fail_sw); fprintf(f, " adest:%" PRIx64 "\n", node->adest); fprintf(f, " rcv_msg_id: %u\n", node->rcv_msg_id); fprintf(f, " snd_msg_id: %u\n", node->snd_msg_id); diff --git a/src/amf/amfnd/avnd_su.h b/src/amf/amfnd/avnd_su.h index 45effd6..46a711f 100644 --- a/src/amf/amfnd/avnd_su.h +++ b/src/amf/amfnd/avnd_su.h @@ -461,5 +461,6 @@ extern AVND_SU *avnd_sudb_rec_get_next(AmfDb<std::string, AVND_SU> &sudb, extern void sudb_rec_comp_add(AVND_SU *su, AVND_COMP *comp, uint32_t *rc); uint32_t avnd_evt_avd_compcsi_evh(struct avnd_cb_tag *cb, struct avnd_evt_tag *evt); +extern bool comp_in_term_failed_state(void); #endif // AMF_AMFND_AVND_SU_H_ diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc index 7b01868..5bff121 100644 --- a/src/amf/amfnd/di.cc +++ b/src/amf/amfnd/di.cc @@ -92,6 +92,68 @@ static uint32_t avnd_evt_node_admin_op_req(AVND_CB *cb, AVND_EVT *evt) { cb->rcv_msg_id = info->msg_id; switch (info->oper_id) { + case SA_AMF_ADMIN_REPAIRED: { + /* Node has been repaired. Reset states of this node and all DISABLED + * SUs/comps. And update AMF director accordingly. + * No need to reset states of ENABLED SUs(in case of + * SA_AMF_NODE_SWITCHOVER, only faulty components/SU are disabled, + * other SUs assignments are simply switched over.) + * But for ENABLED Sus, send oper state message, so that, they + * are evaluated for assignments. + */ + LOG_NO("Repair request for Node'%s'", Amf::to_string(&info->dn).c_str()); + + // Reset this node state first, so that when SU enabled message + // reaches at Amfd, it starts giving assignments to those SUs. + cb->oper_state = SA_AMF_OPERATIONAL_ENABLED; + cb->term_state = AVND_TERM_STATE_UP; + cb->node_err_esc_level = AVND_ERR_ESC_LEVEL_0; + cb->failed_su = nullptr; + cb->su_failover_cnt = 0; + + /* Reset all faulty SUs and Comps */ + for (AVND_SU *su = avnd_sudb_rec_get_next(cb->sudb, ""); su != nullptr; + su = avnd_sudb_rec_get_next(cb->sudb, su->name)) { + if (su->is_ncs || su->su_is_external) + continue; + su->comp_restart_cnt = 0; + su->su_restart_cnt = 0; + su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; + if (m_AVND_SU_OPER_STATE_IS_ENABLED(su)){ + rc = avnd_di_oper_send(cb, su, 0); + continue; + } + // Reset the components states. + for (AVND_COMP *comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET( + m_NCS_DBLIST_FIND_FIRST(&su->comp_list)); + comp; comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET( + m_NCS_DBLIST_FIND_NEXT(&comp->su_dll_node))) { + comp->admin_oper = false; + m_AVND_COMP_STATE_RESET(comp); + avnd_comp_pres_state_set(cb, comp, SA_AMF_PRESENCE_UNINSTANTIATED); + + m_AVND_COMP_OPER_STATE_SET(comp, SA_AMF_OPERATIONAL_ENABLED); + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, saAmfCompOperState_ID, + comp->name, comp->oper); + } + + // Reset the SUs states. + if ((su->pres == SA_AMF_PRESENCE_TERMINATION_FAILED) && + (comp_in_term_failed_state() == false)) + avnd_failed_state_file_delete(); + + su->admin_op_Id = static_cast<SaAmfAdminOperationIdT>(0); + reset_suRestart_flag(su); + m_AVND_SU_STATE_RESET(su); + m_AVND_SU_OPER_STATE_SET(su, SA_AMF_OPERATIONAL_ENABLED); + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSUOperState_ID, su->name, + su->oper); + avnd_su_pres_state_set(cb, su, SA_AMF_PRESENCE_UNINSTANTIATED); + rc = avnd_di_oper_send(cb, su, 0); + } // End of for loop for su + break; + } // End of case SA_AMF_ADMIN_REPAIRED: + default: LOG_NO("%s: unsupported adm op %u", __FUNCTION__, info->oper_id); rc = NCSCC_RC_FAILURE; diff --git a/src/amf/amfnd/err.cc b/src/amf/amfnd/err.cc index aeec373..c549047 100644 --- a/src/amf/amfnd/err.cc +++ b/src/amf/amfnd/err.cc @@ -1135,7 +1135,7 @@ uint32_t avnd_err_rcvr_node_failover(AVND_CB *cb, AVND_SU *failed_su, for (comp = avnd_compdb_rec_get_next(cb->compdb, ""); comp != nullptr; comp = avnd_compdb_rec_get_next(cb->compdb, comp->name)) { if (comp->su->is_ncs || comp->su->su_is_external) continue; - + rc = avnd_comp_curr_info_del(cb, comp); rc = avnd_comp_clc_fsm_run(cb, comp, AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); if (rc != NCSCC_RC_SUCCESS) { LOG_ER("'%s' termination failed", comp->name.c_str()); diff --git a/src/amf/amfnd/su.cc b/src/amf/amfnd/su.cc index d8e388a..cb4928d 100644 --- a/src/amf/amfnd/su.cc +++ b/src/amf/amfnd/su.cc @@ -639,7 +639,7 @@ done: return rc; } -static bool comp_in_term_failed_state(void) { +bool comp_in_term_failed_state(void) { for (AVND_COMP *comp = avnd_compdb_rec_get_next(avnd_cb->compdb, ""); comp != nullptr; comp = avnd_compdb_rec_get_next(avnd_cb->compdb, comp->name)) { -- 2.7.4 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel