Hi Minh,
I tested with two SIs and SU unlock commands hangs. Can you
please check and fix this issue and float the patch again.
Thanks
-Nagu
> -----Original Message-----
> From: Minh Hon Chau [mailto:[email protected]]
> Sent: 15 July 2015 09:22
> 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] V2
>
> osaf/services/saf/amf/amfnd/comp.cc | 37
> ++++++++++++++++++++----
> 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 | 24 ++++++++++++++--
> 4 files changed, 61 insertions(+), 11 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
> @@ -1000,11 +1000,20 @@ 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) {
> + // just generate csi-oper done
> for unassigned csi
> + curr_csi-
> >suspending_assignment = true;
> + 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 +1231,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 +1422,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 +1649,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 +1662,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
> @@ -828,12 +828,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 +849,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 +861,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;
> }
>
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel