Good idea. I will make that change.

Alex

On 01/03/2017 06:30 AM, praveen malviya wrote:
> ------------------------------------------------------------------------
> NOTICE: This email was received from an EXTERNAL sender
> ------------------------------------------------------------------------
> 
> Hi,
> One initial comment:
> Since suMaintenanceCampaign is an attribute of SU, I think, function
> su->send_attribute_update() can still be used to send name of campaign
> as an attribute update to AMFND. New AMFND will update itself. Old
> AMFNDs are just logging for unsupported attribute and returning error to
> AMFD. AMFD is logging this as an error. This error can be converted into
> warning. With this, I think, there will not be any backward
> incompatibility problem and hence version update will not be required.
> I have prepared a patch (attached 2144_msg.patch on top of this patch)
> based on above idea.
> 
> Going through other changes...
> 
> Thanks,
> Praveen
> 
> 
> 
> On 16-Dec-16 2:13 PM, praveen malviya wrote:
>> 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
>> Opensaf-devel@lists.sourceforge.net
> <mailto:Opensaf-devel@lists.sourceforge.net>
>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>>

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to