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:

------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to