osaf/services/saf/amf/amfd/include/si.h | 6 +-
osaf/services/saf/amf/amfd/include/sirankedsu.h | 19 ++-
osaf/services/saf/amf/amfd/sg_nway_fsm.cc | 132 ++++++++++-------------
osaf/services/saf/amf/amfd/si.cc | 83 +++++++-------
osaf/services/saf/amf/amfd/sirankedsu.cc | 2 +-
5 files changed, 117 insertions(+), 125 deletions(-)
diff --git a/osaf/services/saf/amf/amfd/include/si.h
b/osaf/services/saf/amf/amfd/include/si.h
--- a/osaf/services/saf/amf/amfd/include/si.h
+++ b/osaf/services/saf/amf/amfd/include/si.h
@@ -45,6 +45,7 @@
#include <sirankedsu.h>
#include <amf_defs.h>
#include <ckpt_msg.h>
+#include <algorithm>
#include <vector>
#include <list>
@@ -102,7 +103,7 @@ public:
AVD_APP *app;
AVD_SI *si_list_app_next;
struct avd_sus_per_si_rank_tag *list_of_sus_per_si_rank;
- avd_sirankedsu_t *rankedsu_list_head;
+ std::vector<AVD_SIRANKEDSU*> rankedsu_list;
SaInvocationT invocation;
bool alarm_sent; /* SI unassigned alarm has been sent */
@@ -120,7 +121,7 @@ public:
void set_admin_state(SaAmfAdminStateT state);
void add_rankedsu(const SaNameT *suname, uint32_t saAmfRank);
- void remove_rankedsu(const SaNameT *suname);
+ void remove_rankedsu(const std::string &suname);
void set_si_switch(AVD_CL_CB *cb, const SaToggleState state);
@@ -141,6 +142,7 @@ public:
bool is_sirank_valid(uint32_t newSiRank) const;
void update_sirank(uint32_t newSiRank);
bool si_dep_states_check();
+ const AVD_SIRANKEDSU *get_si_ranked_su(const std::string &su_name)
const;
private:
AVD_SI(const AVD_SI&);
AVD_SI& operator=(const AVD_SI&);
diff --git a/osaf/services/saf/amf/amfd/include/sirankedsu.h
b/osaf/services/saf/amf/amfd/include/sirankedsu.h
--- a/osaf/services/saf/amf/amfd/include/sirankedsu.h
+++ b/osaf/services/saf/amf/amfd/include/sirankedsu.h
@@ -16,10 +16,19 @@
#ifndef SIRANKEDSU_H
#define SIRANKEDSU_H
-typedef struct avd_sirankedsu {
- SaNameT suname;
- uint32_t saAmfRank;
- struct avd_sirankedsu *next;
-} avd_sirankedsu_t;
+class AVD_SIRANKEDSU {
+ public:
+ AVD_SIRANKEDSU(const std::string &name, uint32_t rank) : suname(name),
saAmfRank(rank) {}
+ const std::string& get_suname() const {return suname;}
+ uint32_t get_sa_amf_rank() const {return saAmfRank;}
+
+ private:
+ std::string suname;
+ uint32_t saAmfRank;
+ // disallow copy and assign.
+ AVD_SIRANKEDSU(const AVD_SIRANKEDSU&);
+ void operator=(const AVD_SIRANKEDSU&);
+
+};
#endif
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
@@ -843,25 +843,7 @@ static void avd_sg_nway_swap_si_redistr(
}
TRACE_LEAVE();
}
-/**
- * @brief Finds SiRankedSU node corresponding to the given su and si
- *
- * @param [in] si
- * @param [in] su
- * @param suname
- *
- * @returns pointer to avd_sirankedsu_t
- */
-avd_sirankedsu_t *avd_si_find_sirankedsu(AVD_SI *si, AVD_SU *su)
-{
- avd_sirankedsu_t *temp_su;
-
- for (temp_su = si->rankedsu_list_head; temp_su != nullptr; temp_su =
temp_su->next) {
- if (memcmp(&temp_su->suname, &su->name, sizeof(SaNameT)) == 0)
- break;
- }
- return temp_su;
-}
+
/**
* @brief check if this SU has any non ranked assignments or not
*
@@ -879,13 +861,13 @@ static uint32_t su_has_any_non_ranked_as
for (susi = su->list_of_susi;susi != nullptr;susi = susi->su_next) {
if (susi->state == ha_state) {
- if (nullptr == susi->si->rankedsu_list_head) {
+ if (susi->si->rankedsu_list.empty() == true) {
TRACE("No sirankedsu_assignment ");
found = true;
break;
} else {
/* Check whether the susi assignment is based
on SIRankedSU */
- if (avd_si_find_sirankedsu(susi->si, susi->su)
== nullptr) {
+ if
(susi->si->get_si_ranked_su(Amf::to_string(&susi->su->name)) == nullptr) {
TRACE("NON sirankedsu_assignment");
found = true;
break;
@@ -930,7 +912,7 @@ static AVD_SI * find_the_si_to_transfer(
}
}
/* Check whether this assignment is based on
SIRankedSU, if so dont consider this SI for transfer */
- if (avd_si_find_sirankedsu(susi->si, susi->su) !=
nullptr) {
+ if
(susi->si->get_si_ranked_su(Amf::to_string(&susi->su->name)) != nullptr) {
continue;
}
if (si_to_transfer == nullptr)
@@ -1168,58 +1150,58 @@ AVD_SU *avd_sg_nway_get_su_std_equal(AVD
*
* @returns pointer to the highest ranked SU
*/
-AVD_SU *avd_sg_nway_si_find_highest_sirankedsu(AVD_CL_CB *cb, AVD_SI *si,
AVD_SU **assigned_su)
-{
- AVD_SU_SI_REL *sisu;
- avd_sirankedsu_t *assigned_sirankedsu = nullptr;
- AVD_SU *pref_sirankedsu = nullptr;
- AVD_SU *ranked_su;
- avd_sirankedsu_t *sirankedsu = nullptr;
-
- TRACE_ENTER2("for SI '%s'",si->name.value);
-
- /* Find the SU for which Active role is assigned for this SI */
- for (sisu = si->list_of_sisu; sisu ; sisu = sisu->si_next) {
- if (SA_AMF_HA_ACTIVE == sisu->state) {
- *assigned_su = sisu->su;
- break;
- }
- }
- /* Find the corresponding sirankedsu */
- if (sisu)
- assigned_sirankedsu = avd_si_find_sirankedsu(si, sisu->su);
- else {
- /* Atleast one Active assignment should be there */
- LOG_ER("Not able to find the Active assignment");
- goto done;
- }
-
- /* Iterate through the si->rankedsu_list_head to find the highest
sirankedsu */
- sirankedsu = si->rankedsu_list_head;
- for (; sirankedsu ; sirankedsu = sirankedsu->next) {
- if ((ranked_su =
su_db->find(Amf::to_string(&sirankedsu->suname))) != nullptr) {
- if (ranked_su == *assigned_su) {
- TRACE("SI is assigned to highest SIRankedSU
for this SI");
- break;
- } else {
- if ((ranked_su->saAmfSuReadinessState ==
SA_AMF_READINESS_IN_SERVICE) &&
- (ranked_su->saAmfSUNumCurrActiveSIs <
si->sg_of_si->saAmfSGMaxActiveSIsperSU)) {
- if (assigned_sirankedsu) {
- if
(assigned_sirankedsu->saAmfRank > sirankedsu->saAmfRank) {
- pref_sirankedsu =
ranked_su;
- break;
- }
- } else {
- pref_sirankedsu = ranked_su;
- break;
- }
- }
- }
- }
- }
+AVD_SU *avd_sg_nway_si_find_highest_sirankedsu(AVD_CL_CB *cb, AVD_SI *si,
AVD_SU **assigned_su) {
+ AVD_SU_SI_REL *sisu;
+ const AVD_SIRANKEDSU *assigned_sirankedsu = nullptr;
+ AVD_SU *pref_sirankedsu = nullptr;
+ AVD_SU *ranked_su;
+ AVD_SIRANKEDSU *sirankedsu = nullptr;
+
+ TRACE_ENTER2("for SI '%s'", si->name.value);
+
+ /* Find the SU for which Active role is assigned for this SI */
+ for (sisu = si->list_of_sisu; sisu; sisu = sisu->si_next) {
+ if (SA_AMF_HA_ACTIVE == sisu->state) {
+ *assigned_su = sisu->su;
+ break;
+ }
+ }
+ /* Find the corresponding sirankedsu */
+ if (sisu)
+ assigned_sirankedsu =
si->get_si_ranked_su(Amf::to_string(&sisu->su->name));
+ else {
+ /* Atleast one Active assignment should be there */
+ LOG_ER("Not able to find the Active assignment");
+ goto done;
+ }
+
+ /* Iterate through the si->rankedsu_list_head to find the highest sirankedsu
*/
+
+ for (auto iter = si->rankedsu_list.cbegin(); iter !=
si->rankedsu_list.cend(); ++iter) {
+ sirankedsu = *iter;
+ if ((ranked_su = su_db->find(sirankedsu->get_suname())) != nullptr) {
+ if (ranked_su == *assigned_su) {
+ TRACE("SI is assigned to highest SIRankedSU for this SI");
+ break;
+ } else {
+ if ((ranked_su->saAmfSuReadinessState == SA_AMF_READINESS_IN_SERVICE)
&&
+ (ranked_su->saAmfSUNumCurrActiveSIs <
si->sg_of_si->saAmfSGMaxActiveSIsperSU)) {
+ if (assigned_sirankedsu) {
+ if (assigned_sirankedsu->get_sa_amf_rank() >
sirankedsu->get_sa_amf_rank()) {
+ pref_sirankedsu = ranked_su;
+ break;
+ }
+ } else {
+ pref_sirankedsu = ranked_su;
+ break;
+ }
+ }
+ }
+ }
+ }
done:
- TRACE_LEAVE2(" '%s'",pref_sirankedsu ? (char
*)pref_sirankedsu->name.value:"assigned to highest SIRankedSU");
- return pref_sirankedsu;
+ TRACE_LEAVE2(" '%s'", pref_sirankedsu ? (char *) pref_sirankedsu->name.value
: "assigned to highest SIRankedSU");
+ return pref_sirankedsu;
}
/*****************************************************************************
@@ -1267,7 +1249,7 @@ uint32_t avd_sg_nway_si_assign(AVD_CL_CB
is_all_si_ok = true;
- if (curr_si->list_of_sisu && sg->saAmfSGAutoAdjust &&
(curr_si->rankedsu_list_head)) {
+ if (curr_si->list_of_sisu && sg->saAmfSGAutoAdjust &&
(!curr_si->rankedsu_list.empty())) {
/* The SI has sirankedsu configured and auto adjust
enabled, make
*sure the highest ranked SU has the active assignment
*/
@@ -3564,7 +3546,7 @@ SaAisErrorT SG_NWAY::si_swap(AVD_SI *si,
rc = SA_AIS_ERR_BAD_OPERATION;
goto done;
}
- if ((si->rankedsu_list_head != nullptr) && (sg->saAmfSGAutoAdjust ==
SA_TRUE)) {
+ if ((!si->rankedsu_list.empty()) && (sg->saAmfSGAutoAdjust == SA_TRUE))
{
LOG_NO("%s SIRankedSU configured and autoadjust enabled,
si-swap not allowed", si->name.value);
rc = SA_AIS_ERR_BAD_OPERATION;
goto done;
diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc
--- a/osaf/services/saf/amf/amfd/si.cc
+++ b/osaf/services/saf/amf/amfd/si.cc
@@ -15,7 +15,6 @@
* Ericsson AB
*
*/
-
#include <logtrace.h>
#include <saflog.h>
@@ -210,58 +209,39 @@ void AVD_SI::add_csi_db(AVD_CSI* csi)
* @param suname
* @param saAmfRank
*/
-void AVD_SI::add_rankedsu(const SaNameT *suname, uint32_t saAmfRank)
-{
- avd_sirankedsu_t *tmp;
- avd_sirankedsu_t *prev = nullptr;
- avd_sirankedsu_t *ranked_su;
- TRACE_ENTER();
+void AVD_SI::add_rankedsu(const SaNameT *suname, uint32_t saAmfRank) {
+ AVD_SIRANKEDSU *ranked_su;
+ TRACE_ENTER();
- ranked_su = new avd_sirankedsu_t;
- ranked_su->suname = *suname;
- ranked_su->saAmfRank = saAmfRank;
+ ranked_su = new AVD_SIRANKEDSU(Amf::to_string(suname), saAmfRank);
- for (tmp = rankedsu_list_head; tmp != nullptr; tmp = tmp->next) {
- if (tmp->saAmfRank >= saAmfRank)
- break;
- else
- prev = tmp;
- }
+ rankedsu_list.push_back(ranked_su);
- if (prev == nullptr) {
- ranked_su->next = rankedsu_list_head;
- rankedsu_list_head = ranked_su;
- } else {
- ranked_su->next = prev->next;
- prev->next = ranked_su;
- }
- TRACE_LEAVE();
+ std::sort(rankedsu_list.begin(), rankedsu_list.end(), [](const
AVD_SIRANKEDSU *a, const AVD_SIRANKEDSU * b) -> bool {
+ return a->get_sa_amf_rank() < b->get_sa_amf_rank();
+ });
+
+ TRACE_LEAVE();
}
+
/**
* @brief Remove a SIranked SU from the SI list
*
* @param si
* @param suname
*/
-void AVD_SI::remove_rankedsu(const SaNameT *suname)
-{
- avd_sirankedsu_t *tmp;
- avd_sirankedsu_t *prev = nullptr;
- TRACE_ENTER();
+void AVD_SI::remove_rankedsu(const std::string &suname) {
+ TRACE_ENTER();
+
+ auto pos = std::find_if(rankedsu_list.begin(), rankedsu_list.end(),
[&suname] (AVD_SIRANKEDSU *sirankedsu) -> bool {
+ return sirankedsu->get_suname() == suname;});
- for (tmp = rankedsu_list_head; tmp != nullptr; tmp = tmp->next) {
- if (memcmp(&tmp->suname, suname, sizeof(*suname)) == 0)
- break;
- prev = tmp;
- }
+ if (pos != rankedsu_list.end()) {
+ rankedsu_list.erase(pos);
+ delete *pos;
+ }
- if (prev == nullptr)
- rankedsu_list_head = nullptr;
- else
- prev->next = tmp->next;
-
- delete tmp;
- TRACE_LEAVE();
+ TRACE_LEAVE();
}
void AVD_SI::remove_csi(AVD_CSI* csi)
@@ -316,7 +296,7 @@ AVD_SI::AVD_SI() :
app(nullptr),
si_list_app_next(nullptr),
list_of_sus_per_si_rank(nullptr),
- rankedsu_list_head(nullptr),
+ rankedsu_list {},
invocation(0),
alarm_sent(false)
{
@@ -1501,3 +1481,22 @@ void AVD_SI::update_sirank(uint32_t newS
saAmfSIRank = (newSiRank == 0) ? ~0U : newSiRank;
sg->add_si(this);
}
+
+/*
+ * @brief Get si_ranked_su
+ *
+ * @param [in] @su_name: si ranked su
+ */
+const AVD_SIRANKEDSU *AVD_SI::get_si_ranked_su(const std::string &su_name)
const {
+
+ const AVD_SIRANKEDSU* sirankedsu = nullptr;
+
+ for (auto tmp : rankedsu_list) {
+ if (tmp->get_suname() == su_name) {
+ sirankedsu = tmp;
+ break;
+ }
+ }
+
+ return sirankedsu;
+}
\ No newline at end of file
diff --git a/osaf/services/saf/amf/amfd/sirankedsu.cc
b/osaf/services/saf/amf/amfd/sirankedsu.cc
--- a/osaf/services/saf/amf/amfd/sirankedsu.cc
+++ b/osaf/services/saf/amf/amfd/sirankedsu.cc
@@ -228,7 +228,7 @@ static void avd_sirankedsu_del_si_list(A
sus_per_si_rank->sus_per_si_rank_list_si_next;
}
}
-
sus_per_si_rank->sus_per_si_rank_on_si->remove_rankedsu(&sus_per_si_rank->su_name);
+
sus_per_si_rank->sus_per_si_rank_on_si->remove_rankedsu(Amf::to_string(&sus_per_si_rank->su_name));
sus_per_si_rank->sus_per_si_rank_list_si_next = nullptr;
sus_per_si_rank->sus_per_si_rank_on_si = nullptr;
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel