Hi,
I am going through this patch.
Thanks,
Praveen
On 01-Dec-16 2:06 AM, Alex Jones wrote:
> 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:
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel