Ack. Code review only.

Thanks
-Nagu

> -----Original Message-----
> From: Praveen Malviya
> Sent: 21 February 2017 16:27
> To: hans.nordeb...@ericsson.com; Nagendra Kumar;
> gary....@dektech.com.au; minh.c...@dektech.com.au
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: [PATCH 1 of 1] amfd: support si-swap admin op for NplusM model
> [#2259]
> 
>  src/amf/amfd/sg.cc         |   12 +++-
>  src/amf/amfd/sg.h          |    4 +
>  src/amf/amfd/sg_npm_fsm.cc |  145
> ++++++++++++++++++++++++++++++++++++---------
>  src/amf/amfd/su.cc         |   11 +++
>  src/amf/amfd/su.h          |    2 +
>  5 files changed, 144 insertions(+), 30 deletions(-)
> 
> 
> This version works for the case when all SIs which are active in the
> designated SU (where SI to be swaped is active) have their standbys on same
> SU including the designated SI.
> 
> TODO: consider the case when active SIs of designated SU have their
> standbys on different SUs.
> 
> diff --git a/src/amf/amfd/sg.cc b/src/amf/amfd/sg.cc
> --- a/src/amf/amfd/sg.cc
> +++ b/src/amf/amfd/sg.cc
> @@ -2,6 +2,7 @@
>   *
>   * (C) Copyright 2008 The OpenSAF Foundation
>   * (C) Copyright 2017 Ericsson AB - All Rights Reserved.
> + * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
>   *
>   * This program is distributed in the hope that it will be useful, but
>   * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY @@ -2274,4 +2275,13 @@ bool
> AVD_SG::any_assignment_assigned() {
>       return pending;
>  }
> 
> -
> +/*
> + * @brief  Checks if si_equal_distribution is configured for the SG.
> + * @return true/false.
> +*/
> +bool AVD_SG::is_equal() const {
> +  return(((sg_redundancy_model == SA_AMF_NPM_REDUNDANCY_MODEL)
> ||
> +       (sg_redundancy_model ==
> SA_AMF_N_WAY_REDUNDANCY_MODEL) ||
> +       (sg_redundancy_model ==
> SA_AMF_N_WAY_ACTIVE_REDUNDANCY_MODEL)) &&
> +       (equal_ranked_su == true) && (saAmfSGAutoAdjust == SA_TRUE)); }
> diff --git a/src/amf/amfd/sg.h b/src/amf/amfd/sg.h
> --- a/src/amf/amfd/sg.h
> +++ b/src/amf/amfd/sg.h
> @@ -2,6 +2,7 @@
>   *
>   * (C) Copyright 2008 The OpenSAF Foundation
>   * (C) Copyright 2017 Ericsson AB - All Rights Reserved.
> + * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
>   *
>   * This program is distributed in the hope that it will be useful, but
>   * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY @@ -429,6 +430,8 @@ public:
>       //Runtime calculates value of
> saAmfSGNumCurrNonInstantiatedSpareSUs;
>       uint32_t curr_non_instantiated_spare_sus() const;
>       bool is_middleware() const {return sg_ncs_spec ? true : false;}
> +     //Checks if si_equal_distribution is configured for the SG.
> +     bool is_equal() const;
> 
>  private:
>       // disallow copy and assign, TODO(hafe) add common macro for this
> @@ -514,6 +517,7 @@ public:
>               struct avd_su_si_rel_tag *susi, AVSV_SUSI_ACT act,
> SaAmfHAStateT state);
>          void node_fail_si_oper(AVD_CL_CB *cb, AVD_SU *su);
>       void ng_admin(AVD_SU *su, AVD_AMF_NG *ng);
> +     SaAisErrorT si_swap(AVD_SI *si, SaInvocationT invocation);
> 
>  private:
>          uint32_t su_fault_su_oper(AVD_CL_CB *cb, AVD_SU *su); diff --git
> a/src/amf/amfd/sg_npm_fsm.cc b/src/amf/amfd/sg_npm_fsm.cc
> --- a/src/amf/amfd/sg_npm_fsm.cc
> +++ b/src/amf/amfd/sg_npm_fsm.cc
> @@ -1,6 +1,7 @@
>  /*      -*- OpenSAF  -*-
>   *
>   * (C) Copyright 2008 The OpenSAF Foundation
> + * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
>   *
>   * This program is distributed in the hope that it will be useful, but
>   * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY @@ -170,7 +171,10 @@ static uint32_t
> avd_sg_npm_su_chk_snd(AV
>               }
>       }
> 
> +     /*Do not send delete for a susi of s_su if other sisu of same si is in
> q_su.
> +       In this case s_su can become active for this SI.*/
>       for (i_susi = s_su->list_of_susi; i_susi != AVD_SU_SI_REL_NULL; i_susi
> = i_susi->su_next) {
> +
>               if ((i_susi->si->list_of_sisu != i_susi) && (i_susi->si-
> >list_of_sisu->su == q_su))
>                       continue;
> 
> @@ -964,34 +968,6 @@ uint32_t SG_NPM::si_assign(AVD_CL_CB *cb
>       return NCSCC_RC_SUCCESS;
>  }
> 
> -
> /*************************************************************
> ****************
> - * Function: avd_sg_npm_siswitch_func
> - *
> - * Purpose:  This function is called when a operator does a SI switch on
> - * a SI that belongs to N+M redundancy model SG.
> - * This will trigger a role change action as described in the SG FSM design.
> - *
> - * Input: cb - the AVD control block
> - *        si - The pointer to the SI that needs to be switched.
> - *
> - *
> - * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
> - *
> - * NOTES: This is a N+M redundancy model specific function. The initial
> - * functionality of N+M SI switch is same as 2N switch so it just calls that
> - * function.
> - *
> - *
> -
> **************************************************************
> ************/
> -
> -uint32_t avd_sg_npm_siswitch_func(AVD_CL_CB *cb, AVD_SI *si) -{
> -     TRACE_ENTER2("%u", si->sg_of_si->sg_fsm_state);
> -     osafassert(0);
> -//   return avd_sg_2n_siswitch_func(cb, si);
> -     return 0;
> -}
> -
> 
> /*************************************************************
> ****************
>   * Function: su_fault_su_oper
>   *
> @@ -1847,6 +1823,7 @@ uint32_t SG_NPM::susi_sucss_sg_reln(AVD_
>                       /* if (i_susi == AVD_SU_SI_REL_NULL) */
>               } /* if ((act == AVSV_SUSI_ACT_MOD) && (state ==
> SA_AMF_HA_ACTIVE)) */
>               else if ((act == AVSV_SUSI_ACT_MOD) && (state ==
> SA_AMF_HA_STANDBY)) {
> +                     su->update_susis_in_imm_and_ntf(state);
>                       /* standby all for a SU. remove the SU from the SU
> oper list. */
>                       avd_sg_su_oper_list_del(cb, su, false);
> 
> @@ -2676,6 +2653,8 @@ static uint32_t avd_sg_npm_susi_sucss_si  {
>       AVD_SU_SI_REL *i_susi, *o_susi;
> 
> +     TRACE_ENTER2("'%s', act:%u, state:%u", su->name.c_str(), act,
> state);
> +
>       if (susi != AVD_SU_SI_REL_NULL) {
>               /* assign single SUSI */
>               if (act == AVSV_SUSI_ACT_DEL) {
> @@ -2763,6 +2742,7 @@ static uint32_t avd_sg_npm_susi_sucss_si
>                   (su->sg_of_su->admin_si->si_switch ==
> AVSV_SI_TOGGLE_SWITCH) &&
>                   ((i_susi = avd_su_susi_find(cb, su, su->sg_of_su->admin_si-
> >name))
>                    != AVD_SU_SI_REL_NULL)) {
> +                     su->update_susis_in_imm_and_ntf(state);
>                       /* message with modified quiesced all and an SI is in
> the admin
>                        * pointer with switch value true
>                        */
> @@ -2801,6 +2781,7 @@ static uint32_t avd_sg_npm_susi_sucss_si
>                                  ((i_susi = avd_su_susi_struc_find(cb,su,su-
> >sg_of_su->admin_si->name,false))
>                                  != AVD_SU_SI_REL_NULL)) */
>               else if ((act == AVSV_SUSI_ACT_MOD) && (state ==
> SA_AMF_HA_ACTIVE)) {
> +                     su->update_susis_in_imm_and_ntf(state);
>                       for (i_susi = su->list_of_susi;
>                            (i_susi != AVD_SU_SI_REL_NULL) && (i_susi->fsm
> == AVD_SU_SI_STATE_ASGND);
>                            i_susi = i_susi->su_next) ;
> @@ -2841,7 +2822,7 @@ static uint32_t avd_sg_npm_susi_sucss_si
>                       LOG_EM("%s:%u: %u", __FILE__, __LINE__, su-
> >sg_of_su->sg_fsm_state);
>               }
>       }                       /* else (susi != AVD_SU_SI_REL_NULL) */
> -
> +     TRACE_LEAVE();
>       return NCSCC_RC_SUCCESS;
>  }
> 
> @@ -3870,6 +3851,7 @@ void SG_NPM::node_fail_si_oper(AVD_CL_CB
>                                       }
>                               }
> 
> +                             avd_sg_su_oper_list_del(cb, su, false);
>                               /* Free all the SI assignments to this SU. */
>                               su->delete_all_susis();
> 
> @@ -4508,6 +4490,111 @@ done:
>    return;
>  }
> 
> +/*
> + * @brief  Returns sisu of the SI other than the passed one.
> + * @return ptr to SUSI.
> +*/
> +static AVD_SU_SI_REL *avd_npm_other_sisu(AVD_SU_SI_REL *susi) {
> +  if (susi == susi->si->list_of_sisu)
> +    return susi->si->list_of_sisu->si_next;
> +  else
> +    return susi->si->list_of_sisu;
> +}
> +
> +SaAisErrorT SG_NPM::si_swap(AVD_SI *si, SaInvocationT invocation) {
> +  SaAisErrorT rc = SA_AIS_OK;
> +  AVD_SU_SI_REL *actv_susi = nullptr, *stdby_susi = nullptr;
> +  AVD_SG *sg = si->sg_of_si;
> +  AVD_SU *actv_su = nullptr, *stdby_su = nullptr;
> +  uint32_t count = 0;
> +
> +  TRACE_ENTER2("'%s' sg_fsm_state=%u", si->name.c_str(),
> + si->sg_of_si->sg_fsm_state);
> +
> +  //Validate for designated SI.
> +  if ((rc = si->si_swap_validate()) != SA_AIS_OK)
> +    goto done;
> +
> +  //Check for equal distribution feature.
> +  if (sg->is_equal() == true) {
> +    LOG_NO("%s Equal distribution is enabled, si-swap not allowed", si-
> >name.c_str());
> +    rc = SA_AIS_ERR_BAD_OPERATION;
> +    goto done;
> +  }
> +
> +  //Identify active and standby SUs for this SI.
> +  if (si->list_of_sisu->state == SA_AMF_HA_ACTIVE) {
> +    actv_susi = si->list_of_sisu;
> +    stdby_susi = si->list_of_sisu->si_next;  } else if
> + (si->list_of_sisu->si_next->state == SA_AMF_HA_ACTIVE) {
> +    actv_susi = si->list_of_sisu->si_next;
> +    stdby_susi = si->list_of_sisu;
> +  }
> +  actv_su = actv_susi->su;
> +  stdby_su = stdby_susi->su;
> +
> +  //Since all SIs of active SU will be swapped, validate for all SIs.
> +  for (AVD_SU_SI_REL *susi = actv_su->list_of_susi; susi != nullptr; susi =
> susi->su_next) {
> +    if (susi->si == si)
> +      continue;
> +    if ((rc = susi->si->si_swap_validate()) != SA_AIS_OK)
> +      goto done;
> +  }
> +
> +  /* After completion of operation, active SU will become standby. As a
> standby SU, it should
> +     not cross saAmfSGMaxStandbySIsperSU.
> +   */
> +  if (sg->saAmfSGMaxStandbySIsperSU <
> +    static_cast<SaUint32T>(actv_su-
> >hastate_assignments_count(SA_AMF_HA_ACTIVE))) {
> +    LOG_NO("%s SWAP not allowed as it will violate
> saAmfSGMaxStandbySIsperSU in '%s'.",
> +      si->name.c_str(), actv_su->name.c_str());
> +    rc = SA_AIS_ERR_BAD_OPERATION;
> +    goto done;
> +  }
> +
> +  /* Check 2: In ideal situation if same SU is standby for all SIs then 
> there will
> not
> +     be any change in number of active SUs and number of standby SUs in SG.
> +     But if all SIs of active SU have their standbys on different standby 
> SUs,
> then
> +     si-swap may increase number of active SUs in SG. Check for
> saAmfSGNumPrefActiveSUs.
> +   */
> +  for (AVD_SU_SI_REL *susi = actv_su->list_of_susi; susi != nullptr; susi =
> susi->su_next) {
> +    AVD_SU_SI_REL *tmp_stdby_susi = avd_npm_other_sisu(susi);
> +    if (tmp_stdby_susi->su != stdby_su)
> +     count++;
> +
> +    //TODO: Will remove this check in the second version for the case when
> all actives do
> +    //not have standbys on same SU.
> +    if (count > 0) {
> +      LOG_NO("SWAP not allowed, SIs of SU in which '%s' is active, do not
> have standbys in same SU.",
> +        si->name.c_str());
> +    }
> +    if (saAmfSGNumPrefActiveSUs < (count + avd_sg_get_curr_act_cnt(sg))) {
> +      LOG_NO("%s SWAP not allowed as it will violate
> saAmfSGNumPrefActiveSUs.",
> +        si->name.c_str());
> +      rc = SA_AIS_ERR_BAD_OPERATION;
> +      goto done;
> +    }
> +  }
> +
> +  if (avd_sg_su_si_mod_snd(avd_cb, actv_su, SA_AMF_HA_QUIESCED) ==
> NCSCC_RC_FAILURE) {
> +    LOG_WA("quiesced state transtion failed for '%s'", actv_su-
> >name.c_str());
> +    rc = SA_AIS_ERR_BAD_OPERATION;
> +    goto done;
> +  }
> +
> +  avd_sg_su_oper_list_add(avd_cb, actv_su, false);
> + actv_su->sg_of_su->set_fsm_state(AVD_SG_FSM_SI_OPER);
> +  si->set_si_switch(avd_cb, AVSV_SI_TOGGLE_SWITCH);
> + si->sg_of_si->set_admin_si(si);  si->invocation = invocation;
> +
> +  LOG_NO("%s Swap initiated", si->name.c_str());  saflog(LOG_NOTICE,
> + amfSvcUsrName, "%s Swap initiated", si->name.c_str());
> +
> +done:
> +  TRACE_LEAVE2("sg_fsm_state=%u", si->sg_of_si->sg_fsm_state);
> +  return rc;
> +}
> +
>  SG_NPM::~SG_NPM() {
>  }
> 
> diff --git a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc
> --- a/src/amf/amfd/su.cc
> +++ b/src/amf/amfd/su.cc
> @@ -2,6 +2,7 @@
>   *
>   * (C) Copyright 2008 The OpenSAF Foundation
>   * (C) Copyright 2017 Ericsson AB - All Rights Reserved.
> + * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
>   *
>   * This program is distributed in the hope that it will be useful, but
>   * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY @@ -2628,3 +2629,13 @@ void
> AVD_SU::set_surestart(bool value)  bool AVD_SU::get_surestart() const  {
> return surestart; }
> 
> +/**
> + * @brief  Updates HA state of all SUSIs of this SU in IMM and sends a
> + *          notification for each SUSI.
> + */
> +void AVD_SU::update_susis_in_imm_and_ntf(SaAmfHAStateT ha_state)
> const
> +{
> +  for (AVD_SU_SI_REL *susi = list_of_susi; susi != nullptr; susi = susi-
> >su_next) {
> +    avd_susi_update(susi, ha_state);
> +    avd_gen_su_ha_state_changed_ntf(avd_cb, susi);
> +  }
> +}
> diff --git a/src/amf/amfd/su.h b/src/amf/amfd/su.h
> --- a/src/amf/amfd/su.h
> +++ b/src/amf/amfd/su.h
> @@ -1,6 +1,7 @@
>  /*      -*- OpenSAF  -*-
>   *
>   * (C) Copyright 2008 The OpenSAF Foundation
> + * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
>   *
>   * This program is distributed in the hope that it will be useful, but
>   * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY @@ -147,6 +148,7 @@ class AVD_SU {
>       bool all_comps_in_presence_state(SaAmfPresenceStateT pres)
> const;
>       void set_surestart(bool state);
>       bool get_surestart() const;
> +     void update_susis_in_imm_and_ntf(SaAmfHAStateT ha_state) const;
> 
>   private:
>       void initialize();

------------------------------------------------------------------------------
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