Ack, code review only./Regards HansN
-----Original Message-----
From: [email protected] [mailto:[email protected]]
Sent: den 16 juni 2014 07:08
To: Hans Feldt; Hans Nordebäck; [email protected]
Cc: [email protected]
Subject: [PATCH 1 of 1] amfd : use of db_template in si_dep.cc [#713]
osaf/services/saf/amf/amfd/include/cb.h | 7 -
osaf/services/saf/amf/amfd/include/si_dep.h | 53 +-
osaf/services/saf/amf/amfd/include/timer.h | 4 +-
osaf/services/saf/amf/amfd/si_dep.cc | 709 ++++++++-------------------
osaf/services/saf/amf/amfd/siass.cc | 32 +-
5 files changed, 233 insertions(+), 572 deletions(-)
Following changes have been done:
1)Replaced patricia tree using db_template.
2)Instead of AVD_SI_SI_DEP_INDX and AVD_SI_SI_DEP, now there is
a class AVD_SI_DEP.
3)Earlier there were two separate databases, one had sponsor as primary
key and dependent as secondary key and other database had vice versa.
This has been replaced by a single database of AVD_SI_DEP.
TODO:Use of methods and other proposed changes as per #713.
diff --git a/osaf/services/saf/amf/amfd/include/cb.h
b/osaf/services/saf/amf/amfd/include/cb.h
--- a/osaf/services/saf/amf/amfd/include/cb.h
+++ b/osaf/services/saf/amf/amfd/include/cb.h
@@ -103,13 +103,6 @@ typedef struct avd_evt_queue_list {
AVD_EVT_QUEUE *tail;
} AVD_EVT_QUEUE_LIST;
-/* SI-SI dependency database */
-typedef struct avd_si_dep {
- NCS_PATRICIA_TREE spons_anchor; /* Tree of SI-SI dep, sponsor SI acts
- as a primary key */
- NCS_PATRICIA_TREE dep_anchor; /* Tree of SI-SI dep, dependent SI
- acts as a primary key */
-} AVD_SI_DEP;
/* AVD IMM Admin Operation Callback */
typedef struct admin_oper_cbk {
diff --git a/osaf/services/saf/amf/amfd/include/si_dep.h
b/osaf/services/saf/amf/amfd/include/si_dep.h
--- a/osaf/services/saf/amf/amfd/include/si_dep.h
+++ b/osaf/services/saf/amf/amfd/include/si_dep.h
@@ -45,52 +45,31 @@ typedef struct avd_si_dep_name_list {
struct avd_si_dep_name_list *next;
} AVD_SI_DEP_NAME_LIST;
-/*
- * Index data to retrieve a specific SI-SI dep. data record from its
- * database (si_dep: dep_anchor, spons_anchor) defined AvD CB .
- */
-typedef struct avd_si_si_dep_indx_tag {
- /* primary-key: sponsor SI name */
- SaNameT si_name_prim;
+class AVD_SI_DEP {
+public:
+ SaNameT name;
+ AVD_SI *spons_si;
+ SaNameT spons_name;
+ AVD_SI *dep_si;
+ SaNameT dep_name;
+ SaTimeT saAmfToleranceTime;
+ AVD_TMR si_dep_timer;
- /* secondary-key: dependant SI name */
- SaNameT si_name_sec;
-} AVD_SI_SI_DEP_INDX;
-
-/*
- * Data structure that holds SI-SI dependency data, same record is updated
- * in two SI_SI dep anch tree's. One of the tree hold sponsor SI name as the
- * primary indx & dependent SI name as secondary indx (as per SI_SI dep cfg).
- * The other one has vis-versa.
- */
-typedef struct avd_si_si_dep {
- NCS_PATRICIA_NODE tree_node_imm;
- NCS_PATRICIA_NODE tree_node;
-
- /* Index info to retrieve the record */
- AVD_SI_SI_DEP_INDX indx_imm;
- AVD_SI_SI_DEP_INDX indx;
-
- uint32_t si_dep_hdl;
- SaTimeT saAmfToleranceTime;
- AVD_TMR si_dep_timer; /* SI-SI dep. tol timer */
- bool unassign_event;
-} AVD_SI_SI_DEP;
+};
/* Spons-SI node of the spons-list in SI struct */
typedef struct avd_spons_si_tag {
struct avd_si_tag *si;
- AVD_SI_SI_DEP *sidep_rec;
+ AVD_SI_DEP *sidep_rec;
struct avd_spons_si_tag *next;
} AVD_SPONS_SI_NODE;
-#define AVD_SI_SI_DEP_NULL ((AVD_SI_SI_DEP *)0)
+extern AmfDb<std::pair<std::string, std::string>, AVD_SI_DEP> *sidep_db;
-void sidep_spons_list_del(AVD_CL_CB *cb, AVD_SI_SI_DEP *si_dep_rec);
-AVD_SI_SI_DEP *sidep_struc_crt(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx);
-AVD_SI_SI_DEP *avd_sidep_find(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx, bool
isImmIdx);
-AVD_SI_SI_DEP *avd_sidep_find_next(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx,
bool isImmIdx);
-uint32_t sidep_del_row(AVD_CL_CB *cb, AVD_SI_SI_DEP *rec);
+#define AVD_SI_DEP_NULL ((AVD_SI_DEP *)0)
+
+void sidep_spons_list_del(AVD_CL_CB *cb, AVD_SI_DEP *si_dep_rec);
+AVD_SI_DEP *avd_sidep_find(AVD_SI *spons_si, AVD_SI *dep_si);
void avd_sidep_tol_tmr_evh(AVD_CL_CB *cb, struct avd_evt_tag *evt);
void avd_sidep_assign_evh(AVD_CL_CB *cb, struct avd_evt_tag *evt);
void avd_sidep_unassign_evh(AVD_CL_CB *cb, struct avd_evt_tag *evt);
diff --git a/osaf/services/saf/amf/amfd/include/timer.h
b/osaf/services/saf/amf/amfd/include/timer.h
--- a/osaf/services/saf/amf/amfd/include/timer.h
+++ b/osaf/services/saf/amf/amfd/include/timer.h
@@ -72,8 +72,8 @@ typedef struct avd_tmr_tag {
{\
si_dep_rec->si_dep_timer.is_active = false; \
si_dep_rec->si_dep_timer.type = AVD_TMR_SI_DEP_TOL; \
- si_dep_rec->si_dep_timer.spons_si_name = si_dep_rec->indx_imm.si_name_prim;
\
- si_dep_rec->si_dep_timer.dep_si_name = si_dep_rec->indx_imm.si_name_sec; \
+ si_dep_rec->si_dep_timer.spons_si_name = si_dep_rec->spons_name; \
+ si_dep_rec->si_dep_timer.dep_si_name = si_dep_rec->dep_name; \
avd_start_tmr(cb, &si_dep_rec->si_dep_timer,
si_dep_rec->saAmfToleranceTime); \
}
diff --git a/osaf/services/saf/amf/amfd/si_dep.cc
b/osaf/services/saf/amf/amfd/si_dep.cc
--- a/osaf/services/saf/amf/amfd/si_dep.cc
+++ b/osaf/services/saf/amf/amfd/si_dep.cc
@@ -157,19 +157,19 @@
#include <susi.h>
#include <proc.h>
+AmfDb<std::pair<std::string, std::string>, AVD_SI_DEP> *sidep_db = NULL;
+
/* static function prototypes */
static bool avd_sidep_all_sponsors_active(AVD_SI *si);
-static void sidep_update_si_dep_state_for_spons_unassign(AVD_CL_CB *cb, AVD_SI
*dep_si, AVD_SI_SI_DEP *si_dep_rec);
+static void sidep_update_si_dep_state_for_spons_unassign(AVD_CL_CB *cb, AVD_SI
*dep_si, AVD_SI_DEP *si_dep_rec);
static uint32_t sidep_unassign_dependent(AVD_CL_CB *cb, AVD_SI *si);
static bool sidep_is_si_active(AVD_SI *si);
static uint32_t sidep_sg_red_si_process_assignment(AVD_CL_CB *cb, AVD_SI *si);
static uint32_t sidep_si_dep_state_evt_send(AVD_CL_CB *cb, AVD_SI *si,
AVD_EVT_TYPE evt_type);
-static uint32_t sidep_cyclic_dep_find(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx);
+static uint32_t sidep_cyclic_dep_find(AVD_SI_DEP *sidep);
static void sidep_si_dep_start_unassign(AVD_CL_CB *cb, AVD_EVT *evt);
static void sidep_dependentsi_role_failover(AVD_SI *si);
-static AVD_SI_DEP si_dep; /* SI-SI dependency data */
-
static const char *depstatename[] = {
"",
"NO_DEPENDENCY",
@@ -263,14 +263,14 @@ bool sidep_is_si_active(AVD_SI *si)
* dependent-SI.
*
* Input: cb - ptr to AVD control block
- * si_dep_rec - ptr to AVD_SI_SI_DEP struct
+ * si_dep_rec - ptr to AVD_SI_DEP struct
*
* Returns:
*
* NOTES:
*
**************************************************************************/
-void sidep_spons_list_del(AVD_CL_CB *cb, AVD_SI_SI_DEP *si_dep_rec)
+void sidep_spons_list_del(AVD_SI_DEP *si_dep_rec)
{
AVD_SI *dep_si = NULL;
AVD_SPONS_SI_NODE *spons_si_node = NULL;
@@ -279,8 +279,8 @@ void sidep_spons_list_del(AVD_CL_CB *cb,
TRACE_ENTER();
/* Dependent SI should be active, if not return error */
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- osafassert(dep_si);
+ dep_si = avd_si_get(&si_dep_rec->dep_name);
+ osafassert(dep_si != NULL);
/* SI doesn't depend on any other SIs */
osafassert (dep_si->spons_si_list != NULL);
@@ -288,7 +288,7 @@ void sidep_spons_list_del(AVD_CL_CB *cb,
spons_si_node = dep_si->spons_si_list;
/* Check if the sponsor is the first node of the list */
- if (m_CMP_HORDER_SANAMET(dep_si->spons_si_list->si->name,
si_dep_rec->indx_imm.si_name_prim) == 0) {
+ if (m_CMP_HORDER_SANAMET(dep_si->spons_si_list->si->name,
si_dep_rec->spons_si->name) == 0) {
dep_si->spons_si_list = spons_si_node->next;
/* decrement the dependent SI count in sponsor SI */
spons_si_node->si->num_dependents --;
@@ -296,7 +296,7 @@ void sidep_spons_list_del(AVD_CL_CB *cb,
} else {
while (spons_si_node->next != NULL) {
if (m_CMP_HORDER_SANAMET(spons_si_node->next->si->name,
-
si_dep_rec->indx_imm.si_name_prim) != 0) {
+ si_dep_rec->spons_si->name) !=
0) {
spons_si_node = spons_si_node->next;
continue;
}
@@ -313,7 +313,7 @@ void sidep_spons_list_del(AVD_CL_CB *cb,
TRACE_LEAVE();
}
-static bool rec_already_in_sponsor_list(const AVD_SI *si, const AVD_SI_SI_DEP
*rec)
+static bool rec_already_in_sponsor_list(const AVD_SI *si, const AVD_SI_DEP
*rec)
{
AVD_SPONS_SI_NODE *node;
@@ -335,7 +335,7 @@ static bool rec_already_in_sponsor_list(
* rec
*
**************************************************************************/
-void avd_si_dep_spons_list_add(AVD_SI *dep_si, AVD_SI *spons_si, AVD_SI_SI_DEP
*rec)
+void avd_si_dep_spons_list_add(AVD_SI *dep_si, AVD_SI *spons_si, AVD_SI_DEP
*rec)
{
AVD_SPONS_SI_NODE *spons_si_node;
@@ -354,6 +354,12 @@ void avd_si_dep_spons_list_add(AVD_SI *d
dep_si->spons_si_list = spons_si_node;
}
+static AVD_SI_DEP *sidep_db_find(SaNameT *sponsor, SaNameT *dependent)
+{
+ return sidep_db->find(make_pair(Amf::to_string(sponsor),
Amf::to_string(dependent)));
+}
+
+
/*****************************************************************************
* Function: sidep_stop_tol_timer
*
@@ -369,29 +375,19 @@ void avd_si_dep_spons_list_add(AVD_SI *d
* NOTES:
*
**************************************************************************/
-void sidep_stop_tol_timer(AVD_CL_CB *cb, AVD_SI *si)
+void sidep_stop_tol_timer(AVD_CL_CB *cb, AVD_SI *dep_si)
{
- AVD_SI_SI_DEP_INDX indx;
- AVD_SI_SI_DEP *rec = NULL;
- AVD_SPONS_SI_NODE *spons_si_node = si->spons_si_list;
-
- memset((char *)&indx, '\0', sizeof(AVD_SI_SI_DEP_INDX));
- indx.si_name_sec.length = si->name.length;
- memcpy(indx.si_name_sec.value, si->name.value, si->name.length);
+ AVD_SI_DEP *rec;
+ AVD_SPONS_SI_NODE *spons_si_node = dep_si->spons_si_list;
while (spons_si_node) {
- /* Need to stop the tolerance timer */
- indx.si_name_prim.length = spons_si_node->si->name.length;
- memcpy(indx.si_name_prim.value, spons_si_node->si->name.value,
- spons_si_node->si->name.length);
-
- if ((rec = avd_sidep_find(cb, &indx, true)) != NULL) {
+ if ((rec = sidep_db_find(&spons_si_node->si->name,
&dep_si->name)) != NULL) {
if (rec->si_dep_timer.is_active == true) {
avd_stop_tmr(cb, &rec->si_dep_timer);
- TRACE("Tolerance timer stopped for '%s'",
si->name.value);
+ TRACE("Tolerance timer stopped for '%s'",
dep_si->name.value);
- if (si->tol_timer_count > 0) {
- si->tol_timer_count--;
+ if (dep_si->tol_timer_count > 0) {
+ dep_si->tol_timer_count--;
}
}
}
@@ -845,20 +841,20 @@ done:
*
* Input: cb - ptr to AVD control block
* dep_si - ptr to AVD_SI struct (dependent SI).
- * si_dep_rec - ptr to AVD_SI_SI_DEP struct
+ * si_dep_rec - ptr to AVD_SI_DEP struct
*
* Returns:
*
* NOTES:
*
**************************************************************************/
-void sidep_update_si_dep_state_for_spons_unassign(AVD_CL_CB *cb, AVD_SI
*dep_si, AVD_SI_SI_DEP *si_dep_rec)
+void sidep_update_si_dep_state_for_spons_unassign(AVD_CL_CB *cb, AVD_SI
*dep_si, AVD_SI_DEP *si_dep_rec)
{
AVD_SI *spons_si = NULL;
TRACE_ENTER2("si:'%s',
si_dep_state:'%s'",dep_si->name.value,depstatename[dep_si->si_dep_state]);
- spons_si = avd_si_get(&si_dep_rec->indx_imm.si_name_prim);
+ spons_si = avd_si_get(&si_dep_rec->spons_name);
osafassert(spons_si != NULL);
/* Take action only when both sponsor and dependent belongs to same sg
@@ -914,29 +910,16 @@ done:
**************************************************************************/
void sidep_take_action_on_dependents(AVD_SI *si)
{
- AVD_SI *dep_si = NULL;
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec = NULL;
-
TRACE_ENTER();
- memset((char *)&si_indx, '\0', sizeof(AVD_SI_SI_DEP_INDX));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
- /* If si_dep is NULL, means adjust the SI dep states for all depended
- * SIs of the sponsor SI.
- */
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
+ if (sidep->spons_si != si)
+ continue;
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
osafassert(dep_si != NULL);
/* Take action only when both sponsor and dependent belongs to
same sg
@@ -950,9 +933,9 @@ void sidep_take_action_on_dependents(AVD
avd_sidep_si_dep_state_set(dep_si,
AVD_SI_READY_TO_ASSIGN);
sidep_dependentsi_role_failover(dep_si);
}
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
continue;
}
+
if (dep_si->si_dep_state == AVD_SI_FAILOVER_UNDER_PROGRESS) {
/* If the dependent SI is under
AVD_SI_FAILOVER_UNDER_PROGRESS state
* update its dep_state to AVD_SI_READY_TO_UNASSIGN
@@ -967,202 +950,22 @@ void sidep_take_action_on_dependents(AVD
sidep_si_dep_state_evt_send(avd_cb, dep_si,
AVD_EVT_ASSIGN_SI_DEP_STATE);
}
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
TRACE_LEAVE();
}
-/*****************************************************************************
- * Function: sidep_struc_crt
- *
- * Purpose: This function will create and add a AVD_SI_SI_DEP structure to the
- * trees if an element with the same key value doesn't exist in the
- * tree.
- *
- * Input: cb - the AVD control block
- * indx - Index for the row to be added.
- *
- * Returns: The pointer to AVD_SI_SI_DEP structure allocated and added.
- *
- * NOTES:
- *
- **************************************************************************/
-AVD_SI_SI_DEP *sidep_struc_crt(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx)
+AVD_SI_DEP *get_sidep_with_same_dep(AVD_SI_DEP *sidep)
{
- AVD_SI_SI_DEP *rec;
- uint32_t si_prim_len = indx->si_name_prim.length;
- uint32_t si_sec_len = indx->si_name_sec.length;
-
- TRACE_ENTER();
-
- if ((rec = avd_sidep_find(cb, indx, true)) != NULL)
- goto done;
-
- /* Allocate a new block structure for imm rec now */
- rec = new AVD_SI_SI_DEP();
-
- rec->indx_imm.si_name_prim.length = indx->si_name_prim.length;
- memcpy(rec->indx_imm.si_name_prim.value, indx->si_name_prim.value,
si_prim_len);
-
- rec->indx_imm.si_name_sec.length = indx->si_name_sec.length;
- memcpy(rec->indx_imm.si_name_sec.value, indx->si_name_sec.value,
si_sec_len);
-
- rec->indx.si_name_prim.length = indx->si_name_sec.length;
- memcpy(rec->indx.si_name_prim.value, indx->si_name_sec.value,
si_sec_len);
-
- rec->indx.si_name_sec.length = indx->si_name_prim.length;
- memcpy(rec->indx.si_name_sec.value, indx->si_name_prim.value,
si_prim_len);
-
- rec->tree_node_imm.key_info = (uint8_t *)&(rec->indx_imm);
- rec->tree_node_imm.bit = 0;
- rec->tree_node_imm.left = NCS_PATRICIA_NODE_NULL;
- rec->tree_node_imm.right = NCS_PATRICIA_NODE_NULL;
-
- rec->tree_node.key_info = (uint8_t *)&(rec->indx);
- rec->tree_node.bit = 0;
- rec->tree_node.left = NCS_PATRICIA_NODE_NULL;
- rec->tree_node.right = NCS_PATRICIA_NODE_NULL;
-
- if (ncs_patricia_tree_add(&si_dep.spons_anchor, &rec->tree_node_imm) !=
NCSCC_RC_SUCCESS) {
- LOG_ER("%s: spons ncs_patricia_tree_add failed", __FUNCTION__);
- delete rec;
- rec = NULL;
- goto done;
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ AVD_SI_DEP *tmp_sidep = it->second;
+ if (sidep == tmp_sidep)
+ continue;
+ if (m_CMP_HORDER_SANAMET(tmp_sidep->dep_name, sidep->dep_name)
== 0)
+ return tmp_sidep;
}
-
- if (ncs_patricia_tree_add(&si_dep.dep_anchor, &rec->tree_node) !=
NCSCC_RC_SUCCESS) {
- LOG_ER("%s: dep ncs_patricia_tree_add failed", __FUNCTION__);
- ncs_patricia_tree_del(&si_dep.spons_anchor,
&rec->tree_node_imm);
- delete rec;
- rec = NULL;
- goto done;
- }
-
-done:
- TRACE_LEAVE();
- return rec;
-}
-
-/*****************************************************************************
- * Function: avd_sidep_find
- *
- * Purpose: This function will find a AVD_SI_SI_DEP structure in the tree
- * with indx value as key. Indices can be provided as per the order
- * mention in the imm or in the reverse of that.
- *
- * Input: cb - The AVD control block
- * indx - The key.
- *
- * Returns: The pointer to AVD_SG_SI_RANK structure found in the tree.
- *
- * NOTES: Set the isImmIdx flag value to 1 if indices are as defined by imm
and 0
- * if it is in reverse order
- *
- **************************************************************************/
-AVD_SI_SI_DEP *avd_sidep_find(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx, bool
isImmIdx)
-{
- AVD_SI_SI_DEP *rec = NULL;
-
- if (isImmIdx) {
- rec = (AVD_SI_SI_DEP
*)ncs_patricia_tree_get(&si_dep.spons_anchor, (uint8_t *)indx);
- } else {
- rec = (AVD_SI_SI_DEP
*)ncs_patricia_tree_get(&si_dep.dep_anchor, (uint8_t *)indx);
- if (rec != NULL) {
- /* Adjust the pointer */
- rec = (AVD_SI_SI_DEP *)(((char *)rec)
- - (((char
*)&(AVD_SI_SI_DEP_NULL->tree_node))
- - ((char
*)AVD_SI_SI_DEP_NULL)));
- }
- }
-
- return rec;
-}
-
-/*****************************************************************************
- * Function: avd_sidep_find_next
- *
- * Purpose: This function will find next AVD_SI_SI_DEP structure in the tree
- * with indx value as key. Indices can be provided as per the order
- * mention in the imm or in the reverse of that.
- *
- * Input: cb - the AVD control block
- * indx - The key.
- *
- * Returns: The next pointer to AVD_SG_SI_RANK structure found in the tree.
- *
- * NOTES: Set the isImmIdx flag value to 1 if indices are as defined by imm
and 0
- * if it is in reverse order
- *
- **************************************************************************/
-AVD_SI_SI_DEP *avd_sidep_find_next(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx,
bool isImmIdx)
-{
- AVD_SI_SI_DEP *rec = NULL;
-
- if (isImmIdx) {
- rec = (AVD_SI_SI_DEP
*)ncs_patricia_tree_getnext(&si_dep.spons_anchor, (uint8_t *)indx);
- } else {
- rec = (AVD_SI_SI_DEP
*)ncs_patricia_tree_getnext(&si_dep.dep_anchor, (uint8_t *)indx);
- if (rec != NULL) {
- /* Adjust the pointer */
- rec = (AVD_SI_SI_DEP *)(((char *)rec)
- - (((char
*)&(AVD_SI_SI_DEP_NULL->tree_node))
- - ((char
*)AVD_SI_SI_DEP_NULL)));
- }
- }
-
- return rec;
-}
-
-/*****************************************************************************
- * Function: sidep_del_row
- *
- * Purpose: This function will delete and free AVD_SI_SI_DEP structure from
- * the tree. It will delete the record from both patricia trees
- *
- * Input: cb - The AVD control block
- * si - Pointer to service instance row
- *
- * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
- *
- * NOTES:
- *
- **************************************************************************/
-uint32_t sidep_del_row(AVD_CL_CB *cb, AVD_SI_SI_DEP *rec)
-{
- AVD_SI_SI_DEP *si_dep_rec = NULL;
- uint32_t rc = NCSCC_RC_FAILURE;
-
- TRACE_ENTER();
-
- if (rec == NULL)
- goto done;
-
- if ((si_dep_rec = avd_sidep_find(cb, &rec->indx, false)) != NULL) {
- if (ncs_patricia_tree_del(&si_dep.dep_anchor,
&si_dep_rec->tree_node)
- != NCSCC_RC_SUCCESS) {
- LOG_ER("Failed deleting SI Dep from Dependent Anchor");
- goto done;
- }
- }
-
- si_dep_rec = NULL;
-
- if ((si_dep_rec = avd_sidep_find(cb, &rec->indx_imm, true)) != NULL) {
- if (ncs_patricia_tree_del(&si_dep.spons_anchor,
&si_dep_rec->tree_node_imm)
- != NCSCC_RC_SUCCESS) {
- LOG_ER("Failed deleting SI Dep from Sponsor Anchor");
- goto done;
- }
- }
-
- if (si_dep_rec)
- delete si_dep_rec;
-
- rc = NCSCC_RC_SUCCESS;
-done:
- TRACE_LEAVE();
- return rc;
+ return NULL;
}
/*****************************************************************************
@@ -1180,18 +983,17 @@ done:
* buffer is not sufficient to process this request.
*
**************************************************************************/
-uint32_t sidep_cyclic_dep_find(AVD_CL_CB *cb, AVD_SI_SI_DEP_INDX *indx)
+uint32_t sidep_cyclic_dep_find(AVD_SI_DEP *sidep)
{
- AVD_SI_SI_DEP *rec = NULL;
AVD_SI_DEP_NAME_LIST *start = NULL;
AVD_SI_DEP_NAME_LIST *temp = NULL;
AVD_SI_DEP_NAME_LIST *last = NULL;
uint32_t rc = NCSCC_RC_FAILURE;
- AVD_SI_SI_DEP_INDX idx;
+ AVD_SI_DEP *tmp_sidep = NULL;
TRACE_ENTER();
- if (m_CMP_HORDER_SANAMET(indx->si_name_prim, indx->si_name_sec) == 0) {
+ if (m_CMP_HORDER_SANAMET(sidep->spons_name, sidep->dep_name) == 0) {
/* dependent SI and Sponsor SI can not be same
Cyclic dependency found return sucess
*/
@@ -1200,21 +1002,22 @@ uint32_t sidep_cyclic_dep_find(AVD_CL_CB
}
start = new AVD_SI_DEP_NAME_LIST;
- start->si_name = indx->si_name_prim;
+ start->si_name = sidep->spons_name;
start->next = NULL;
last = start;
+ LOG_NO("got si :%s",start->si_name.value);
while (last) {
- memset((char *)&idx, '\0', sizeof(AVD_SI_SI_DEP_INDX));
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ tmp_sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(tmp_sidep->dep_name,
last->si_name) == 0)
+ break;
+ }
- idx.si_name_prim.length = last->si_name.length;
- memcpy(idx.si_name_prim.value, last->si_name.value,
last->si_name.length);
-
- rec = avd_sidep_find_next(cb, &idx, false);
-
- while ((rec != NULL) &&
(m_CMP_HORDER_SANAMET(rec->indx.si_name_prim, idx.si_name_prim) == 0)) {
- if (m_CMP_HORDER_SANAMET(indx->si_name_sec,
rec->indx.si_name_sec) == 0) {
+ while ((tmp_sidep != NULL) &&
(m_CMP_HORDER_SANAMET(tmp_sidep->dep_name, last->si_name) == 0)) {
+ if (m_CMP_HORDER_SANAMET(sidep->dep_name,
tmp_sidep->spons_name) == 0) {
/* Cyclic dependency found */
rc = NCSCC_RC_SUCCESS;
break;
@@ -1222,21 +1025,20 @@ uint32_t sidep_cyclic_dep_find(AVD_CL_CB
/* Search if this SI name already exist in the list */
temp = start;
- if (m_CMP_HORDER_SANAMET(temp->si_name,
rec->indx.si_name_sec) != 0) {
+ if (m_CMP_HORDER_SANAMET(temp->si_name,
tmp_sidep->spons_name) != 0) {
while ((temp->next != NULL) &&
-
(m_CMP_HORDER_SANAMET(temp->next->si_name, rec->indx.si_name_sec) != 0)) {
+
(m_CMP_HORDER_SANAMET(temp->next->si_name, tmp_sidep->spons_name) != 0)) {
temp = temp->next;
}
/* SI Name not found in the list, add it */
if (temp->next == NULL) {
temp->next = new AVD_SI_DEP_NAME_LIST;
- temp->next->si_name =
rec->indx.si_name_sec;
+ temp->next->si_name =
tmp_sidep->spons_name;
temp->next->next = NULL;
}
}
-
- rec = avd_sidep_find_next(cb, &rec->indx, false);
+ tmp_sidep = get_sidep_with_same_dep(tmp_sidep);
}
if (rc == NCSCC_RC_SUCCESS) {
@@ -1246,6 +1048,7 @@ uint32_t sidep_cyclic_dep_find(AVD_CL_CB
}
}
+
/* Free the allocated SI name list */
while (start) {
temp = start->next;
@@ -1258,53 +1061,59 @@ done:
return rc;
}
-static int avd_sidep_indx_init(const SaNameT *sidep_name, AVD_SI_SI_DEP_INDX
*indx)
+static int avd_sidep_indx_init(const SaNameT *sidep_name, AVD_SI_DEP
*sidep_obj)
{
- char *p;
- SaNameT tmp;
- uint32_t i = 0;
+ char *p;
+ SaNameT tmp;
+ int i = 0;
- memset(&tmp, 0, sizeof(SaNameT));
- tmp.length = sidep_name->length;
- memcpy(&tmp.value, &sidep_name->value, tmp.length);
-
- memset(indx, 0, sizeof(AVD_SI_SI_DEP_INDX));
+ memset(&tmp, 0, sizeof(SaNameT));
+ tmp.length = sidep_name->length;
+ memcpy(&tmp.value, &sidep_name->value, tmp.length);
- /* find first occurence and step past it */
- p = strstr((char *)tmp.value, "safSi=") + 1;
- if (p == NULL) return false;
+ memset(sidep_obj, 0, sizeof(AVD_SI_DEP));
+ memcpy(sidep_obj->name.value, &sidep_name->value, sidep_name->length);
- /* find second occurence, an error if not found */
- p = strstr(p, "safSi=");
- if (p == NULL) return false;
+ /* find first occurence and step past it */
+ p = strstr((char *)tmp.value, "safSi=") + 1;
+ if (p == NULL) return false;
- *(p - 1) = '\0'; /* null terminate at comma before SI */
+ /* find second occurence, an error if not found */
+ p = strstr(p, "safSi=");
+ if (p == NULL) return false;
- indx->si_name_sec.length = snprintf((char *)indx->si_name_sec.value,
SA_MAX_NAME_LENGTH, "%s", p);
+ *(p - 1) = '\0'; /* null terminate at comma before SI */
- /* Skip past the RDN tag */
- p = strchr((char *)tmp.value, '=') + 1;
- if (p == NULL) return false;
+ sidep_obj->dep_name.length = snprintf((char
*)sidep_obj->dep_name.value, SA_MAX_NAME_LENGTH, "%s", p);
- /*
- ** Example DN, need to copy to get rid of back slash escaped commas.
- **
'safDepend=safSi=SC2-NoRed\,safApp=OpenSAF,safSi=SC-2N,safApp=OpenSAF'
- */
+ /* Skip past the RDN tag */
+ p = strchr((char *)tmp.value, '=') + 1;
+ if (p == NULL) return false;
- /* Copy the RDN value which is a DN with escaped commas */
- while (*p) {
- if (*p != '\\')
- indx->si_name_prim.value[i++] = *p;
- p++;
- }
- indx->si_name_prim.length = strlen((char *)indx->si_name_prim.value);
+ /*
+ ** Example DN, need to copy to get rid of back slash escaped commas.
+ **
'safDepend=safSi=SC2-NoRed\,safApp=OpenSAF,safSi=SC-2N,safApp=OpenSAF'
+ */
- return true;
+ /* Copy the RDN value which is a DN with escaped commas */
+ i = 0;
+ while (*p) {
+ if (*p != '\\')
+ sidep_obj->spons_name.value[i++] = *p;
+ p++;
+ }
+ sidep_obj->spons_name.length = strlen((char
*)sidep_obj->spons_name.value);
+
+ /* Set SI pointers */
+ sidep_obj->spons_si =
si_db->find(Amf::to_string(&sidep_obj->spons_name));
+ sidep_obj->dep_si = si_db->find(Amf::to_string(&sidep_obj->dep_name));
+
+ return true;
}
static uint32_t is_config_valid(SaNameT *sidep_name, CcbUtilOperationData_t
*opdata)
{
- AVD_SI_SI_DEP_INDX indx;
+ AVD_SI_DEP sidep;
AVD_SI *spons_si, *dep_si;
CcbUtilOperationData_t *tmp;
uint32_t dep_saAmfSIRank, spons_saAmfSIRank;
@@ -1313,25 +1122,25 @@ static uint32_t is_config_valid(SaNameT
TRACE_ENTER();
- if( !avd_sidep_indx_init(sidep_name, &indx)) {
+ if( !avd_sidep_indx_init(sidep_name, &sidep)) {
report_ccb_validation_error(opdata, "SI dep validation: Bad DN
for SI Dependency");
goto done;
}
/* Sponsor SI need to exist */
- if ((spons_si = avd_si_get(&indx.si_name_prim)) == NULL) {
+ if ((spons_si = avd_si_get(&sidep.spons_name)) == NULL) {
if (opdata == NULL) {
report_ccb_validation_error(opdata, "SI dep validation:
'%s' does not exist in model and '%s'"
" depends on it",
- indx.si_name_prim.value,
indx.si_name_sec.value);
+ sidep.spons_name.value,
sidep.dep_name.value);
goto done;
}
/* SI does not exist in current model, check CCB */
- if ((tmp = ccbutil_getCcbOpDataByDN(opdata->ccbId,
&indx.si_name_prim)) == NULL) {
+ if ((tmp = ccbutil_getCcbOpDataByDN(opdata->ccbId,
&sidep.spons_name)) == NULL) {
report_ccb_validation_error(opdata, "SI dep validation:
'%s' does not exist in existing model or"
" in CCB and '%s' depends on it",
- indx.si_name_prim.value,
indx.si_name_sec.value);
+ sidep.spons_name.value,
sidep.dep_name.value);
goto done;
}
@@ -1346,17 +1155,17 @@ static uint32_t is_config_valid(SaNameT
if (spons_saAmfSIRank == 0)
spons_saAmfSIRank = ~0U; /* zero means lowest possible rank */
- if ((dep_si = avd_si_get(&indx.si_name_sec)) == NULL) {
+ if ((dep_si = avd_si_get(&sidep.dep_name)) == NULL) {
if (opdata == NULL) {
report_ccb_validation_error(opdata, "SI dep validation:
'%s' does not exist in model",
- indx.si_name_sec.value);
+ sidep.dep_name.value);
goto done;
}
/* SI does not exist in current model, check CCB */
- if ((tmp = ccbutil_getCcbOpDataByDN(opdata->ccbId,
&indx.si_name_sec)) == NULL) {
+ if ((tmp = ccbutil_getCcbOpDataByDN(opdata->ccbId,
&sidep.dep_name)) == NULL) {
report_ccb_validation_error(opdata, "SI dep validation:
'%s' does not exist in existing"
- " model or in CCB",
indx.si_name_sec.value);
+ " model or in CCB",
sidep.dep_name.value);
goto done;
}
@@ -1374,7 +1183,7 @@ static uint32_t is_config_valid(SaNameT
if ((opdata != NULL) && dependent_si_is_assigned) {
report_ccb_validation_error(opdata, "SI dep validation: adding
dependency from existing SI '%s'"
" to SI '%s' is not allowed",
- indx.si_name_prim.value,
indx.si_name_sec.value);
+ sidep.spons_name.value, sidep.dep_name.value);
goto done;
}
@@ -1384,13 +1193,13 @@ static uint32_t is_config_valid(SaNameT
/* higher number => lower rank, see 3.8.1.1 */
if (spons_saAmfSIRank > dep_saAmfSIRank) {
report_ccb_validation_error(opdata, "SI dep validation: Sponsor
SI '%s' has lower rank than"
- " dependent SI '%s'", indx.si_name_prim.value,
indx.si_name_sec.value);
+ " dependent SI '%s'", sidep.spons_name.value,
sidep.dep_name.value);
goto done;
}
- if (sidep_cyclic_dep_find(avd_cb, &indx) == NCSCC_RC_SUCCESS) {
+ if (sidep_cyclic_dep_find(&sidep) == NCSCC_RC_SUCCESS) {
/* Return value that record cannot be added due to cyclic
dependency */
- report_ccb_validation_error(opdata, "SI dep validation: cyclic
dependency for '%s'", indx.si_name_sec.value);
+ report_ccb_validation_error(opdata, "SI dep validation: cyclic
dependency for '%s'", sidep.dep_name.value);
goto done;
}
@@ -1401,43 +1210,43 @@ done:
return rc;
}
-static AVD_SI_SI_DEP *sidep_new(SaNameT *sidep_name, const SaImmAttrValuesT_2
**attributes)
+static AVD_SI_DEP *sidep_new(SaNameT *sidep_name, const SaImmAttrValuesT_2
**attributes)
{
- AVD_SI_SI_DEP *sidep = NULL;
- AVD_SI_SI_DEP_INDX indx;
- AVD_SI *dep_si = NULL;
- AVD_SI *spons_si = NULL;
+ AVD_SI_DEP tmp_sidep, *sidep = NULL;
TRACE_ENTER2("%s", sidep_name->value);
- avd_sidep_indx_init(sidep_name, &indx);
+ avd_sidep_indx_init(sidep_name, &tmp_sidep);
+ if ((sidep = sidep_db_find(&tmp_sidep.spons_name,&tmp_sidep.dep_name))
!= NULL) {
+ TRACE("SI dependency already exists");
+ }
- if ((sidep = sidep_struc_crt(avd_cb, &indx)) == NULL) {
- LOG_ER("Unable create SI-SI dependency record");
- goto done;
- }
-
+ sidep = new AVD_SI_DEP();
+ avd_sidep_indx_init(sidep_name, sidep);
+ osafassert(sidep->dep_si != NULL);
+ osafassert(sidep->spons_si != NULL);
+ sidep_db->insert(make_pair(Amf::to_string(&sidep->spons_name),
Amf::to_string(&sidep->dep_name)), sidep);
+
+ /* Allocate a new block structure for imm rec now */
+
if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfToleranceTime"),
attributes, 0, &sidep->saAmfToleranceTime) != SA_AIS_OK) {
/* Empty, assign default value */
sidep->saAmfToleranceTime = 0;
}
/* Add to dependent's sponsors list */
- osafassert(spons_si = avd_si_get(&indx.si_name_prim));
- osafassert(dep_si = avd_si_get(&indx.si_name_sec));
- avd_si_dep_spons_list_add(dep_si, spons_si, sidep);
+ avd_si_dep_spons_list_add(sidep->dep_si, sidep->spons_si, sidep);
if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) {
/* While configuring the dependencies, set the dependent dep
state considering
all its sponsors assignment status. Possibly a call to
*_chosen_asgn() after this
may be made and thus it will help in avoiding re-screening in
*_chosen_asgn().
*/
- if (avd_sidep_all_sponsors_active(dep_si))
- avd_sidep_si_dep_state_set(dep_si,
AVD_SI_READY_TO_ASSIGN);
+ if (avd_sidep_all_sponsors_active(sidep->dep_si))
+ avd_sidep_si_dep_state_set(sidep->dep_si,
AVD_SI_READY_TO_ASSIGN);
else
- avd_sidep_si_dep_state_set(dep_si,
AVD_SI_SPONSOR_UNASSIGNED);
+ avd_sidep_si_dep_state_set(sidep->dep_si,
AVD_SI_SPONSOR_UNASSIGNED);
}
-done:
TRACE_LEAVE();
return sidep;
}
@@ -1498,7 +1307,6 @@ SaAisErrorT avd_sidep_config_get(void)
static SaAisErrorT sidep_ccb_completed_cb(CcbUtilOperationData_t *opdata)
{
SaAisErrorT rc = SA_AIS_OK;
- AVD_SI_SI_DEP_INDX indx;
TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
opdata->objectName.value);
@@ -1509,8 +1317,9 @@ static SaAisErrorT sidep_ccb_completed_c
break;
case CCBUTIL_DELETE:
case CCBUTIL_MODIFY:
- avd_sidep_indx_init(&opdata->objectName, &indx);
- if (NULL == avd_sidep_find(avd_cb, &indx, true))
+ AVD_SI_DEP sidep;
+ avd_sidep_indx_init(&opdata->objectName, &sidep);
+ if (sidep_db_find(&sidep.spons_name, &sidep.dep_name) == NULL)
rc = SA_AIS_ERR_BAD_OPERATION;
break;
default:
@@ -1524,10 +1333,8 @@ static SaAisErrorT sidep_ccb_completed_c
static void sidep_ccb_apply_cb(CcbUtilOperationData_t *opdata)
{
- AVD_SI_SI_DEP *sidep;
- AVD_SI_SI_DEP_INDX indx;
+ AVD_SI_DEP *sidep, tmp_sidep;
AVD_SI *dep_si = NULL;
-
const SaImmAttrModificationT_2 *attr_mod;
int i = 0;
@@ -1539,9 +1346,10 @@ static void sidep_ccb_apply_cb(CcbUtilOp
break;
case CCBUTIL_DELETE:
- avd_sidep_indx_init(&opdata->objectName, &indx);
- sidep = avd_sidep_find(avd_cb, &indx, true);
- osafassert(dep_si = avd_si_get(&indx.si_name_sec));
+ avd_sidep_indx_init(&opdata->objectName, &tmp_sidep);
+ sidep = sidep_db_find(&tmp_sidep.spons_name,
&tmp_sidep.dep_name);
+ dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
/* If SI is in tolerance timer running state because of this
* SI-SI dep cfg, then stop the tolerance timer.
*/
@@ -1552,8 +1360,9 @@ static void sidep_ccb_apply_cb(CcbUtilOp
if(dep_si->tol_timer_count > 0)
dep_si->tol_timer_count--;
}
- sidep_spons_list_del(avd_cb, sidep);
- sidep_del_row(avd_cb, sidep);
+ sidep_spons_list_del(sidep);
+ sidep_db->erase(make_pair(Amf::to_string(&sidep->spons_name),
Amf::to_string(&sidep->dep_name)));
+ delete sidep;
if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) {
/* Update the SI according to its existing sponsors
state */
sidep_si_screen_si_dependencies(dep_si);
@@ -1562,8 +1371,8 @@ static void sidep_ccb_apply_cb(CcbUtilOp
break;
case CCBUTIL_MODIFY:
- avd_sidep_indx_init(&opdata->objectName, &indx);
- sidep = avd_sidep_find(avd_cb, &indx, true);
+ avd_sidep_indx_init(&opdata->objectName, &tmp_sidep);
+ sidep = sidep_db_find(&tmp_sidep.spons_name,
&tmp_sidep.dep_name);
while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL)
{
if (!strcmp(attr_mod->modAttr.attrName,
"saAmfToleranceTime")) {
TRACE("saAmfToleranceTime modified from '%llu'
to '%llu'", sidep->saAmfToleranceTime,
@@ -1583,33 +1392,18 @@ static void sidep_ccb_apply_cb(CcbUtilOp
void avd_sidep_constructor(void)
{
- unsigned int rc;
- NCS_PATRICIA_PARAMS patricia_params = {0};
-
- patricia_params.key_size = sizeof(AVD_SI_SI_DEP_INDX);
- rc = ncs_patricia_tree_init(&si_dep.spons_anchor, &patricia_params);
- osafassert(rc == NCSCC_RC_SUCCESS);
- rc = ncs_patricia_tree_init(&si_dep.dep_anchor, &patricia_params);
- osafassert(rc == NCSCC_RC_SUCCESS);
-
+ sidep_db = new AmfDb<std::pair<std::string, std::string>, AVD_SI_DEP>;
avd_class_impl_set("SaAmfSIDependency", NULL, NULL,
sidep_ccb_completed_cb,
sidep_ccb_apply_cb);
}
+
void avd_sidep_start_tolerance_timer_for_dependant(AVD_SI *dep_si, AVD_SI
*spons_si)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
+ AVD_SI_DEP *si_dep_rec;
TRACE("dep_si:%s spons_si:%s",dep_si->name.value,spons_si->name.value);
- /* Frame the index completely to the associated si_dep_rec */
- memset((char *)&si_indx, '\0', sizeof(AVD_SI_SI_DEP_INDX));
- si_indx.si_name_prim.length = spons_si->name.length;
- memcpy(si_indx.si_name_prim.value, spons_si->name.value,
si_indx.si_name_prim.length);
- si_indx.si_name_sec.length = dep_si->name.length;
- memcpy(si_indx.si_name_sec.value, dep_si->name.value,
dep_si->name.length);
-
- si_dep_rec = avd_sidep_find(avd_cb, &si_indx, true);
+ si_dep_rec = sidep_db_find(&spons_si->name, &dep_si->name);
if (si_dep_rec != NULL) {
sidep_update_si_dep_state_for_spons_unassign(avd_cb, dep_si,
si_dep_rec);
} else {
@@ -1641,31 +1435,20 @@ void avd_si_unassign(AVD_SI *si)
**/
void avd_sidep_unassign_dependents(AVD_SI *si, AVD_SU *su)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
AVD_SI *dep_si;
AVD_SU_SI_REL *sisu;
TRACE_ENTER2(": '%s'",si->name.value);
- memset(&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
+ continue;
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- /* No corresponding SI node?? some thing wrong */
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
- continue;
- }
+ dep_si = si_db->find(Amf::to_string(&sidep->dep_name));
+ osafassert(dep_si != NULL);
+
/* Get the Active susi */
for (sisu = dep_si->list_of_sisu;sisu;sisu = sisu->si_next) {
if (((sisu->state == SA_AMF_HA_ACTIVE) || (sisu->state
== SA_AMF_HA_QUIESCING)) &&
@@ -1673,10 +1456,9 @@ void avd_sidep_unassign_dependents(AVD_S
break;
}
}
- if (sisu == NULL) {
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
+
+ if (sisu == NULL)
continue;
- }
/* if dependant SI has Active assignment on the node which went
down, remove the assignments
* else start Tolerance timer
@@ -1694,7 +1476,6 @@ void avd_sidep_unassign_dependents(AVD_S
if (dep_si->num_dependents > 0)
avd_sidep_unassign_dependents(dep_si, su);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
TRACE_LEAVE();
}
@@ -1984,34 +1765,20 @@ bool valid_standby_susi(AVD_SU_SI_REL *s
**/
void avd_sidep_update_depstate_si_failover(AVD_SI *si, AVD_SU *su)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
- AVD_SI *dep_si;
- AVD_SU_SI_REL *sisu;
AVD_SPONS_SI_NODE *spons_si_node;
TRACE_ENTER2("si:%s",si->name.value);
- memset((char *)&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
+ continue;
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- TRACE("No corresponding SI node?? some thing wrong");
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
- continue;
- }
- for (sisu = dep_si->list_of_sisu;sisu;sisu = sisu->si_next) {
+ for (AVD_SU_SI_REL *sisu = dep_si->list_of_sisu;sisu;sisu =
sisu->si_next) {
TRACE("sisu si:%s su:%s state:%d
fsm_state:%d",sisu->si->name.value,sisu->su->name.value,sisu->state,sisu->fsm);
if (((sisu->state == SA_AMF_HA_ACTIVE) || (sisu->state
== SA_AMF_HA_QUIESCING)
|| (sisu->state ==
SA_AMF_HA_QUIESCED))
@@ -2087,7 +1854,6 @@ void avd_sidep_update_depstate_si_failov
}
}
}
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
TRACE_LEAVE();
}
@@ -2236,34 +2002,20 @@ done:
**/
void avd_sidep_reset_dependents_depstate_in_sufault(AVD_SI *si)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
- AVD_SI *dep_si;
-
TRACE_ENTER2(" SI: '%s'",si->name.value);
- memset((char *)&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- /* No corresponding SI node?? some thing wrong */
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
continue;
- }
- if(dep_si->si_dep_state == AVD_SI_FAILOVER_UNDER_PROGRESS) {
+
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
+
+ if (dep_si->si_dep_state == AVD_SI_FAILOVER_UNDER_PROGRESS)
avd_sidep_si_dep_state_set(dep_si,
AVD_SI_SPONSOR_UNASSIGNED);
- }
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
TRACE_LEAVE();
@@ -2310,10 +2062,7 @@ bool avd_sidep_si_dependency_exists_with
**/
void avd_sidep_send_active_to_dependents(const AVD_SI *si)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
AVD_SU_SI_REL *sisu;
- AVD_SI *dep_si;
AVD_SU *active_su = NULL;
TRACE_ENTER2(": '%s'",si->name.value);
@@ -2327,31 +2076,20 @@ void avd_sidep_send_active_to_dependents
}
}
- memset(&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
+ continue;
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- /* No corresponding SI node?? some thing wrong */
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
- continue;
- }
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
+
TRACE("dependent si:%s
dep_si->si_dep_state:%d",dep_si->name.value,dep_si->si_dep_state);
if(dep_si->si_dep_state == AVD_SI_FAILOVER_UNDER_PROGRESS) {
- if (!avd_sidep_all_sponsors_active(dep_si)) {
+ if (!avd_sidep_all_sponsors_active(dep_si))
/* Some of the sponsors are not yet in Active
state */
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
continue;
- }
AVD_SU_SI_REL *sisu;
switch (si->sg_of_si->sg_redundancy_model) {
case SA_AMF_NPM_REDUNDANCY_MODEL:
@@ -2386,7 +2124,6 @@ void avd_sidep_send_active_to_dependents
}
avd_sidep_si_dep_state_set(dep_si, AVD_SI_ASSIGNED);
}
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
TRACE_LEAVE();
}
@@ -2399,33 +2136,20 @@ void avd_sidep_send_active_to_dependents
**/
bool avd_sidep_quiesced_done_for_all_dependents(const AVD_SI *si, const AVD_SU
*su)
{
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec;
- AVD_SI *dep_si;
- AVD_SU_SI_REL *sisu = NULL;
bool quiesced = true;
TRACE_ENTER2(": '%s'",si->name.value);
- memset(&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
+ continue;
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- /* No corresponding SI node?? some thing wrong */
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
- continue;
- }
- for (sisu = dep_si->list_of_sisu; sisu ; sisu = sisu->si_next) {
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
+
+ for (AVD_SU_SI_REL *sisu = dep_si->list_of_sisu; sisu ; sisu =
sisu->si_next) {
if ((sisu->su == su) &&
(((sisu->state != SA_AMF_HA_STANDBY) &&
(sisu->state != SA_AMF_HA_QUIESCED)) ||
(sisu->fsm !=
AVD_SU_SI_STATE_ASGND))) {
@@ -2433,7 +2157,6 @@ bool avd_sidep_quiesced_done_for_all_dep
goto done;
}
}
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
done:
@@ -2485,33 +2208,22 @@ done:
**/
void sidep_update_dependents_states(AVD_SI *si)
{
- AVD_SI *dep_si = NULL;
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec = NULL;
-
if (si->num_dependents == 0)
return;
- TRACE("sponsor si:'%s', dep state:'%s'", si->name.value,
depstatename[si->si_dep_state]);
-
- memset((char *)&si_indx, 0, sizeof(AVD_SI_SI_DEP_INDX));
- si_indx.si_name_prim.length = si->name.length;
- memcpy(si_indx.si_name_prim.value, si->name.value,
si_indx.si_name_prim.length);
-
/* Update the si_dep_state for all dependents
* SIs of the sponsor SI.
*/
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
- while (si_dep_rec != NULL) {
- if (m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim,
si_indx.si_name_prim) != 0) {
- /* Seems no more node exists in spons_anchor tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
+ TRACE("sponsor si:'%s', dep state:'%s'", si->name.value,
depstatename[si->si_dep_state]);
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- osafassert(dep_si);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name, si->name) != 0)
+ continue;
+
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
/* update si_dep_state of dependent if its SG fsm is
stable or if both sponsor and dependent belongs to same SG.
@@ -2520,7 +2232,6 @@ void sidep_update_dependents_states(AVD_
(dep_si->sg_of_si == si->sg_of_si))
sidep_update_si_self_dep_state(dep_si);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_dep_rec->indx_imm,
true);
}
}
@@ -2700,8 +2411,7 @@ void avd_sidep_sg_take_action(AVD_SG *sg
void sidep_process_ready_to_unassign_depstate(AVD_SI *dep_si)
{
AVD_SI *spons_si = NULL;
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SI_SI_DEP *si_dep_rec = NULL;
+ AVD_SI_DEP *si_dep_rec;
AVD_SPONS_SI_NODE *temp_spons_list = NULL;
TRACE_ENTER2("dep si:'%s'", dep_si->name.value);
@@ -2711,14 +2421,7 @@ void sidep_process_ready_to_unassign_dep
spons_si = temp_spons_list->si;
TRACE("spons si:'%s'",spons_si->name.value);
- /* Frame the index completely to the associated si_dep_rec */
- memset((char *)&si_indx, 0, sizeof(AVD_SI_SI_DEP_INDX));
- si_indx.si_name_prim.length = spons_si->name.length;
- memcpy(si_indx.si_name_prim.value, spons_si->name.value,
si_indx.si_name_prim.length);
- si_indx.si_name_sec.length = dep_si->name.length;
- memcpy(si_indx.si_name_sec.value, dep_si->name.value,
dep_si->name.length);
-
- si_dep_rec = avd_sidep_find(avd_cb, &si_indx, true);
+ si_dep_rec = sidep_db_find(&spons_si->name, &dep_si->name);
if (si_dep_rec == NULL)
goto done;
@@ -2772,7 +2475,7 @@ void avd_sidep_unassign_evh(AVD_CL_CB *c
osafassert(evt->rcv_evt == AVD_EVT_UNASSIGN_SI_DEP_STATE);
dep_si = avd_si_get(&evt->info.tmr.dep_si_name);
- osafassert(dep_si);
+ osafassert(dep_si != NULL);
avd_sidep_si_dep_state_set(dep_si, AVD_SI_UNASSIGNING_DUE_TO_DEP);
diff --git a/osaf/services/saf/amf/amfd/siass.cc
b/osaf/services/saf/amf/amfd/siass.cc
--- a/osaf/services/saf/amf/amfd/siass.cc
+++ b/osaf/services/saf/amf/amfd/siass.cc
@@ -749,10 +749,6 @@ done:
**/
bool avd_susi_quiesced_canbe_given(const AVD_SU_SI_REL *susi)
{
- AVD_SI_SI_DEP *si_dep_rec;
- AVD_SI *dep_si;
- AVD_SI_SI_DEP_INDX si_indx;
- AVD_SU_SI_REL *sisu;
bool quiesc_role = true;
TRACE_ENTER2("%s %s", susi->su->name.value, susi->si->name.value);
@@ -762,25 +758,16 @@ bool avd_susi_quiesced_canbe_given(const
return quiesc_role;
} else {
/* Check if any of its dependents assigned to same SU for which
quiesced role is not yet given */
- memset(&si_indx, '\0', sizeof(si_indx));
- si_indx.si_name_prim.length = susi->si->name.length;
- memcpy(si_indx.si_name_prim.value, susi->si->name.value,
si_indx.si_name_prim.length);
- si_dep_rec = avd_sidep_find_next(avd_cb, &si_indx, true);
+ for (std::map<std::pair<std::string,std::string>,
AVD_SI_DEP*>::const_iterator it = sidep_db->begin();
+ it != sidep_db->end(); it++) {
+ const AVD_SI_DEP *sidep = it->second;
+ if (m_CMP_HORDER_SANAMET(sidep->spons_si->name,
susi->si->name) != 0)
+ continue;
- while (si_dep_rec != NULL) {
- if
(m_CMP_HORDER_SANAMET(si_dep_rec->indx_imm.si_name_prim, si_indx.si_name_prim)
!= 0) {
- /* Seems no more node exists in spons_anchor
tree with
- * "si_indx.si_name_prim" as primary key
- */
- break;
- }
- dep_si = avd_si_get(&si_dep_rec->indx_imm.si_name_sec);
- if (dep_si == NULL) {
- /* No corresponding SI node?? some thing wrong
*/
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
- continue;
- }
- for (sisu = dep_si->list_of_sisu; sisu ; sisu =
sisu->si_next) {
+ AVD_SI *dep_si = avd_si_get(&sidep->dep_name);
+ osafassert(dep_si != NULL);
+
+ for (AVD_SU_SI_REL *sisu = dep_si->list_of_sisu; sisu ;
sisu = sisu->si_next) {
if (sisu->su == susi->su) {
if ((sisu->state == SA_AMF_HA_ACTIVE) ||
((sisu->state ==
SA_AMF_HA_QUIESCED) && (sisu->fsm == AVD_SU_SI_STATE_MODIFY))) {
@@ -790,7 +777,6 @@ bool avd_susi_quiesced_canbe_given(const
}
}
- si_dep_rec = avd_sidep_find_next(avd_cb,
&si_dep_rec->indx_imm, true);
}
}
done:
------------------------------------------------------------------------------
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