Agree with the analysis but maybe not the solution. I think it would
make more sense to check presence state UNINSTANTIATED for the
components in the service unit. That is aligned with the spec
description and is more understandable.

What do you say?

Thanks,
Hans

On 26 March 2014 06:13,  <[email protected]> wrote:
>  osaf/services/saf/amf/amfnd/comp.cc           |   2 +-
>  osaf/services/saf/amf/amfnd/include/avnd_su.h |   1 +
>  osaf/services/saf/amf/amfnd/susm.cc           |  34 
> ++++++++++++++++++++++++--
>  3 files changed, 33 insertions(+), 4 deletions(-)
>
>
> Problem: During lock of NPI SU, AMF does not failover assignments
> if a healthy component faults.
>
> Reason: During SU lock AMF sends quiesced assignment to NPI SU.
> During quiesced assignment, when termination of one component is in progress,
> one of the healthy components faults. AMF performs cleanup of this failed
> component and it moves the SU from TERMINATING to UNINSTANTIATED state
> without waiting for the terminate command response of the first component.
> Thus SU moves to UNINSTANTIATED state when one of the components is still
> in TERMINATING state.  Now when first component responds for the terminate
> command, AMF sees SU in UNINSTANTIATED state and it does not take any action.
>
> Fix: AMF should move NPI SU in UNINSTANTIATED state only when all the CSIs
> are moved to Removed/Assigned state.
>
> diff --git a/osaf/services/saf/amf/amfnd/comp.cc 
> b/osaf/services/saf/amf/amfnd/comp.cc
> --- a/osaf/services/saf/amf/amfnd/comp.cc
> +++ b/osaf/services/saf/amf/amfnd/comp.cc
> @@ -1633,7 +1633,7 @@ done:
>   *
>   * @returns     true/false
>   **/
> -static bool all_csis_in_removed_state(const AVND_SU *su)
> +bool all_csis_in_removed_state(const AVND_SU *su)
>  {
>         AVND_COMP_CSI_REC *curr_csi;
>         AVND_SU_SI_REC *curr_si;
> 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
> @@ -406,5 +406,6 @@ extern struct avnd_su_si_rec *avnd_silis
>  extern void su_get_config_attributes(AVND_SU *su);
>  extern bool sufailover_in_progress(const AVND_SU *su);
>  extern bool sufailover_during_nodeswitchover(const AVND_SU *su);
> +extern bool all_csis_in_removed_state(const AVND_SU *su);
>
>  #endif
> 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
> @@ -2358,6 +2358,34 @@ uint32_t avnd_su_pres_terming_comptermfa
>         return rc;
>  }
>
> +/**
> + * @brief       Checks if all csis of all the sis in this su are in removed 
> state
> + *
> + * @param [in]  cmp
> + *
> + * @returns     true/false
> + **/
> +static bool all_csis_in_assigned_state(const AVND_SU *su)
> +{
> +        AVND_COMP_CSI_REC *curr_csi;
> +        AVND_SU_SI_REC *curr_si;
> +        bool all_csi_removed = true;
> +
> +        for (curr_si = (AVND_SU_SI_REC 
> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
> +                        curr_si && all_csi_removed;
> +                        curr_si = (AVND_SU_SI_REC 
> *)m_NCS_DBLIST_FIND_NEXT(&curr_si->su_dll_node)) {
> +                for (curr_csi = (AVND_COMP_CSI_REC 
> *)m_NCS_DBLIST_FIND_FIRST(&curr_si->csi_list);
> +                                curr_csi; curr_csi = (AVND_COMP_CSI_REC 
> *)m_NCS_DBLIST_FIND_NEXT(&curr_csi->si_dll_node)) {
> +                        if 
> (!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi)) {
> +                                all_csi_removed= false;
> +                                break;
> +                        }
> +                }
> +        }
> +
> +        return all_csi_removed;
> +}
> +
>  /****************************************************************************
>    Name          : avnd_su_pres_terming_compuninst_hdler
>
> @@ -2468,10 +2496,10 @@ uint32_t avnd_su_pres_terming_compuninst
>                                                        
> AVND_COMP_CLC_PRES_FSM_EV_TERM);
>                         if (NCSCC_RC_SUCCESS != rc)
>                                 goto done;
> -               } else {
> -                       TRACE("SI Assignment done");
> +               }
> +
> +               if (all_csis_in_assigned_state(su) || 
> all_csis_in_removed_state(su))
>                         avnd_su_pres_state_set(su, 
> SA_AMF_PRESENCE_UNINSTANTIATED);
> -               }
>         }
>
>   done:
>
> ------------------------------------------------------------------------------
> Learn Graph Databases - Download FREE O'Reilly Book
> "Graph Databases" is the definitive new guide to graph databases and their
> applications. Written by three acclaimed leaders in the field,
> this first edition is now available. Download your free book today!
> http://p.sf.net/sfu/13534_NeoTech
> _______________________________________________
> Opensaf-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to