Hi Minh,
                Thanks for the patch.

I tested the following scenarios and it worked fine (Configurations: 3 Comps 
and 3 CSIs with CSI dep configured) :

1. Unlock SU and report error from comp1 in Act assignment.
2. Unlock SI and report error from comp1 in Act assignment.

I also tested some basic tests with error report like SU lock/unlock, SI 
lock/unlock.

I will commit it after running some more tests.

Ack.

Thanks
-Nagu

> -----Original Message-----
> From: Minh Hon Chau [mailto:[email protected]]
> Sent: 06 August 2015 10:23
> To: [email protected]; Nagendra Kumar; Praveen Malviya;
> [email protected]
> Cc: [email protected]
> Subject: [PATCH 1 of 1] AMFND: Comp receives QUIESCED csi when it has not
> received ACTIVE csi [#1386] V4
> 
>  osaf/services/saf/amf/amfnd/comp.cc             |  47 ++++++++++++++++++---
>  osaf/services/saf/amf/amfnd/include/avnd_comp.h |   9 ++++
>  osaf/services/saf/amf/amfnd/sidb.cc             |   2 +-
>  osaf/services/saf/amf/amfnd/susm.cc             |  55 
> +++++++++++++++++++-----
>  4 files changed, 92 insertions(+), 21 deletions(-)
> 
> 
> If su-si active assignment is on-going, some csi(s) may get assigned but other
> csi(s) could be still in unassigned state. At this point, assigning component
> issues saAmfErrorReport(COMPONENT_FAILOVER), AMFND receives QUIESCED
> assignment from AMFD. The unassigned yet component also receives the
> quiesced csi callback that should not happen
> 
> Adding new flag suspending_assignment, which indicates the unassigned csi(s)
> will not involve in QUIESCED/QUIESCING assignment loop. Once su-si
> QUIESCED/QUIESCING assignment is done, this flag reset to false.
> 
> 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
> @@ -906,6 +906,7 @@ uint32_t avnd_comp_csi_assign(AVND_CB *c
>       /* flags to indicate the prv & curr inst states of an npi comp */
>       bool npi_prv_inst = true, npi_curr_inst = true;
>       AVND_COMP_CSI_REC *curr_csi = 0;
> +     AVND_COMP_CSI_REC *t_csi = 0;
>       AVND_COMP_CLC_PRES_FSM_EV comp_ev =
> AVND_COMP_CLC_PRES_FSM_EV_MAX;
>       bool mark_csi = false;
>       uint32_t rc = NCSCC_RC_SUCCESS;
> @@ -1000,11 +1001,29 @@ uint32_t avnd_comp_csi_assign(AVND_CB *c
>                                       if (NCSCC_RC_SUCCESS != rc)
>                                               goto done;
>                               } else {
> -                                     /* active/standby can be directly
> assigned */
> -                                     rc = avnd_comp_cbk_send(cb, comp,
> AVSV_AMF_CSI_SET, 0, 0);
> -                                     if (NCSCC_RC_SUCCESS != rc)
> -                                             goto done;
> -                                     mark_csi = true;
> +                                     if (curr_csi->curr_assign_state ==
> AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED &&
> +                                             curr_csi->prv_assign_state ==
> AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED) {
> +                                             // Mark
> suspending_assignment for all unassigned csi(s) which are going
> +                                             // to be assigned to *curr_csi-
> >comp*
> +                                             for (t_csi =
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(
> &curr_csi->comp->csi_list));
> +                                                     t_csi;
> +                                                     t_csi =
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(
> &t_csi->comp_dll_node))) {
> +                                                     if (t_csi-
> >curr_assign_state == AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED &&
> +                                                             t_csi-
> >prv_assign_state == AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED) {
> +                                                             t_csi-
> >suspending_assignment = true;
> +                                                     }
> +                                             }
> +                                             // just generate csi-oper done
> for unassigned csi
> +                                             rc =
> avnd_comp_csi_assign_done(cb, comp, 0);
> +                                             if (NCSCC_RC_SUCCESS != rc)
> +                                                     goto done;
> +                                     } else {
> +                                             /* active/standby can be
> directly assigned */
> +                                             rc = avnd_comp_cbk_send(cb,
> comp, AVSV_AMF_CSI_SET, 0, 0);
> +                                             if (NCSCC_RC_SUCCESS != rc)
> +                                                     goto done;
> +                                             mark_csi = true;
> +                                     }
>                               }
>                       } else {
>                               /* assign the csi as the comp is aware of
> atleast one csi */ @@ -1222,7 +1241,16 @@ uint32_t
> avnd_comp_csi_remove(AVND_CB *c
>                            curr_csi;
>                            curr_csi =
> 
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(
> &curr_csi->comp_dll_node))) {
> -                             if
> ((m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
> +
> +                             // silently removing csi, don't issue callback
> +                             if
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(curr_csi)) {
> +
>       m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
> +
> AVND_COMP_CSI_ASSIGN_STATE_REMOVING);
> +
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi,
> +
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
> +                                     rc = avnd_comp_csi_remove_done(cb,
> comp, csi);
> +                                     goto done;
> +                             } else if
> +((m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
>                                   ||
> (m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
>                                   ||
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_csi))) {
>                                       if
> (!csi_of_same_si_in_removing_state(curr_csi->comp,curr_csi->si))
> @@ -1404,6 +1432,10 @@ static bool all_csis_at_rank_assigned(st
> 
>                       LOG_IN("Ignoring Failed/Unreg Comp'%s' comp pres
> state=%u, comp flag %x, su pres state %u",
>                               csi->comp->name.value, csi->comp->pres, csi-
> >comp->flag, csi->comp->su->pres);
> +                     } else if
> (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(csi->comp) &&
> +                                     csi->suspending_assignment) {
> +                             LOG_IN("Ignoring quiescing/quiesced
> assignment on unassigned comp'%s'",
> +                                             csi->comp->name.value);
>                       } else {
>                               TRACE_LEAVE2("false");
>                               return false;
> @@ -1627,6 +1659,7 @@ bool all_csis_in_removed_state(const AVN
>       AVND_COMP_CSI_REC *curr_csi;
>       AVND_SU_SI_REC *curr_si;
>       bool all_csi_removed = true;
> +     TRACE_ENTER2("'%s'",su->name.value);
> 
>       for (curr_si = (AVND_SU_SI_REC *)m_NCS_DBLIST_FIND_FIRST(&su-
> >si_list);
>                       curr_si && all_csi_removed;
> @@ -1639,7 +1672,7 @@ bool all_csis_in_removed_state(const AVN
>                       }
>               }
>       }
> -
> +     TRACE_LEAVE2("%u", all_csi_removed);
>       return all_csi_removed;
>  }
> 
> /****************************************************************
> ************
> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> --- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> +++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> @@ -192,6 +192,15 @@ typedef struct avnd_comp_csi_rec {
>                               removal callback only after CSI gets assigned.
> AMFND will mark this flag
>                               so that it can start removal after CSI is
> assigned.
>                              */
> +     bool suspending_assignment; /* This flag is used when su-si active
> assignment is on-going,
> +                             some other csi may get assigned but *this* csi
> is still in
> +                             unassigned state. At this point, AMFND
> receives QUIESCED or
> +                             QUIESCING assignment from AMFD. This csi
> has never got active
> +                             assignment so the quiesced csi callback
> should not be issued.
> +                             This flag is true, which indicates this csi is 
> not
> involved
> +                             in QUIESCED/QUIESCING assignment loop.
> Once su-si QUIESCED/
> +                             QUIESCING assignment is done, this flag reset
> to false. */
> +
>  } AVND_COMP_CSI_REC;
> 
>  #define AVND_COMP_CSI_REC_NULL ((AVND_COMP_CSI_REC *)0) diff --git
> a/osaf/services/saf/amf/amfnd/sidb.cc b/osaf/services/saf/amf/amfnd/sidb.cc
> --- a/osaf/services/saf/amf/amfnd/sidb.cc
> +++ b/osaf/services/saf/amf/amfnd/sidb.cc
> @@ -424,7 +424,7 @@ AVND_COMP_CSI_REC *avnd_su_si_csi_rec_ad
>       csi_rec->si_name = si_rec->name;
>       csi_rec->su_name = su->name;
>       csi_rec->pending_removal = false;
> -
> +     csi_rec->suspending_assignment = false;
>       return csi_rec;
> 
>   err:
> 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
> @@ -428,16 +428,24 @@ static bool csi_of_same_si_in_assigning_  {
>       AVND_COMP_CSI_REC *curr_csi;
>       bool all_csi_assigned = true;
> -
> +     TRACE_ENTER();
>       for (curr_csi =
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(
> &cmp->csi_list));
>               curr_csi;
>               curr_csi =
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(
> &curr_csi->comp_dll_node))) {
> +             TRACE("curr_csi:'%s', prv_assign_state:%u
> curr_assign_state:%u, suspending_assignment:%u",
> +                             curr_csi->name.value,
> +                             curr_csi->prv_assign_state,
> +                             curr_csi->curr_assign_state,
> +                             curr_csi->suspending_assignment);
>               if ((curr_csi->si == si) &&
> !m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_csi)) {
> -                     all_csi_assigned = false;
> -                     break;
> +                     //ignore suspending_assignment
> +                     if (!curr_csi->suspending_assignment) {
> +                             all_csi_assigned = false;
> +                             break;
> +                     }
>               }
>       }
> -
> +     TRACE_LEAVE();
>       return all_csi_assigned;
>  }
>  /**
> @@ -521,14 +529,17 @@ static uint32_t assign_si_to_su(AVND_SU_
>                                               }
>                                       /*if ((!single_csi) && (false == 
> curr_csi-
> >comp->assigned_flag) &&
> 
>       (m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi)))*/
> -                                             if ((false == curr_csi->comp-
> >assigned_flag) &&
> -
>       (m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi))) {
> -                                                     if
> (csi_of_same_si_in_assigning_state(curr_csi->comp, si))
> -                                                             curr_csi-
> >comp->assigned_flag = true;
> +                                             if (false == curr_csi->comp-
> >assigned_flag) {
> +                                                     if
> (csi_of_same_si_in_assigning_state(curr_csi->comp, si)) {
> +
>       curr_csi->comp->assigned_flag = true;
> +                                                     }
>                                               }
>                                       } else {
> -
>       m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
> -
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi,
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
> +                                             // Don't move csi to ASSIGNED
> state if its assignment's suspending
> +                                             if (!curr_csi-
> >suspending_assignment) {
> +
>       m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
> +
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi,
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
> +                                             }
>                                       }
>                               }
>                       }
> @@ -828,12 +839,14 @@ static bool susi_operation_in_progress(A
>       AVND_COMP_CSI_REC *curr_csi, *t_csi;
>       bool opr_done = true;
> 
> +     TRACE_ENTER2("'%s' '%s'", su->name.value, si ? si->name.value :
> NULL);
> +
>       for (curr_si = (si) ? si : (AVND_SU_SI_REC
> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
>                       curr_si && opr_done; curr_si = (si) ? 0 :
> (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_ASSIGNING(curr_csi) ||
> m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(curr_csi)) {
> -                             opr_done = false;
> +                             opr_done = false;
>                               break;
>                       } else if (m_AVND_COMP_IS_FAILED(curr_csi->comp)){
>                               for (t_si = (si) ? si : (AVND_SU_SI_REC
> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
> @@ -847,8 +860,11 @@ static bool susi_operation_in_progress(A
>                                               else if
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(t_csi) ||
> 
>       m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(t_csi) ||
> 
>       m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(t_csi)) {
> -                                                     opr_done = false;
> -                                                     break;
> +
> +                                                     if (!t_csi-
> >suspending_assignment) {
> +                                                             opr_done =
> false;
> +                                                             break;
> +                                                     }
>                                               }
>                                       }
>                               }
> @@ -856,6 +872,19 @@ static bool susi_operation_in_progress(A
>               }
>       }
> 
> +     // reset suspending_assignment flag if opr_done
> +     if (opr_done) {
> +             for (curr_si = (si) ? si : (AVND_SU_SI_REC
> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
> +                             curr_si; curr_si = (si) ? 0 : (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 (curr_csi->suspending_assignment)
> +                                     curr_csi->suspending_assignment =
> false;
> +                     }
> +             }
> +     }
> +
> +     TRACE_LEAVE2("%u", opr_done);
>       return opr_done;
>  }
> 

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to