osaf/libs/common/amf/d2nedu.c | 15 ++++- osaf/libs/common/amf/d2nmsg.c | 12 ++++ osaf/libs/common/amf/include/amf_d2nmsg.h | 13 ++++ osaf/services/saf/amf/amfd/comp.cc | 2 +- osaf/services/saf/amf/amfd/include/su.h | 2 +- osaf/services/saf/amf/amfd/include/util.h | 1 + osaf/services/saf/amf/amfd/mds.cc | 2 +- osaf/services/saf/amf/amfd/sgproc.cc | 2 +- osaf/services/saf/amf/amfd/su.cc | 35 +++++++++++- osaf/services/saf/amf/amfd/util.cc | 74 ++++++++++++++++++++++++++ osaf/services/saf/amf/amfnd/clc.cc | 28 ++++++--- osaf/services/saf/amf/amfnd/err.cc | 20 +++++- osaf/services/saf/amf/amfnd/evt.cc | 2 + osaf/services/saf/amf/amfnd/include/avnd_evt.h | 1 + osaf/services/saf/amf/amfnd/include/avnd_mds.h | 4 +- osaf/services/saf/amf/amfnd/include/avnd_su.h | 3 + osaf/services/saf/amf/amfnd/main.cc | 1 + osaf/services/saf/amf/amfnd/mds.cc | 6 +- osaf/services/saf/amf/amfnd/su.cc | 46 ++++++++++++++++ osaf/services/saf/amf/amfnd/susm.cc | 10 ++- 20 files changed, 252 insertions(+), 27 deletions(-)
This patch implements section 3.11.1.4.2 of AMF spec (Restrictions to Auto-Repair). diff --git a/osaf/libs/common/amf/d2nedu.c b/osaf/libs/common/amf/d2nedu.c --- a/osaf/libs/common/amf/d2nedu.c +++ b/osaf/libs/common/amf/d2nedu.c @@ -414,6 +414,16 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl, {EDU_EXEC, avsv_edp_csi_attr_info, 0, 0, 0, (long)&((AVSV_DND_MSG*)0)->msg_info.d2n_compcsi_assign_msg_info.info.attrs, 0, NULL}, + /*AVSV_D2N_SU_MAINTENANCE_MSG_INFO*/ + {EDU_EXEC, ncs_edp_uns32, 0, 0, 0, + (long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_maintenance_msg_info.msg_id, 0, NULL}, + {EDU_EXEC, m_NCS_EDP_SACLMNODEIDT, 0, 0, 0, + (long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_maintenance_msg_info.node_id, 0, NULL}, + {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0, + (long)&((AVSV_DND_MSG*)0)->msg_info.d2n_su_maintenance_msg_info.su, 0, NULL}, + {EDU_EXEC, ncs_edp_sanamet, 0, 0, EDU_EXIT, + (long)&((AVSV_DND_MSG*)0)->msg_info.d2n_su_maintenance_msg_info.suMaintenanceCampaign, 0, NULL}, + {EDU_END, 0, 0, 0, 0, 0, 0, NULL}, }; @@ -482,7 +492,8 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 123, LCL_JMP_OFFSET_AVSV_N2D_ND_SISU_STATE_INFO_MSG = 125, LCL_JMP_OFFSET_AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG = 131, - LCL_JMP_OFFSET_AVSV_D2N_COMPCSI_ASSIGN_MSG = 137 + LCL_JMP_OFFSET_AVSV_D2N_COMPCSI_ASSIGN_MSG = 137, + LCL_JMP_OFFSET_AVSV_D2N_SU_MAINTENANCE_MSG = 143 }; AVSV_DND_MSG_TYPE type; @@ -554,6 +565,8 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX return LCL_JMP_OFFSET_AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG ; case AVSV_D2N_COMPCSI_ASSIGN_MSG: return LCL_JMP_OFFSET_AVSV_D2N_COMPCSI_ASSIGN_MSG; + case AVSV_D2N_SU_MAINTENANCE_MSG: + return LCL_JMP_OFFSET_AVSV_D2N_SU_MAINTENANCE_MSG; default: break; diff --git a/osaf/libs/common/amf/d2nmsg.c b/osaf/libs/common/amf/d2nmsg.c --- a/osaf/libs/common/amf/d2nmsg.c +++ b/osaf/libs/common/amf/d2nmsg.c @@ -513,6 +513,15 @@ static void free_d2n_compcsi_info(AVSV_D } +static void free_d2n_su_maintenance_info(AVSV_DND_MSG *su_maintenance_msg) +{ + AVSV_D2N_SU_MAINTENANCE_MSG_INFO *su_maintenance = + &su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info; + + osaf_extended_name_free(&su_maintenance->su); + osaf_extended_name_free(&su_maintenance->suMaintenanceCampaign); +} + /**************************************************************************** Name : avsv_dnd_msg_free @@ -609,6 +618,9 @@ void avsv_dnd_msg_free(AVSV_DND_MSG *msg case AVSV_D2N_COMPCSI_ASSIGN_MSG: free_d2n_compcsi_info(msg); break; + case AVSV_D2N_SU_MAINTENANCE_MSG: + free_d2n_su_maintenance_info(msg); + break; default: break; } diff --git a/osaf/libs/common/amf/include/amf_d2nmsg.h b/osaf/libs/common/amf/include/amf_d2nmsg.h --- a/osaf/libs/common/amf/include/amf_d2nmsg.h +++ b/osaf/libs/common/amf/include/amf_d2nmsg.h @@ -51,6 +51,7 @@ extern "C" { #define AVSV_AVD_AVND_MSG_FMT_VER_5 5 #define AVSV_AVD_AVND_MSG_FMT_VER_6 6 #define AVSV_AVD_AVND_MSG_FMT_VER_7 7 +#define AVSV_AVD_AVND_MSG_FMT_VER_8 8 /* Internode/External Components Validation result */ typedef enum { @@ -108,6 +109,7 @@ typedef enum { AVSV_N2D_ND_SISU_STATE_INFO_MSG, AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG, AVSV_D2N_COMPCSI_ASSIGN_MSG, + AVSV_D2N_SU_MAINTENANCE_MSG, AVSV_DND_MSG_MAX } AVSV_DND_MSG_TYPE; @@ -647,6 +649,16 @@ typedef struct avsv_d2n_compcsi_assign_m } info; } AVSV_D2N_COMPCSI_ASSIGN_MSG_INFO; +/* + * Message structure to send updates to saAmfSUMaintenanceCampaign. + */ +typedef struct avsv_d2n_su_maintenance_msg { + uint32_t msg_id; + SaClmNodeIdT node_id; + SaNameT su; + SaNameT suMaintenanceCampaign; +} AVSV_D2N_SU_MAINTENANCE_MSG_INFO; + typedef struct avsv_dnd_msg { AVSV_DND_MSG_TYPE msg_type; union { @@ -681,6 +693,7 @@ typedef struct avsv_dnd_msg { AVSV_D2N_HB_MSG_INFO d2n_hb_info; AVSV_D2N_REBOOT_MSG_INFO d2n_reboot_info; AVSV_D2N_COMPCSI_ASSIGN_MSG_INFO d2n_compcsi_assign_msg_info; + AVSV_D2N_SU_MAINTENANCE_MSG_INFO d2n_su_maintenance_msg_info; } msg_info; } AVSV_DND_MSG; diff --git a/osaf/services/saf/amf/amfd/comp.cc b/osaf/services/saf/amf/amfd/comp.cc --- a/osaf/services/saf/amf/amfd/comp.cc +++ b/osaf/services/saf/amf/amfd/comp.cc @@ -155,7 +155,7 @@ void AVD_COMP::avd_comp_pres_state_set(S (saAmfCompPresenceState == SA_AMF_PRESENCE_TERMINATION_FAILED)) || ((node->saAmfNodeFailfastOnInstantiationFailure == true) && (saAmfCompPresenceState == SA_AMF_PRESENCE_INSTANTIATION_FAILED))) && - (!su->saAmfSUMaintenanceCampaign.empty())) { + (su->saAmfSUMaintenanceCampaign.empty())) { saflog(LOG_NOTICE, amfSvcUsrName, "%s PresenceState %s => %s", osaf_extended_name_borrow(&comp_info.name), avd_pres_state_name[old_state], diff --git a/osaf/services/saf/amf/amfd/include/su.h b/osaf/services/saf/amf/amfd/include/su.h --- a/osaf/services/saf/amf/amfd/include/su.h +++ b/osaf/services/saf/amf/amfd/include/su.h @@ -116,7 +116,7 @@ class AVD_SU { void set_term_state(bool state); void remove_from_model(); void set_su_switch(SaToggleState state, bool wrt_to_imm = true); - AVD_AVND *get_node_ptr(void); + AVD_AVND *get_node_ptr(void) const; bool is_in_service(void); bool is_instantiable(void); void reset_all_comps_assign_flag(); diff --git a/osaf/services/saf/amf/amfd/include/util.h b/osaf/services/saf/amf/amfd/include/util.h --- a/osaf/services/saf/amf/amfd/include/util.h +++ b/osaf/services/saf/amf/amfd/include/util.h @@ -102,5 +102,6 @@ extern const char *admin_op_name(SaAmfAd int compare_sanamet(const std::string& lhs, const std::string& rhs); uint32_t avd_snd_compcsi_msg(AVD_COMP *comp, AVD_CSI *csi, avd_comp_csi_rel_tag *compcsi, AVSV_COMPCSI_ACT act); +uint32_t avd_snd_su_maintenance_msg(const AVD_SU&); #endif diff --git a/osaf/services/saf/amf/amfd/mds.cc b/osaf/services/saf/amf/amfd/mds.cc --- a/osaf/services/saf/amf/amfd/mds.cc +++ b/osaf/services/saf/amf/amfd/mds.cc @@ -46,7 +46,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avd_avnd AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2, AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4, AVSV_AVD_AVND_MSG_FMT_VER_5, AVSV_AVD_AVND_MSG_FMT_VER_6, - AVSV_AVD_AVND_MSG_FMT_VER_7 + AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8 }; const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[] = { 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 @@ -804,7 +804,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb node->recvr_fail_sw = true; // if maintenance campaign is ongoing, disable node reboot - if (su->saAmfSUMaintenanceCampaign.empty()) + if (!su->saAmfSUMaintenanceCampaign.empty()) node_reboot_req = false; switch (n2d_msg->msg_info.n2d_opr_state.rec_rcvr.raw) { diff --git a/osaf/services/saf/amf/amfd/su.cc b/osaf/services/saf/amf/amfd/su.cc --- a/osaf/services/saf/amf/amfd/su.cc +++ b/osaf/services/saf/amf/amfd/su.cc @@ -737,7 +737,7 @@ void AVD_SU::set_pres_state(SaAmfPresenc (su_on_node->saAmfNodeFailfastOnTerminationFailure == true) && (sg_of_su->saAmfSGAutoRepair == true) && (su_on_node->saAmfNodeAutoRepair == true) && - (!saAmfSUMaintenanceCampaign.empty())) + (saAmfSUMaintenanceCampaign.empty())) /* According to AMF B.04.01 Section 4.8 Page 214 if user configures saAmfNodeFailfastOnTerminationFailure = true, AMF has to perform node failfast recovery action. So mark SU to SA_AMF_PRESENCE_TERMINATION_FAILED @@ -748,7 +748,7 @@ void AVD_SU::set_pres_state(SaAmfPresenc (su_on_node->saAmfNodeFailfastOnInstantiationFailure == true) && (sg_of_su->saAmfSGAutoRepair == true) && (su_on_node->saAmfNodeAutoRepair == true) && - (!saAmfSUMaintenanceCampaign.empty())) + (saAmfSUMaintenanceCampaign.empty())) /* According to AMF B.04.01 Section 4.6 Page 212 if user configures saAmfNodeFailfastOnInstantiationFailure = true, AMF has to perform node failfast recovery action. So mark SU to SA_AMF_PRESENCE_INSTANTIATION_FAILED @@ -1782,6 +1782,32 @@ static SaAisErrorT su_ccb_completed_cb(C return rc; } +static void sendMaintenanceUpdateToND(const AVD_SU& su) { + do { + auto it(nds_mds_ver_db.find( + su.su_on_node->node_info.nodeId)); + + if (it == nds_mds_ver_db.end()) + break; + + // Check if this amfnd is capable of this functionality. + if (it->second < AVSV_AVD_AVND_MSG_FMT_VER_8) { + TRACE_3("not sending to '%s' on :%x with mds version:'%u'", + su.name.c_str(), + su.su_on_node->node_info.nodeId, + it->second); + break; + } + + TRACE_3("sending to '%s' on :%x with mds version:'%u'", + su.name.c_str(), + su.su_on_node->node_info.nodeId, + it->second); + + avd_snd_su_maintenance_msg(su); + } while (false); +} + /***************************************************************************** * Function: avd_su_ccb_apply_modify_hdlr * @@ -1840,6 +1866,9 @@ static void su_ccb_apply_modify_hdlr(str TRACE("saAmfSUMaintenanceCampaign set to '%s' for '%s'", su->saAmfSUMaintenanceCampaign.c_str(), su->name.c_str()); } + + if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) + sendMaintenanceUpdateToND(*su); } else if (!strcmp(attr_mod->modAttr.attrName, "saAmfSUType")) { AVD_SUTYPE *sut; SaNameT sutype_name = *(SaNameT*) attr_mod->modAttr.attrValues[0]; @@ -2165,7 +2194,7 @@ void AVD_SU::set_su_switch(SaToggleState m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, AVSV_CKPT_SU_SWITCH); } -AVD_AVND *AVD_SU::get_node_ptr(void) { +AVD_AVND *AVD_SU::get_node_ptr(void) const { if (su_is_external == true) return avd_cb->ext_comp_info.local_avnd_node; else diff --git a/osaf/services/saf/amf/amfd/util.cc b/osaf/services/saf/amf/amfd/util.cc --- a/osaf/services/saf/amf/amfd/util.cc +++ b/osaf/services/saf/amf/amfd/util.cc @@ -1764,6 +1764,14 @@ static void free_d2n_compcsi_info(AVSV_D } } +static void free_d2n_su_maintenance_info(AVSV_DND_MSG *su_maintenance_msg) { + AVSV_D2N_SU_MAINTENANCE_MSG_INFO *su_maintenance( + &su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info); + + osaf_extended_name_free(&su_maintenance->su); + osaf_extended_name_free(&su_maintenance->suMaintenanceCampaign); +} + /**************************************************************************** Name : d2n_msg_free @@ -1815,6 +1823,9 @@ void d2n_msg_free(AVSV_DND_MSG *msg) case AVSV_D2N_COMPCSI_ASSIGN_MSG: free_d2n_compcsi_info(msg); break; + case AVSV_D2N_SU_MAINTENANCE_MSG: + free_d2n_su_maintenance_info(msg); + break; default: break; } @@ -2096,3 +2107,66 @@ uint32_t avd_snd_compcsi_msg(AVD_COMP *c return NCSCC_RC_SUCCESS; } +/** + * @brief Sends a message to AMFND for a change in SUMaintenanceCampaign + * @param ptr to su + * @param act(action of type AVSV_COMPCSI_ACT) + * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + */ +uint32_t avd_snd_su_maintenance_msg(const AVD_SU& su) { + TRACE_ENTER2("'%s', '%s'", + su.name.c_str(), + su.saAmfSUMaintenanceCampaign.c_str()); + + uint32_t rc(NCSCC_RC_SUCCESS); + + do { + AVD_AVND *avnd(su.get_node_ptr()); + + if (avnd->node_state == AVD_AVND_STATE_ABSENT || + avnd->node_state == AVD_AVND_STATE_GO_DOWN) { + break; + } + + // Will be freed in free_d2n_su_maintenance_info() + SaNameT su_name; + osaf_extended_name_alloc(su.name.c_str(), &su_name); + + // Will be freed in free_d2n_su_maintenance_info() + SaNameT suMaintenanceCampaign; + osaf_extended_name_alloc(su.saAmfSUMaintenanceCampaign.c_str(), + &suMaintenanceCampaign); + + // prepare the SU_MAINTENANCE message + AVD_DND_MSG *su_maintenance_msg(new AVSV_DND_MSG); + su_maintenance_msg->msg_type = AVSV_D2N_SU_MAINTENANCE_MSG; + su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info.node_id = + avnd->node_info.nodeId; + su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info.su = su_name; + su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info.suMaintenanceCampaign = + suMaintenanceCampaign; + + // Generate new msg_id. + su_maintenance_msg->msg_info.d2n_su_maintenance_msg_info.msg_id = + ++(avnd->snd_msg_id); + + // Send SU_MAINTENANCE message*/ + TRACE("Sending %u to %x", + AVSV_D2N_SU_MAINTENANCE_MSG, + avnd->node_info.nodeId); + + if (avd_d2n_msg_snd(avd_cb, avnd, su_maintenance_msg) != NCSCC_RC_SUCCESS) { + LOG_ER("Send to %x failed",avnd->node_info.nodeId); + --(avnd->snd_msg_id); + d2n_msg_free(su_maintenance_msg); + rc = NCSCC_RC_FAILURE; + break; + } + + // Checkpoint to standby AMFD. + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, avnd, AVSV_CKPT_AVND_SND_MSG_ID); + } while (false); + + TRACE_LEAVE(); + return rc; +} diff --git a/osaf/services/saf/amf/amfnd/clc.cc b/osaf/services/saf/amf/amfnd/clc.cc --- a/osaf/services/saf/amf/amfnd/clc.cc +++ b/osaf/services/saf/amf/amfnd/clc.cc @@ -970,19 +970,29 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ if (comp->su->is_ncs == true) { if(SA_AMF_PRESENCE_INSTANTIATION_FAILED == final_st) { LOG_ER("'%s'got Inst failed", comp->name.c_str()); - opensaf_reboot(avnd_cb->node_info.nodeId, - osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), - "NCS component Instantiation failed"); - LOG_ER("Amfnd is exiting (due to ncs comp inst failed) to aid fast reboot"); - exit(0); + if (comp->su->suMaintenanceCampaign.empty()) { + opensaf_reboot(avnd_cb->node_info.nodeId, + osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), + "NCS component Instantiation failed"); + LOG_ER("Amfnd is exiting (due to ncs comp inst failed) to aid fast reboot"); + exit(0); + } else { + LOG_NO("not rebooting as maintenance campaign is ongoing"); + goto done; + } } if(SA_AMF_PRESENCE_TERMINATION_FAILED == final_st) { LOG_ER("'%s'got Term failed", comp->name.c_str()); - opensaf_reboot(avnd_cb->node_info.nodeId, + if (comp->su->suMaintenanceCampaign.empty()) { + opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), - "NCS component Termination failed"); - LOG_ER("Amfnd is exiting (due to ncs comp term failed) to aid fast reboot"); - exit(0); + "NCS component Termination failed"); + LOG_ER("Amfnd is exiting (due to ncs comp term failed) to aid fast reboot"); + exit(0); + } else { + LOG_NO("not rebooting as maintenance campaign is ongoing"); + goto done; + } } } diff --git a/osaf/services/saf/amf/amfnd/err.cc b/osaf/services/saf/amf/amfnd/err.cc --- a/osaf/services/saf/amf/amfnd/err.cc +++ b/osaf/services/saf/amf/amfnd/err.cc @@ -407,8 +407,14 @@ uint32_t avnd_err_process(AVND_CB *cb, A LOG_ER("%s Faulted due to:%s Recovery is:%s", comp->name.c_str(), g_comp_err[comp->err_info.src], g_comp_rcvr[esc_rcvr - 1]); /* do the local node reboot for node_failfast or ncs component failure*/ - opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), + if (comp->su->suMaintenanceCampaign.empty()) { + opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), "Component faulted: recovery is node failfast"); + } else { + LOG_NO("not rebooting because maintenance campaign is set: %s", + comp->su->suMaintenanceCampaign.c_str()); + goto done; + } } /* execute the recovery */ @@ -1038,11 +1044,17 @@ uint32_t avnd_err_rcvr_node_failover(AVN 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()); - opensaf_reboot(avnd_cb->node_info.nodeId, + if (comp->su->suMaintenanceCampaign.empty()) { + opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), "Component termination failed at node failover"); - LOG_ER("Exiting (due to comp term failed) to aid fast node reboot"); - exit(1); + LOG_ER("Exiting (due to comp term failed) to aid fast node reboot"); + exit(1); + } else { + LOG_NO("not rebooting because maintenance campaign is set: %s", + comp->su->suMaintenanceCampaign.c_str()); + continue; + } } avnd_su_pres_state_set(cb, comp->su, SA_AMF_PRESENCE_TERMINATING); } diff --git a/osaf/services/saf/amf/amfnd/evt.cc b/osaf/services/saf/amf/amfnd/evt.cc --- a/osaf/services/saf/amf/amfnd/evt.cc +++ b/osaf/services/saf/amf/amfnd/evt.cc @@ -88,6 +88,7 @@ AVND_EVT *avnd_evt_create(AVND_CB *cb, case AVND_EVT_AVD_ADMIN_OP_REQ_MSG: case AVND_EVT_AVD_REBOOT_MSG: case AVND_EVT_AVD_COMPCSI_ASSIGN_MSG: + case AVND_EVT_AVD_SU_MAINTENANCE_MSG: evt->info.avd = (AVSV_DND_MSG *)info; break; @@ -237,6 +238,7 @@ void avnd_evt_destroy(AVND_EVT *evt) case AVND_EVT_AVD_HEARTBEAT_MSG: case AVND_EVT_AVD_REBOOT_MSG: case AVND_EVT_AVD_COMPCSI_ASSIGN_MSG: + case AVND_EVT_AVD_SU_MAINTENANCE_MSG: if (evt->info.avd) avsv_dnd_msg_free(evt->info.avd); break; diff --git a/osaf/services/saf/amf/amfnd/include/avnd_evt.h b/osaf/services/saf/amf/amfnd/include/avnd_evt.h --- a/osaf/services/saf/amf/amfnd/include/avnd_evt.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_evt.h @@ -53,6 +53,7 @@ typedef enum avnd_evt_type { AVND_EVT_AVD_HEARTBEAT_MSG, AVND_EVT_AVD_REBOOT_MSG, AVND_EVT_AVD_COMPCSI_ASSIGN_MSG, + AVND_EVT_AVD_SU_MAINTENANCE_MSG, AVND_EVT_AVD_MAX, /* AvA event types */ diff --git a/osaf/services/saf/amf/amfnd/include/avnd_mds.h b/osaf/services/saf/amf/amfnd/include/avnd_mds.h --- a/osaf/services/saf/amf/amfnd/include/avnd_mds.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_mds.h @@ -31,10 +31,10 @@ #define AVND_MDS_H /* In Service upgrade support */ -#define AVND_MDS_SUB_PART_VERSION 7 +#define AVND_MDS_SUB_PART_VERSION 8 #define AVND_AVD_SUBPART_VER_MIN 1 -#define AVND_AVD_SUBPART_VER_MAX 7 +#define AVND_AVD_SUBPART_VER_MAX 8 #define AVND_AVND_SUBPART_VER_MIN 1 #define AVND_AVND_SUBPART_VER_MAX 1 diff --git a/osaf/services/saf/amf/amfnd/include/avnd_su.h b/osaf/services/saf/amf/amfnd/include/avnd_su.h --- a/osaf/services/saf/amf/amfnd/include/avnd_su.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_su.h @@ -143,6 +143,8 @@ typedef struct avnd_su_tag { uint32_t si_active_cnt; /* no of active SIs assigned to this su */ uint32_t si_standby_cnt; /* no of standby SIs assigned to this su */ + std::string suMaintenanceCampaign; + /* * Ordered comp list (based on inst level). Note that as the * lexicographic key (comp-name) & the keys used for @@ -417,5 +419,6 @@ extern AVND_SU *avnd_sudb_rec_get(AmfDb< extern AVND_SU *avnd_sudb_rec_get_next(AmfDb<std::string, AVND_SU>& sudb, const std::string& name); 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); +uint32_t avnd_evt_avd_su_maintenance_evh(avnd_cb_tag *, AVND_EVT *); #endif diff --git a/osaf/services/saf/amf/amfnd/main.cc b/osaf/services/saf/amf/amfnd/main.cc --- a/osaf/services/saf/amf/amfnd/main.cc +++ b/osaf/services/saf/amf/amfnd/main.cc @@ -69,6 +69,7 @@ extern const AVND_EVT_HDLR g_avnd_func_l avnd_evt_avd_hb_evh, /* AVND_EVT_AVD_HEARTBEAT_MSG */ avnd_evt_avd_reboot_evh, /* /AVND_EVT_AVD_REBOOT_MSG */ avnd_evt_avd_compcsi_evh, //AVND_EVT_AVD_COMPCSI_ASSIGN_MSG + avnd_evt_avd_su_maintenance_evh, //AVND_EVT_AVD_SU_MAINTENANCE_MSG /* AvA event types */ avnd_evt_ava_finalize_evh, /* AVND_EVT_AVA_AMF_FINALIZE */ diff --git a/osaf/services/saf/amf/amfnd/mds.cc b/osaf/services/saf/amf/amfnd/mds.cc --- a/osaf/services/saf/amf/amfnd/mds.cc +++ b/osaf/services/saf/amf/amfnd/mds.cc @@ -42,7 +42,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avnd_avd AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2, AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4, AVSV_AVD_AVND_MSG_FMT_VER_4, AVSV_AVD_AVND_MSG_FMT_VER_6, - AVSV_AVD_AVND_MSG_FMT_VER_7 + AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8 }; /* messages from director */ @@ -50,7 +50,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avd_avnd AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2, AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4, AVSV_AVD_AVND_MSG_FMT_VER_5, AVSV_AVD_AVND_MSG_FMT_VER_6, - AVSV_AVD_AVND_MSG_FMT_VER_7 + AVSV_AVD_AVND_MSG_FMT_VER_7, AVSV_AVD_AVND_MSG_FMT_VER_8 }; const MDS_CLIENT_MSG_FORMAT_VER avnd_avnd_msg_fmt_map_table[] = { @@ -404,6 +404,8 @@ uint32_t avnd_mds_rcv(AVND_CB *cb, MDS_C if (msg.info.avd->msg_type == AVSV_D2N_COMPCSI_ASSIGN_MSG) type = AVND_EVT_AVD_COMPCSI_ASSIGN_MSG; + else if (msg.info.avd->msg_type == AVSV_D2N_SU_MAINTENANCE_MSG) + type = AVND_EVT_AVD_SU_MAINTENANCE_MSG; else type = static_cast<AVND_EVT_TYPE>((msg.info.avd->msg_type - AVSV_D2N_NODE_UP_MSG) + AVND_EVT_AVD_NODE_UP_MSG); break; diff --git a/osaf/services/saf/amf/amfnd/su.cc b/osaf/services/saf/amf/amfnd/su.cc --- a/osaf/services/saf/amf/amfnd/su.cc +++ b/osaf/services/saf/amf/amfnd/su.cc @@ -1042,4 +1042,50 @@ done: return rc; } +/** + * @brief Processes su maintenance message from AMFD. + * @param cb (ptr to AVND_CB) + * @param evt(ptr to AVND_EVT) + * + * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + */ +uint32_t avnd_evt_avd_su_maintenance_evh(AVND_CB *cb, AVND_EVT *evt) { + uint32_t rc(NCSCC_RC_SUCCESS); + do { + AVSV_D2N_SU_MAINTENANCE_MSG_INFO *su_maintenance( + &evt->info.avd->msg_info.d2n_su_maintenance_msg_info); + + const std::string su_name(Amf::to_string(&su_maintenance->su)); + const std::string suMaintenanceCampaign(Amf::to_string( + &su_maintenance->suMaintenanceCampaign)); + + TRACE_ENTER2("'%s', '%s'", su_name.c_str(), suMaintenanceCampaign.c_str()); + + AVND_SU *su(avnd_sudb_rec_get(cb->sudb, su_name)); + + if (!su) { + LOG_ER("su: '%s' not found", su_name.c_str()); + break; + } + + if (cb->term_state == AVND_TERM_STATE_OPENSAF_SHUTDOWN_INITIATED || + cb->term_state == AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED) { + LOG_NO("Shutdown started : Ignoring setting of su maintenance'%s'", + su->name.c_str()); + break; + } + + avnd_msgid_assert(su_maintenance->msg_id); + cb->rcv_msg_id = su_maintenance->msg_id; + + TRACE("setting suMaintenanceCampaign to %s for su: %s", + suMaintenanceCampaign.c_str(), + su_name.c_str()); + + su->suMaintenanceCampaign = suMaintenanceCampaign; + } while (false); + + TRACE_LEAVE2("%u", rc); + return rc; +} diff --git a/osaf/services/saf/amf/amfnd/susm.cc b/osaf/services/saf/amf/amfnd/susm.cc --- a/osaf/services/saf/amf/amfnd/susm.cc +++ b/osaf/services/saf/amf/amfnd/susm.cc @@ -2787,8 +2787,14 @@ uint32_t avnd_su_pres_terming_comptermfa if (true == su->is_ncs) { std::string reason = "SU '" + su->name + "' Termination-failed"; - opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), - reason.c_str()); + if (su->suMaintenanceCampaign.empty()) { + opensaf_reboot(avnd_cb->node_info.nodeId, osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), + reason.c_str()); + } else { + LOG_ER("%s", reason.c_str()); + LOG_NO("not rebooting because su maintenance campaign is set: %s", + su->suMaintenanceCampaign.c_str()); + } } done: ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel