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