osaf/services/saf/amf/amfnd/clc.cc | 4 +++-
osaf/services/saf/amf/amfnd/err.cc | 14 +++++++++++++-
osaf/services/saf/amf/amfnd/include/avnd_su.h | 1 +
osaf/services/saf/amf/amfnd/susm.cc | 9 ++++-----
4 files changed, 21 insertions(+), 7 deletions(-)
If a SU has one component and it moves to UNINSTANTIATED state then AMF does
not generate
presense state change notification for UNINSTANTIATED state of SU.
During component failover, a component moves to TERMINATING state as it is
cleaned up by AMF. This leads to TERMINATING state of SU. After successful
termination of the component it is marked as UNINSTANTIATED but SU remains
in TERMINATING state. Repair of SU leads to re-instantiation of component.
Thus component transtions from UNINSTANTIATED->INSTANTIATED-> INSTANTIATED
state. But SU is transitioning from TERMINATING to INSTANTIATED state directly.
Since presence state of SU represents combined presence states of components,
SU should also be marked as UNINSTANTIATED when a single component is marked
as UNINSTANTIATED. Same behaviour is true if all the component are
UNINSTANTIATED due to component failover.
Patch marks presence state of SU UNINSTANTIATED if all of its components are
UNINSTANTIATED during component failover.
diff --git a/osaf/services/saf/amf/amfnd/clc.cc
b/osaf/services/saf/amf/amfnd/clc.cc
--- a/osaf/services/saf/amf/amfnd/clc.cc
+++ b/osaf/services/saf/amf/amfnd/clc.cc
@@ -1274,7 +1274,9 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
ev = AVND_SU_PRES_FSM_EV_COMP_TERM_FAIL;
else if ((SA_AMF_PRESENCE_TERMINATING == final_st) &&
(comp->su->pres == SA_AMF_PRESENCE_RESTARTING))
ev = AVND_SU_PRES_FSM_EV_COMP_TERMINATING;
- else if ((sufailover_in_progress(comp->su) ||
sufailover_during_nodeswitchover(comp->su)) &&
+ else if ((sufailover_in_progress(comp->su) ||
+ (avnd_cb->term_state ==
AVND_TERM_STATE_NODE_SWITCHOVER_STARTED) ||
+ (all_comps_terminated_in_su(comp->su)
== true)) &&
(SA_AMF_PRESENCE_UNINSTANTIATED == final_st))
/* If sufailover flag is enabled, then SU FSM needs to
be triggered in both sufailover
and nodeswitchover escalation.
diff --git a/osaf/services/saf/amf/amfnd/err.cc
b/osaf/services/saf/amf/amfnd/err.cc
--- a/osaf/services/saf/amf/amfnd/err.cc
+++ b/osaf/services/saf/amf/amfnd/err.cc
@@ -960,7 +960,7 @@ uint32_t avnd_err_rcvr_node_failover(AVN
uint32_t avnd_err_su_repair(AVND_CB *cb, AVND_SU *su)
{
AVND_COMP *comp = 0;
- bool is_en;
+ bool is_en, is_uninst = false, is_comp_insting = false;
uint32_t rc = NCSCC_RC_SUCCESS;
TRACE_ENTER();
@@ -973,6 +973,9 @@ uint32_t avnd_err_su_repair(AVND_CB *cb,
if (su->pres == SA_AMF_PRESENCE_INSTANTIATION_FAILED)
return rc;
+ if (all_comps_terminated_in_su(su) == true)
+ is_uninst = true;
+
/* scan & instantiate failed pi comps */
for (comp =
m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
comp; comp =
m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&comp->su_dll_node))) {
@@ -989,6 +992,9 @@ uint32_t avnd_err_su_repair(AVND_CB *cb,
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_FLAG_CHANGE);
}
}
+ if (comp->pres == SA_AMF_PRESENCE_INSTANTIATING)
+ is_comp_insting = true;
+
} /* for */
if (!m_AVND_SU_IS_PREINSTANTIABLE(su)) {
@@ -1008,6 +1014,12 @@ uint32_t avnd_err_su_repair(AVND_CB *cb,
}
}
+ /* This is the case when SU is in uninstantiated state and one of the
components
+ is moved to instantiating state. Mark SU
SA_AMF_PRESENCE_INSTANTIATING as there
+ is no such event handler and event in SU FSM.
+ */
+ if ((is_uninst == true) && (is_comp_insting == true))
+ avnd_su_pres_state_set(su, SA_AMF_PRESENCE_INSTANTIATING);
done:
TRACE_LEAVE2("retval=%u", rc);
return rc;
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
@@ -407,6 +407,7 @@ extern bool sufailover_in_progress(const
extern bool sufailover_during_nodeswitchover(const AVND_SU *su);
extern bool all_csis_in_removed_state(const AVND_SU *su);
extern void su_reset_restart_count_in_comps(const AVND_SU *su);
+extern bool all_comps_terminated_in_su(const AVND_SU *su);
void su_increment_su_restart_count(AVND_SU& su);
void su_increment_comp_restart_count(AVND_SU& su);
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
@@ -1329,7 +1329,7 @@ done:
* @param su
* @return bool
*/
-static bool all_comps_terminated_in_su(const AVND_SU *su)
+bool all_comps_terminated_in_su(const AVND_SU *su)
{
AVND_COMP *comp;
@@ -1566,7 +1566,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
}
else
{
- if (m_AVND_SU_IS_FAILED(su)) {
+ if (m_AVND_SU_IS_FAILED(su) &&
(su->si_list.n_nodes == 0)) {
m_AVND_SU_FAILED_RESET(su);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
su, AVND_CKPT_SU_FLAG_CHANGE);
}
@@ -2472,9 +2472,8 @@ uint32_t avnd_su_pres_terming_compuninst
TRACE_ENTER2("Component Uninstantiated event in the Terminating
state:'%s' : '%s'",
su->name.value, compname);
- /* This case is for handling the case of admn su term while su is
restarting */
- if (m_AVND_SU_IS_PREINSTANTIABLE(su) && m_AVND_SU_IS_FAILED(su) &&
- (m_AVND_SU_IS_ADMN_TERM(su) ||
sufailover_in_progress(su)))
+ /* Mark failed PI SU uninstantiated whenever all components are
uninstantiated. */
+ if (m_AVND_SU_IS_PREINSTANTIABLE(su) && m_AVND_SU_IS_FAILED(su))
{
TRACE("PI SU");
for (curr_comp =
m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel