osaf/services/saf/amf/amfd/include/sg.h | 2 +-
osaf/services/saf/amf/amfd/sg.cc | 21 +++++++++++++++++++++
osaf/services/saf/amf/amfd/sg_nway_fsm.cc | 27 +++++++++++++++++++++++++++
osaf/services/saf/amf/amfd/sg_nwayact_fsm.cc | 24 ++++++++++++++++++++++++
4 files changed, 73 insertions(+), 1 deletions(-)
#
#Problem: The implementation has not respected the AMF spec
#according to the configuration of saAmfSGNumPrefAssignedSUs
#
#Analysis: In AMF spec, the 3.6.4.3 and 3.6.5.3 mention that the
#saAmfSGNumPrefAssignedSUs affected in assignment in nway and
#nway-active sg
#
#Change: Skip the SI assignment for the unassigned SU if the
#current number of assigned SU exceeding the saAmfSGNumPrefAssignedSUs
diff --git a/osaf/services/saf/amf/amfd/include/sg.h
b/osaf/services/saf/amf/amfd/include/sg.h
--- a/osaf/services/saf/amf/amfd/include/sg.h
+++ b/osaf/services/saf/amf/amfd/include/sg.h
@@ -356,6 +356,6 @@ extern void avd_su_role_failover(struct
extern bool sg_is_tolerance_timer_running_for_any_si(AVD_SG *sg);
extern void avd_sg_adjust_config(AVD_SG *sg);
extern uint32_t sg_instantiated_su_count(const AVD_SG *sg);
-
+extern uint32_t sg_assigned_su_count(const AVD_SG *sg);
#endif
diff --git a/osaf/services/saf/amf/amfd/sg.cc b/osaf/services/saf/amf/amfd/sg.cc
--- a/osaf/services/saf/amf/amfd/sg.cc
+++ b/osaf/services/saf/amf/amfd/sg.cc
@@ -1617,3 +1617,24 @@ uint32_t sg_instantiated_su_count(const
return inst_su_count;
}
+/**
+ * @brief Counts number of assigned su in the sg.
+ * @param Service Group
+ *
+ * @return Number of assigned su in the sg.
+ */
+uint32_t sg_assigned_su_count(const AVD_SG *sg)
+{
+ uint32_t su_count;
+ const AVD_SU *su;
+
+ for (su = sg->list_of_su, su_count = 0; su != NULL; su =
su->sg_list_su_next) {
+ TRACE_1("su'%s', current number of active SIs'%u'",
su->name.value, su->saAmfSUNumCurrActiveSIs);
+ if (su->saAmfSUNumCurrActiveSIs > 0 ||
su->saAmfSUNumCurrStandbySIs > 0) {
+ su_count++;
+ }
+ }
+
+ return su_count;
+}
+
diff --git a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
--- a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
+++ b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
@@ -1318,6 +1318,13 @@ AVD_SU *avd_sg_nway_get_su_std_equal(AVD
(curr_su->saAmfSUNumCurrStandbySIs >=
curr_su->sg_of_su->saAmfSGMaxStandbySIsperSU)))
continue;
+ /* Do not pick up unassigned su if current number of assigned
su
+ * exceeds the saAmfSGNumPrefAssignedSUs
+ */
+ if ((sg_assigned_su_count(curr_su->sg_of_su) >=
curr_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (curr_su->saAmfSUNumCurrActiveSIs == 0) &&
(curr_su->saAmfSUNumCurrStandbySIs == 0))
+ continue;
+
l_flag = true;
/* Get the current no of Standby assignments on the su */
@@ -1508,6 +1515,14 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
if (!curr_su)
continue;
+ /* Do not pick up unassigned su if current number of
assigned su
+ * exceeds the saAmfSGNumPrefAssignedSUs
+ */
+ if ((sg_assigned_su_count(curr_su->sg_of_su) >=
curr_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (curr_su->saAmfSUNumCurrActiveSIs == 0) &&
(curr_su->saAmfSUNumCurrStandbySIs == 0)) {
+ curr_su = 0;
+ continue;
+ }
if ((curr_su->saAmfSuReadinessState ==
SA_AMF_READINESS_IN_SERVICE) &&
((curr_su->sg_of_su->saAmfSGMaxActiveSIsperSU == 0)
||
(curr_su->saAmfSUNumCurrActiveSIs <
curr_su->sg_of_su->saAmfSGMaxActiveSIsperSU)))
@@ -1525,6 +1540,10 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
for (curr_su = sg->list_of_su; curr_su; curr_su =
curr_su->sg_list_su_next) {
if (SA_AMF_READINESS_IN_SERVICE ==
curr_su->saAmfSuReadinessState) {
is_all_su_oos = false;
+ if
((sg_assigned_su_count(curr_su->sg_of_su) >=
curr_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+
(curr_su->saAmfSUNumCurrActiveSIs == 0) && (curr_su->saAmfSUNumCurrStandbySIs
== 0))
+ continue;
+
/* if equal distribution is needed when
all SUs are of
* equal rank or no rank configured for
any of the SU
*/
@@ -1614,6 +1633,10 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
(curr_su->saAmfSUNumCurrStandbySIs >=
curr_su->sg_of_su->saAmfSGMaxStandbySIsperSU)))
continue;
+ if ((sg_assigned_su_count(curr_su->sg_of_su) >=
curr_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (curr_su->saAmfSUNumCurrActiveSIs == 0) &&
(curr_su->saAmfSUNumCurrStandbySIs == 0))
+ continue;
+
/* verify if this su does not have this assignment */
if (avd_su_susi_find(cb, curr_su, &curr_si->name) !=
AVD_SU_SI_REL_NULL)
continue;
@@ -1677,6 +1700,10 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
(curr_su->saAmfSUNumCurrStandbySIs >=
curr_su->sg_of_su->saAmfSGMaxStandbySIsperSU)))
continue;
+ if ((sg_assigned_su_count(curr_su->sg_of_su) >=
curr_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (curr_su->saAmfSUNumCurrActiveSIs == 0) &&
(curr_su->saAmfSUNumCurrStandbySIs == 0))
+ continue;
+
su_found = true;
/* verify if this su does not have this assignment */
diff --git a/osaf/services/saf/amf/amfd/sg_nwayact_fsm.cc
b/osaf/services/saf/amf/amfd/sg_nwayact_fsm.cc
--- a/osaf/services/saf/amf/amfd/sg_nwayact_fsm.cc
+++ b/osaf/services/saf/amf/amfd/sg_nwayact_fsm.cc
@@ -105,6 +105,14 @@ AVD_SU *avd_sg_nacvred_su_chose_asgn(AVD
continue;
}
+ /* Do not pick up unassigned su if current number of
assigned su
+ * exceeds the saAmfSGNumPrefAssignedSUs
+ */
+ if ((sg_assigned_su_count(i_su->sg_of_su) >=
i_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (i_su->saAmfSUNumCurrActiveSIs == 0)) {
+ i_su = i_su->sg_list_su_next;
+ continue;
+ }
if (avd_su_susi_find(cb, i_su, &i_si->name)
!= AVD_SU_SI_REL_NULL) {
/* This SU has already a assignment for this SI
go to the
@@ -145,6 +153,12 @@ AVD_SU *avd_sg_nacvred_su_chose_asgn(AVD
continue;
}
+ if ((sg_assigned_su_count(i_su->sg_of_su) >=
i_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (i_su->saAmfSUNumCurrActiveSIs == 0)) {
+ i_su = i_su->sg_list_su_next;
+ continue;
+ }
+
l_flag = true;
if (m_AVD_SI_ACTV_MAX_SU(i_si) <=
m_AVD_SI_ACTV_CURR_SU(i_si)) {
@@ -1998,6 +2012,16 @@ static AVD_SU *avd_get_qualified_su(AVD_
i_su = i_su->sg_list_su_next;
continue;
}
+
+ /* Do not pick up unassigned su if current number of assigned
su
+ * exceeds the saAmfSGNumPrefAssignedSUs
+ */
+ if ((sg_assigned_su_count(i_su->sg_of_su) >=
i_su->sg_of_su->saAmfSGNumPrefAssignedSUs) &&
+ (i_su->saAmfSUNumCurrActiveSIs == 0)) {
+ i_su = i_su->sg_list_su_next;
+ continue;
+ }
+
l_flag = true;
if (avd_su_susi_find(avd_cb, i_su, &i_si->name) !=
AVD_SU_SI_REL_NULL) {
/* This SU has already a assignment for this SI go to
the
------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees_APR
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel