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

Reply via email to