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