> One goal of refactoring I would say is to reduce code duplication with the 
> help
> of good interfaces. In this case it is just a matter of having two insert 
> methods,
> one that can fail and one that cannot, let's call it "insert_unique". By using
> insert_unique asserts on the client side can be removed.
Hum..   I think this is not required. User need to check if it exists to verify 
whether the problem was for duplicate or something else by finding it in DB.

> About  the comment on NCSCC_RC_SUCCESS/FAILURE I meant that we are
> trying to break out from the old legacy but in this case for not much reason 
> use
> an error code from leap!
Sure, then change it to bool.

Thanks
-Nagu
> -----Original Message-----
> From: Hans Feldt [mailto:[email protected]]
> Sent: 22 April 2014 13:25
> To: Nagendra Kumar
> Cc: [email protected]
> Subject: RE: [devel] [PATCH 1 of 1] amfd: use db_template for the SU db [#713]
> 
> One goal of refactoring I would say is to reduce code duplication with the 
> help
> of good interfaces. In this case it is just a matter of having two insert 
> methods,
> one that can fail and one that cannot, let's call it "insert_unique". By using
> insert_unique asserts on the client side can be removed.
> 
> About  the comment on NCSCC_RC_SUCCESS/FAILURE I meant that we are
> trying to break out from the old legacy but in this case for not much reason 
> use
> an error code from leap!
> 
> Thanks,
> Hans
> 
> > -----Original Message-----
> > From: Nagendra Kumar [mailto:[email protected]]
> > Sent: den 22 april 2014 08:04
> > To: Hans Feldt
> > Cc: [email protected]
> > Subject: Re: [devel] [PATCH 1 of 1] amfd: use db_template for the SU
> > db [#713]
> >
> > > OK fixed before push but since this will become a pattern in about
> > > 20 places I think it would be better to have db->insert return void
> > > and internally do this check. What do you think?
> >
> > If we keep the check outside, it can give flexibility to the user whether 
> > to assert
> or not if insert fails.
> > In some conditions if insert fails, function can return from there itself.
> > Function() {
> >
> > If (Insert(su1) == fails) {
> >     Log(Duplicate SU1);
> >     Return;
> >     }
> > Else {
> > Continue
> > }
> > }
> >
> > > As a side note, db->insert should not return
> > > NCSCC_RC_SUCCESS/FAILURE but a bool
> > As far as description of insert says, it fails when it adds duplicate. Are 
> > we
> expecting other errors or did I get it wrong ?
> >
> > Thanks
> > -Nagu
> >
> > > -----Original Message-----
> > > From: Hans Feldt [mailto:[email protected]]
> > > Sent: 22 April 2014 11:01
> > > To: Nagendra Kumar
> > > Cc: Hans Nordeback; Praveen Malviya;
> > > [email protected]
> > > Subject: Re: [PATCH 1 of 1] amfd: use db_template for the SU db
> > > [#713]
> > >
> > > OK fixed before push but since this will become a pattern in about
> > > 20 places I think it would be better to have db->insert return void
> > > and internally do this check. What do you think?
> > >
> > > As a side note, db->insert should not return
> > > NCSCC_RC_SUCCESS/FAILURE but a bool.
> > >
> > > Thanks,
> > > Hans
> > >
> > > On 18 April 2014 15:12, Nagendra Kumar <[email protected]>
> wrote:
> > > > Ack with comment:
> > > >
> > > > We need to check for assert as done in avd_su_db_add when it fails to
> add.
> > > When insert returns NCSCC_RC_FAILURE, we need to assert or log error
> > > at all the places.
> > > >
> > > > -               avd_su_db_add(su);
> > > > +               su_db->insert(su);
> > > >
> > > > Thanks
> > > > -Nagu
> > > >
> > > >> -----Original Message-----
> > > >> From: Hans Feldt [mailto:[email protected]]
> > > >> Sent: 17 April 2014 15:45
> > > >> To: [email protected]; Praveen Malviya; Nagendra Kumar
> > > >> Cc: [email protected]
> > > >> Subject: [PATCH 1 of 1] amfd: use db_template for the SU db
> > > >> [#713]
> > > >>
> > > >>  osaf/services/saf/amf/amfd/ckpt_dec.cc    |   20 +-
> > > >>  osaf/services/saf/amf/amfd/ckpt_enc.cc    |   13 +-
> > > >>  osaf/services/saf/amf/amfd/ckpt_updt.cc   |   12 +-
> > > >>  osaf/services/saf/amf/amfd/comp.cc        |    2 +-
> > > >>  osaf/services/saf/amf/amfd/imm.cc         |    8 +-
> > > >>  osaf/services/saf/amf/amfd/include/su.h   |   36 +------
> > > >>  osaf/services/saf/amf/amfd/include/susi.h |    1 -
> > > >>  osaf/services/saf/amf/amfd/ndproc.cc      |    2 +-
> > > >>  osaf/services/saf/amf/amfd/sg_nway_fsm.cc |    2 +-
> > > >>  osaf/services/saf/amf/amfd/sgproc.cc      |    6 +-
> > > >>  osaf/services/saf/amf/amfd/siass.cc       |   78 +--------------
> > > >>  osaf/services/saf/amf/amfd/sirankedsu.cc  |    2 +-
> > > >>  osaf/services/saf/amf/amfd/su.cc          |   78 +++-----------
> > > >>  osaf/services/saf/amf/amfd/util.cc        |  157 
> > > >> +++++++----------------------
> > > >>  14 files changed, 96 insertions(+), 321 deletions(-)
> > > >>
> > > >>
> > > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > > >> b/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > > >> --- a/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/ckpt_dec.cc
> > > >> @@ -1452,7 +1452,7 @@ static uint32_t dec_su_preinstan(AVD_CL_
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1544,7 +1544,7 @@ static uint32_t dec_su_admin_state(AVD_C
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1590,7 +1590,7 @@ static uint32_t dec_su_readiness_state(A
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1636,7 +1636,7 @@ static uint32_t dec_su_pres_state(AVD_CL
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1682,7 +1682,7 @@ static uint32_t dec_su_si_curr_active(AV
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1727,7 +1727,7 @@ static uint32_t dec_su_si_curr_stby(AVD_
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1773,7 +1773,7 @@ static uint32_t dec_su_term_state(AVD_CL
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1818,7 +1818,7 @@ static uint32_t dec_su_switch(AVD_CL_CB
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1864,7 +1864,7 @@ static uint32_t dec_su_act_state(AVD_CL_
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> @@
> > > >> -1910,7 +1910,7 @@ static uint32_t dec_su_restart_count(AVD
> > > >>
> > > >>       osafassert(status == NCSCC_RC_SUCCESS);
> > > >>
> > > >> -     if (NULL == (su_struct = avd_su_get(&su_ptr->name)))
> > > >> +     if (NULL == (su_struct = su_db->find(&su_ptr->name)))
> > > >>               osafassert(0);
> > > >>
> > > >>       /* Update the fields received in this checkpoint message */
> > > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > > >> b/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > > >> --- a/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/ckpt_enc.cc
> > > >> @@ -2334,8 +2334,9 @@ static uint32_t enc_cs_su_config(AVD_CL_
> > > >>       /*
> > > >>        * Walk through the entire list and send the entire list data.
> > > >>        */
> > > >> -     for (su = avd_su_getnext(&su_name); su != NULL;
> > > >> -          su = avd_su_getnext(&su_name)) {
> > > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it =
> > > >> + su_db-
> > > >> >begin();
> > > >> +                     it != su_db->end(); it++) {
> > > >> +             su = it->second;
> > > >>               status = m_NCS_EDU_VER_EXEC(&cb->edu_hdl,
> > > >> avsv_edp_ckpt_msg_su, &enc->io_uba,
> > > >>                                           EDP_OP_TYPE_ENC, su,
> > > >> &ederror,
> > > >> enc->i_peer_version);
> > > >>
> > > >> @@ -2546,7 +2547,6 @@ static uint32_t enc_cs_siass(AVD_CL_CB *  {
> > > >>       uint32_t status = NCSCC_RC_SUCCESS;
> > > >>       AVD_SU *su;
> > > >> -     SaNameT su_name = {0};
> > > >>       AVSV_SU_SI_REL_CKPT_MSG su_si_ckpt;
> > > >>       AVD_SU_SI_REL *rel;
> > > >>       EDU_ERR ederror = static_cast<EDU_ERR>(0); @@ -2558,10
> > > >> +2558,10 @@ static uint32_t enc_cs_siass(AVD_CL_CB *
> > > >>        * are sent.We will send the corresponding COMP_CSI
> > > >> relationship for that SU_SI
> > > >>        * in the same update.
> > > >>        */
> > > >> -     su_name.length = 0;
> > > >>       memset(&su_si_ckpt, 0, sizeof(su_si_ckpt));
> > > >> -     for (su = avd_su_getnext(&su_name); su != NULL;
> > > >> -          su = avd_su_getnext(&su_name)) {
> > > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it =
> > > >> + su_db-
> > > >> >begin();
> > > >> +                     it != su_db->end(); it++) {
> > > >> +             su = it->second;
> > > >>               su_si_ckpt.su_name = su->name;
> > > >>
> > > >>               for (rel = su->list_of_susi; rel != NULL; rel =
> > > >> rel->su_next) { @@ -2580,7 +2580,6 @@ static uint32_t
> > > >> enc_cs_siass(AVD_CL_CB *
> > > >>
> > > >>                       (*num_of_obj)++;
> > > >>               }
> > > >> -             su_name = su->name;
> > > >>       }
> > > >>       TRACE_LEAVE2("status '%u'", status);
> > > >>       return status;
> > > >> diff --git a/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > > >> b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > > >> --- a/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> > > >> @@ -184,8 +184,8 @@ uint32_t avd_ckpt_su(AVD_CL_CB *cb, AVD_
> > > >>
> > > >>       osafassert (action == NCS_MBCSV_ACT_UPDATE);
> > > >>
> > > >> -     if (NULL == (su = avd_su_get(&ckpt_su->name))) {
> > > >> -             LOG_ER("avd_su_get FAILED for '%s'", 
> > > >> ckpt_su->name.value);
> > > >> +     if (NULL == (su = su_db->find(&ckpt_su->name))) {
> > > >> +             LOG_ER("su_db->find FAILED for '%s'",
> > > >> + ckpt_su->name.value);
> > > >>               rc = NCSCC_RC_FAILURE;
> > > >>               goto done;
> > > >>       }
> > > >> @@ -272,7 +272,7 @@ uint32_t avd_ckpt_su_oper_list(AVD_CL_CB
> > > >>
> > > >>       TRACE_ENTER2("'%s'", ckpt_su->name.value);
> > > >>
> > > >> -     su = avd_su_get(&ckpt_su->name);
> > > >> +     su = su_db->find(&ckpt_su->name);
> > > >>       osafassert(su);
> > > >>
> > > >>       if (NCS_MBCSV_ACT_ADD == action) @@ -359,8 +359,8 @@
> > > >> uint32_t avd_ckpt_si_trans(AVD_CL_CB *cb
> > > >>       switch (action) {
> > > >>       case NCS_MBCSV_ACT_ADD:
> > > >>               sg_ptr->si_tobe_redistributed =
> > > >> avd_si_get(&si_trans_ckpt-
> > > >> >si_name);
> > > >> -             sg_ptr->min_assigned_su = avd_su_get(&si_trans_ckpt-
> > > >> >min_su_name);
> > > >> -             sg_ptr->max_assigned_su = avd_su_get(&si_trans_ckpt-
> > > >> >max_su_name);
> > > >> +             sg_ptr->min_assigned_su =
> > > >> + su_db->find(&si_trans_ckpt-
> > > >> >min_su_name);
> > > >> +             sg_ptr->max_assigned_su =
> > > >> + su_db->find(&si_trans_ckpt-
> > > >> >max_su_name);
> > > >>               break;
> > > >>
> > > >>       case NCS_MBCSV_ACT_RMV:
> > > >> @@ -408,7 +408,7 @@ uint32_t avd_ckpt_siass(AVD_CL_CB *cb, A
> > > >>
> > > >>       su_si_rel_ptr = avd_susi_find(cb, &su_si_ckpt->su_name,
> > > >> &su_si_ckpt-
> > > >> >si_name);
> > > >>
> > > >> -     su_ptr = avd_su_get(&su_si_ckpt->su_name);
> > > >> +     su_ptr = su_db->find(&su_si_ckpt->su_name);
> > > >>       osafassert(su_ptr);
> > > >>       si_ptr_up = avd_si_get(&su_si_ckpt->si_name);
> > > >>       osafassert(si_ptr_up);
> > > >> diff --git a/osaf/services/saf/amf/amfd/comp.cc
> > > >> b/osaf/services/saf/amf/amfd/comp.cc
> > > >> --- a/osaf/services/saf/amf/amfd/comp.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/comp.cc
> > > >> @@ -213,7 +213,7 @@ static void comp_add_to_model(AVD_COMP *
> > > >>       }
> > > >>
> > > >>       avsv_sanamet_init(&comp->comp_info.name, &dn, "safSu");
> > > >> -     su = comp->su = avd_su_get(&dn);
> > > >> +     su = comp->su = su_db->find(&dn);
> > > >>
> > > >>       avd_comp_db_add(comp);
> > > >>       comp->comp_type = avd_comptype_get(&comp->saAmfCompType);
> > > >> diff --git a/osaf/services/saf/amf/amfd/imm.cc
> > > >> b/osaf/services/saf/amf/amfd/imm.cc
> > > >> --- a/osaf/services/saf/amf/amfd/imm.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/imm.cc
> > > >> @@ -1553,8 +1553,6 @@ void avd_saImmOiRtObjectDelete(const SaN
> > > >>   */
> > > >>  void avd_imm_update_runtime_attrs(void)
> > > >>  {
> > > >> -     SaNameT su_name = {0};
> > > >> -     AVD_SU  *su;
> > > >>       SaNameT comp_name ={0};
> > > >>       AVD_COMP *comp;
> > > >>       SaNameT node_name = {0};
> > > >> @@ -1563,8 +1561,9 @@ void avd_imm_update_runtime_attrs(void)
> > > >>       AVD_SI  *si;
> > > >>
> > > >>       /* Update SU Class runtime cached attributes. */
> > > >> -     su = avd_su_getnext(&su_name);
> > > >> -     while (su != NULL) {
> > > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it =
> > > >> + su_db-
> > > >> >begin();
> > > >> +                     it != su_db->end(); it++) {
> > > >> +             AVD_SU *su = it->second;
> > > >>               avd_saImmOiRtObjectUpdate(&su->name,
> > > >> "saAmfSUPreInstantiable",
> > > >>                       SA_IMM_ATTR_SAUINT32T,  &su-
> > > >> >saAmfSUPreInstantiable);
> > > >>
> > > >> @@ -1580,7 +1579,6 @@ void avd_imm_update_runtime_attrs(void)
> > > >>               avd_saImmOiRtObjectUpdate(&su->name,
> > > >> "saAmfSUReadinessState",
> > > >>                       SA_IMM_ATTR_SAUINT32T, &su-
> > > >> >saAmfSuReadinessState);
> > > >>
> > > >> -             su = avd_su_getnext(&su->name);
> > > >>       }
> > > >>
> > > >>       /* Update Component Class runtime cached attributes. */
> > > >> diff --git a/osaf/services/saf/amf/amfd/include/su.h
> > > >> b/osaf/services/saf/amf/amfd/include/su.h
> > > >> --- a/osaf/services/saf/amf/amfd/include/su.h
> > > >> +++ b/osaf/services/saf/amf/amfd/include/su.h
> > > >> @@ -35,7 +35,6 @@
> > > >>  #define AVD_SU_H
> > > >>
> > > >>  #include <saAmf.h>
> > > >> -#include <ncspatricia.h>
> > > >>  #include <def.h>
> > > >>  #include <cb.h>
> > > >>  #include <node.h>
> > > >> @@ -43,6 +42,7 @@
> > > >>  #include <amf_defs.h>
> > > >>  #include <msg.h>
> > > >>  #include <comp.h>
> > > >> +#include "include/db_template.h"
> > > >>
> > > >>  /* The semantics the SU is undergoing. */  typedef enum { @@
> > > >> -57,8
> > > >> +57,6 @@ typedef enum {
> > > >>   */
> > > >>  class AVD_SU {
> > > >>   public:
> > > >> -     NCS_PATRICIA_NODE tree_node;    /* key will be the SU name */
> > > >> -
> > > >>       SaNameT name;
> > > >>       SaNameT saAmfSUType;
> > > >>       uint32_t saAmfSURank;
> > > >> @@ -120,6 +118,8 @@ class AVD_SU {
> > > >>       void set_all_susis_assigned(void);  };
> > > >>
> > > >> +extern AmfDb<AVD_SU> *su_db;
> > > >> +
> > > >>  typedef struct {
> > > >>       NCS_PATRICIA_NODE tree_node;    /* key is name */
> > > >>       SaNameT name;
> > > >> @@ -166,36 +166,6 @@ extern AVD_SU *avd_su_new(const SaNameT
> > > >>   */
> > > >>  extern void avd_su_delete(AVD_SU *su);
> > > >>
> > > >> -/**
> > > >> - * Add SU to SU DB.
> > > >> - * @param su
> > > >> - */
> > > >> -extern void avd_su_db_add(AVD_SU *su);
> > > >> -
> > > >> -/**
> > > >> - * Remove SU from SU DB
> > > >> - * @param su
> > > >> - */
> > > >> -extern void avd_su_db_remove(AVD_SU *su);
> > > >> -
> > > >> -/**
> > > >> - * Get SU object from DB using given key
> > > >> - *
> > > >> - * @param dn
> > > >> - *
> > > >> - * @return struct AVD_SU*
> > > >> - */
> > > >> -extern AVD_SU *avd_su_get(const SaNameT *dn);
> > > >> -
> > > >> -/**
> > > >> - * Get next SU object from DB using given key
> > > >> - *
> > > >> - * @param dn
> > > >> - *
> > > >> - * @return struct AVD_SU*
> > > >> - */
> > > >> -extern AVD_SU *avd_su_getnext(const SaNameT *dn);
> > > >> -
> > > >>  extern void avd_su_remove_comp(struct avd_comp_tag *comp);
> > > >> extern void avd_su_add_comp(struct avd_comp_tag *comp);
> > > >>
> > > >> diff --git a/osaf/services/saf/amf/amfd/include/susi.h
> > > >> b/osaf/services/saf/amf/amfd/include/susi.h
> > > >> --- a/osaf/services/saf/amf/amfd/include/susi.h
> > > >> +++ b/osaf/services/saf/amf/amfd/include/susi.h
> > > >> @@ -142,7 +142,6 @@ AVD_SU_SI_REL *avd_susi_find(AVD_CL_CB *
> > > extern
> > > >> void avd_susi_update(AVD_SU_SI_REL *susi, SaAmfHAStateT
> > > >> ha_state);
> > > >>
> > > >>  AVD_SU_SI_REL *avd_su_susi_find(AVD_CL_CB *cb, AVD_SU *su,
> const
> > > >> SaNameT *si_name); -AVD_SU_SI_REL *avd_susi_find_next(AVD_CL_CB
> > > *cb,
> > > >> SaNameT su_name, SaNameT si_name);  uint32_t
> > > >> avd_susi_delete(AVD_CL_CB *cb, AVD_SU_SI_REL *susi, bool ckpt);
> > > >> extern AVD_SUS_PER_SI_RANK
> > > >> *avd_sirankedsu_getnext_valid(AVD_CL_CB
> > > >> *cb,
> > > >>       AVD_SUS_PER_SI_RANK_INDX indx, AVD_SU **o_su); diff --git
> > > >> a/osaf/services/saf/amf/amfd/ndproc.cc
> > > >> b/osaf/services/saf/amf/amfd/ndproc.cc
> > > >> --- a/osaf/services/saf/amf/amfd/ndproc.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/ndproc.cc
> > > >> @@ -715,7 +715,7 @@ void avd_data_update_req_evh(AVD_CL_CB *
> > > >>               }
> > > >>       case AVSV_SA_AMF_SU:{
> > > >>                       /* Find the component record in the
> > > >> database, specified in the message. */
> > > >> -                     if ((su = avd_su_get(&n2d_msg-
> > > >> >msg_info.n2d_data_req.param_info.name)) == NULL) {
> > > >> +                     if ((su = su_db->find(&n2d_msg-
> > > >> >msg_info.n2d_data_req.param_info.name)) == NULL) {
> > > >>                               LOG_ER("%s: Invalid SU '%s' (%u)",
> > > >> __FUNCTION__,
> > > >>                                       n2d_msg-
> > > >> >msg_info.n2d_data_req.param_info.name.value,
> > > >>                                       n2d_msg-
> > > >> >msg_info.n2d_data_req.param_info.name.length);
> > > >> diff --git a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> > > >> b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> > > >> --- a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
> > > >> @@ -1389,7 +1389,7 @@ AVD_SU *avd_sg_nway_si_find_highest_sira
> > > >>       /* Iterate through the si->rankedsu_list_head to find the
> > > >> highest sirankedsu */
> > > >>       sirankedsu = si->rankedsu_list_head;
> > > >>       for (; sirankedsu ; sirankedsu = sirankedsu->next) {
> > > >> -             if ((ranked_su = avd_su_get(&sirankedsu->suname)) != 
> > > >> NULL) {
> > > >> +             if ((ranked_su = su_db->find(&sirankedsu->suname))
> > > >> + !=
> > > >> + NULL)
> > > >> {
> > > >>                       if (ranked_su == *assigned_su) {
> > > >>                                  TRACE("SI is assigned to highest 
> > > >> SIRankedSU for this
> SI");
> > > >>                                  break; diff --git
> > > >> a/osaf/services/saf/amf/amfd/sgproc.cc
> > > >> b/osaf/services/saf/amf/amfd/sgproc.cc
> > > >> --- a/osaf/services/saf/amf/amfd/sgproc.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
> > > >> @@ -429,7 +429,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
> > > >>
> > > >>       /* get the SU from the tree */
> > > >>
> > > >> -     if ((su = avd_su_get(&n2d_msg->msg_info.n2d_opr_state.su_name))
> > > >> == NULL) {
> > > >> +     if ((su =
> > > >> + su_db->find(&n2d_msg->msg_info.n2d_opr_state.su_name))
> > > >> == NULL) {
> > > >>               LOG_ER("%s: %s not found", __FUNCTION__, n2d_msg-
> > > >> >msg_info.n2d_opr_state.su_name.value);
> > > >>               goto done;
> > > >>       }
> > > >> @@ -794,7 +794,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
> > > >>                * SU operation.
> > > >>                */
> > > >>
> > > >> -             if ((su = avd_su_get(&n2d_msg-
> > > >> >msg_info.n2d_su_si_assign.su_name)) == NULL) {
> > > >> +             if ((su = su_db->find(&n2d_msg-
> > > >> >msg_info.n2d_su_si_assign.su_name)) == NULL) {
> > > >>                       LOG_ER("%s:%d %s", __FUNCTION__, __LINE__,
> > > >> n2d_msg->msg_info.n2d_su_si_assign.su_name.value);
> > > >>                       goto done;
> > > >>               }
> > > >> @@ -1108,7 +1108,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
> > > >>          SI could be assigned to SU successfully if there was any.
> > > >> The operation failed if
> > > >>          AvND encountered error while assigning/unassigning SI to
> > > >> the SU. */
> > > >>
> > > >> -     su = avd_su_get(&n2d_msg->msg_info.n2d_su_si_assign.su_name);
> > > >> +     su =
> > > >> + su_db->find(&n2d_msg->msg_info.n2d_su_si_assign.su_name);
> > > >>
> > > >>       if (su != NULL) {
> > > >>               if (su->pend_cbk.invocation != 0) { 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
> > > >> @@ -178,7 +178,7 @@ AVD_SU_SI_REL *avd_susi_create(AVD_CL_CB
> > > >>       for (su_rank_rec = avd_sirankedsu_getnext(cb, i_idx);
> > > >>            su_rank_rec && (m_CMP_HORDER_SANAMET(su_rank_rec-
> > > >> >indx.si_name, si->name) == 0);
> > > >>            su_rank_rec = avd_sirankedsu_getnext(cb, 
> > > >> su_rank_rec->indx)) {
> > > >> -             curr_su = avd_su_get(&su_rank_rec->su_name);
> > > >> +             curr_su = su_db->find(&su_rank_rec->su_name);
> > > >>               if (curr_su == su)
> > > >>                       break;
> > > >>       }
> > > >> @@ -201,7 +201,7 @@ AVD_SU_SI_REL *avd_susi_create(AVD_CL_CB
> > > >>                            i_su_rank_rec
> > > >>                            &&
> > > >> (m_CMP_HORDER_SANAMET(i_su_rank_rec-
> > > >> >indx.si_name, si->name) == 0);
> > > >>                            i_su_rank_rec =
> > > >> avd_sirankedsu_getnext(cb,
> > > >> i_su_rank_rec->indx)) {
> > > >> -                             curr_su = avd_su_get(&i_su_rank_rec-
> > > >> >su_name);
> > > >> +                             curr_su =
> > > >> + su_db->find(&i_su_rank_rec-
> > > >> >su_name);
> > > >>                               if (curr_su == i_su_si->su)
> > > >>                                       break;
> > > >>                       }
> > > >> @@ -324,85 +324,13 @@ AVD_SU_SI_REL *avd_susi_find(AVD_CL_CB
> *  {
> > > >>       AVD_SU *su;
> > > >>
> > > >> -     if ((su = avd_su_get(su_name)) == NULL)
> > > >> +     if ((su = su_db->find(su_name)) == NULL)
> > > >>               return NULL;
> > > >>
> > > >>       return avd_su_susi_find(cb, su, si_name);  }
> > > >>
> > > >>
> > > >>
> > >
> /************************************************************
> > > >> *****************
> > > >> - * Function: avd_susi_find_next
> > > >> - *
> > > >> - * Purpose:  This function will find the next AVD_SU_SI_REL
> > > >> structure from
> > > the
> > > >> - * list of susis in a su. If NULL, it will find the first SUSI
> > > >> for the next
> > > >> - * SU in the tree.
> > > >> - *
> > > >> - * Input: cb - the AVD control block
> > > >> - *        su_name - The SU name of the SU SI relation.
> > > >> - *        si_name - The SI name of the SU SI relation.
> > > >> - *
> > > >> - * Returns: The AVD_SU_SI_REL structure that was found.
> > > >> - *
> > > >> - * NOTES:
> > > >> - *
> > > >> - *
> > > >> -
> > > >>
> > >
> *************************************************************
> > > >> *************/
> > > >> -
> > > >> -AVD_SU_SI_REL *avd_susi_find_next(AVD_CL_CB *cb, SaNameT
> > > >> su_name, SaNameT si_name) -{
> > > >> -     AVD_SU *su;
> > > >> -     AVD_SU_SI_REL *su_si = NULL;
> > > >> -     SaNameT lsu_name, lsi_name;
> > > >> -
> > > >> -     /* check if exact match of SU is found so that the next SU SI
> > > >> -      * in the list of SU can be found. If not select the next SUs
> > > >> -      * first SU SI relation
> > > >> -      */
> > > >> -     if (su_name.length != 0) {
> > > >> -             su = avd_su_get(&su_name);
> > > >> -             if (su == NULL)
> > > >> -                     su_si = NULL;
> > > >> -             else
> > > >> -                     su_si = su->list_of_susi;
> > > >> -     }
> > > >> -
> > > >> -     memset((char *)&lsi_name, '\0', sizeof(SaNameT));
> > > >> -     memcpy(lsi_name.value, si_name.value, si_name.length);
> > > >> -     lsi_name.length = si_name.length;
> > > >> -
> > > >> -     while ((su_si != NULL) && (m_CMP_HORDER_SANAMET(su_si->si-
> > > >> >name, lsi_name) <= 0)) {
> > > >> -             su_si = su_si->su_next;
> > > >> -     }
> > > >> -
> > > >> -     if (su_si != NULL) {
> > > >> -             return su_si;
> > > >> -     }
> > > >> -
> > > >> -     /* Find the the first SU SI relation in the next SU with
> > > >> -      * a SU SI relation.
> > > >> -      */
> > > >> -     lsu_name = su_name;
> > > >> -
> > > >> -     while ((su = avd_su_getnext(&lsu_name)) != NULL) {
> > > >> -             if (su->list_of_susi != NULL)
> > > >> -                     break;
> > > >> -
> > > >> -             lsu_name = su->name;
> > > >> -     }
> > > >> -
> > > >> -     /* The given element didn't have a exact match but an element 
> > > >> with
> > > >> -      * a greater SI name was found in the list
> > > >> -      */
> > > >> -
> > > >> -     if (su == NULL)
> > > >> -             return NULL;
> > > >> -     else
> > > >> -             return su->list_of_susi;
> > > >> -
> > > >> -     return su_si;
> > > >> -}
> > > >> -
> > > >> -
> > > >>
> > >
> /************************************************************
> > > >> *****************
> > > >>   * Function: avd_susi_delete
> > > >>   *
> > > >>   * Purpose:  This function will delete and free AVD_SU_SI_REL
> > > >> structure
> > > both
> > > >> diff --git a/osaf/services/saf/amf/amfd/sirankedsu.cc
> > > >> b/osaf/services/saf/amf/amfd/sirankedsu.cc
> > > >> --- a/osaf/services/saf/amf/amfd/sirankedsu.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/sirankedsu.cc
> > > >> @@ -194,7 +194,7 @@ AVD_SUS_PER_SI_RANK *avd_sirankedsu_getn
> > > >>       }
> > > >>
> > > >>       /* get the su & si */
> > > >> -     su = avd_su_get(&ranked_su_per_si->su_name);
> > > >> +     su = su_db->find(&ranked_su_per_si->su_name);
> > > >>       si = avd_si_get(&indx.si_name);
> > > >>
> > > >>       /* validate this entry */
> > > >> diff --git a/osaf/services/saf/amf/amfd/su.cc
> > > >> b/osaf/services/saf/amf/amfd/su.cc
> > > >> --- a/osaf/services/saf/amf/amfd/su.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/su.cc
> > > >> @@ -29,23 +29,7 @@
> > > >>  #include <proc.h>
> > > >>  #include <csi.h>
> > > >>
> > > >> -static NCS_PATRICIA_TREE su_db;
> > > >> -
> > > >> -void avd_su_db_add(AVD_SU *su)
> > > >> -{
> > > >> -     unsigned int rc;
> > > >> -
> > > >> -     if (avd_su_get(&su->name) == NULL) {
> > > >> -             rc = ncs_patricia_tree_add(&su_db, &su->tree_node);
> > > >> -             osafassert(rc == NCSCC_RC_SUCCESS);
> > > >> -     }
> > > >> -}
> > > >> -
> > > >> -void avd_su_db_remove(AVD_SU *su) -{
> > > >> -     unsigned int rc = ncs_patricia_tree_del(&su_db, &su->tree_node);
> > > >> -     osafassert(rc == NCSCC_RC_SUCCESS);
> > > >> -}
> > > >> +AmfDb<AVD_SU> *su_db = NULL;
> > > >>
> > > >>  AVD_SU *avd_su_new(const SaNameT *dn)
> > > >>  {
> > > >> @@ -56,7 +40,6 @@ AVD_SU *avd_su_new(const SaNameT *dn)
> > > >>
> > > >>       memcpy(su->name.value, dn->value, dn->length);
> > > >>       su->name.length = dn->length;
> > > >> -     su->tree_node.key_info = (uint8_t *)&(su->name);
> > > >>       avsv_sanamet_init(dn, &sg_name, "safSg");
> > > >>       su->saAmfSUFailover = false;
> > > >>       su->term_state = false;
> > > >> @@ -91,23 +74,13 @@ void avd_su_delete(AVD_SU *su)
> > > >>       m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, su,
> > > >> AVSV_CKPT_AVD_SU_CONFIG);
> > > >>       avd_node_remove_su(su);
> > > >>       avd_sutype_remove_su(su);
> > > >> -     avd_su_db_remove(su);
> > > >> +     su_db->erase(su);
> > > >>       avd_sg_remove_su(su);
> > > >>       delete su;
> > > >>
> > > >>       TRACE_LEAVE();
> > > >>  }
> > > >>
> > > >> -AVD_SU *avd_su_get(const SaNameT *dn)
> > > >> -{
> > > >> -     SaNameT tmp = {0};
> > > >> -
> > > >> -     tmp.length = dn->length;
> > > >> -     memcpy(tmp.value, dn->value, tmp.length);
> > > >> -
> > > >> -     return (AVD_SU *)ncs_patricia_tree_get(&su_db, (uint8_t *)&tmp);
> > > >> -}
> > > >> -
> > > >>  /**
> > > >>   * Return an SU object if it exist, otherwise create it and
> > > >>   * return a reference to the new object.
> > > >> @@ -117,27 +90,18 @@ AVD_SU *avd_su_get(const SaNameT *dn)
> > > >>   */
> > > >>  AVD_SU *avd_su_get_or_create(const SaNameT *dn)
> > > >>  {
> > > >> -     AVD_SU *su = avd_su_get(dn);
> > > >> +     AVD_SU *su = su_db->find(dn);
> > > >>
> > > >> -     if (!su) {
> > > >> +     if (su == NULL) {
> > > >>               TRACE("'%s' does not exist, creating it", dn->value);
> > > >>               su = avd_su_new(dn);
> > > >>               osafassert(su != NULL);
> > > >> -             avd_su_db_add(su);
> > > >> +             su_db->insert(su);
> > > >>       }
> > > >>
> > > >>       return su;
> > > >>  }
> > > >>
> > > >> -AVD_SU *avd_su_getnext(const SaNameT *dn)
> > > >> -{
> > > >> -     SaNameT tmp = {0};
> > > >> -
> > > >> -     tmp.length = dn->length;
> > > >> -     memcpy(tmp.value, dn->value, tmp.length);
> > > >> -
> > > >> -     return (AVD_SU *)ncs_patricia_tree_getnext(&su_db, (uint8_t
> > > >> *)&tmp);
> > > >> -}
> > > >>  /**
> > > >>   * @brief   gets the current no of assignmnents on a SU for a 
> > > >> particular
> state
> > > >>   *
> > > >> @@ -459,7 +423,7 @@ static AVD_SU *su_create(const SaNameT *
> > > >>       ** If called at new active at failover, the object is found in 
> > > >> the DB
> > > >>       ** but needs to get configuration attributes initialized.
> > > >>       */
> > > >> -     if ((su = avd_su_get(dn)) == NULL) {
> > > >> +     if ((su = su_db->find(dn)) == NULL) {
> > > >>               if ((su = avd_su_new(dn)) == NULL)
> > > >>                       goto done;
> > > >>       } else
> > > >> @@ -583,7 +547,7 @@ static void su_add_to_model(AVD_SU *su)
> > > >>  {
> > > >>       SaNameT dn;
> > > >>       AVD_AVND *node;
> > > >> -     int new_su = 0;
> > > >> +     bool new_su = false;
> > > >>
> > > >>       TRACE_ENTER2("%s", su->name.value);
> > > >>
> > > >> @@ -594,8 +558,8 @@ static void su_add_to_model(AVD_SU *su)
> > > >>       }
> > > >>
> > > >>       /* Determine of the SU is added now, if so msg to amfnd needs to 
> > > >> be
> > > >> sent */
> > > >> -     if (avd_su_get(&su->name) == NULL)
> > > >> -             new_su = 1;
> > > >> +     if (su_db->find(&su->name) == NULL)
> > > >> +             new_su = true;
> > > >>
> > > >>       avsv_sanamet_init(&su->name, &dn, "safSg");
> > > >>
> > > >> @@ -607,7 +571,7 @@ static void su_add_to_model(AVD_SU *su)
> > > >>       su->sg_of_su = avd_sg_get(&dn);
> > > >>       osafassert(su->sg_of_su);
> > > >>
> > > >> -     avd_su_db_add(su);
> > > >> +     su_db->insert(su);
> > > >>       su->su_type = avd_sutype_get(&su->saAmfSUType);
> > > >>       osafassert(su->su_type);
> > > >>       avd_sutype_add_su(su);
> > > >> @@ -647,7 +611,7 @@ static void su_add_to_model(AVD_SU *su)
> > > >>       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
> > > >>               goto done;
> > > >>
> > > >> -     if (new_su) {
> > > >> +     if (new_su == true) {
> > > >>               if ((node->node_state == AVD_AVND_STATE_PRESENT) ||
> > > >>                   (node->node_state == AVD_AVND_STATE_NO_CONFIG) ||
> > > >>                   (node->node_state == AVD_AVND_STATE_NCS_INIT)) {
> > > >> @@ -896,7 +860,7 @@ static void su_admin_op_cb(SaImmOiHandle
> > > >>               goto done;
> > > >>       }
> > > >>
> > > >> -     if (NULL == (su = avd_su_get(su_name))) {
> > > >> +     if (NULL == (su = su_db->find(su_name))) {
> > > >>               LOG_CR("SU '%s' not found", su_name->value);
> > > >>               /* internal error? osafassert instead? */
> > > >>               goto done;
> > > >> @@ -1213,7 +1177,7 @@ done:
> > > >>  static SaAisErrorT su_rt_attr_cb(SaImmOiHandleT immOiHandle,
> > > >>       const SaNameT *objectName, const SaImmAttrNameT
> > > >> *attributeNames)
> > > >>  {
> > > >> -     AVD_SU *su = avd_su_get(objectName);
> > > >> +     AVD_SU *su = su_db->find(objectName);
> > > >>       SaImmAttrNameT attributeName;
> > > >>       int i = 0;
> > > >>
> > > >> @@ -1270,7 +1234,7 @@ static SaAisErrorT su_ccb_completed_modi
> > > >>                       continue;
> > > >>
> > > >>               if (!strcmp(attr_mod->modAttr.attrName, 
> > > >> "saAmfSUFailover"))
> > > >> {
> > > >> -                     AVD_SU *su = avd_su_get(&opdata->objectName);
> > > >> +                     AVD_SU *su = su_db->find(&opdata->objectName);
> > > >>                       uint32_t su_failover = *((SaUint32T *)attr_mod-
> > > >> >modAttr.attrValues[0]);
> > > >>
> > > >>                       /* If SG is not in stable state and amfnd is 
> > > >> already busy
> > > >> in the handling of some fault,
> > > >> @@ -1290,7 +1254,7 @@ static SaAisErrorT su_ccb_completed_modi
> > > >>                               goto done;
> > > >>                       }
> > > >>               } else if (!strcmp(attr_mod->modAttr.attrName,
> > > >> "saAmfSUMaintenanceCampaign")) {
> > > >> -                     AVD_SU *su = avd_su_get(&opdata->objectName);
> > > >> +                     AVD_SU *su = su_db->find(&opdata->objectName);
> > > >>
> > > >>                       if (su->saAmfSUMaintenanceCampaign.length > 0) {
> > > >>                               report_ccb_validation_error(opdata,
> > > >> "saAmfSUMaintenanceCampaign already set for %s",
> > > >> @@ -1301,7 +1265,7 @@ static SaAisErrorT su_ccb_completed_modi
> > > >>               } else if (!strcmp(attr_mod->modAttr.attrName,
> > > >> "saAmfSUType")) {
> > > >>                       AVD_SU *su;
> > > >>                       SaNameT sutype_name = *(SaNameT*) attr_mod-
> > > >> >modAttr.attrValues[0];
> > > >> -                     su = avd_su_get(&opdata->objectName);
> > > >> +                     su = su_db->find(&opdata->objectName);
> > > >>                       if(SA_AMF_ADMIN_LOCKED_INSTANTIATION != su-
> > > >> >saAmfSUAdminState) {
> > > >>                               report_ccb_validation_error(opdata, "SU 
> > > >> is
> > > >> not in locked-inst, present state '%d'",
> > > >>                                               su->saAmfSUAdminState);
> > > >> @@ -1351,7 +1315,7 @@ static SaAisErrorT su_ccb_completed_dele
> > > >>       if (strstr((char *)opdata->objectName.value, "safApp=OpenSAF") !=
> > > >> NULL)
> > > >>               is_app_su = 0;
> > > >>
> > > >> -     su = avd_su_get(&opdata->objectName);
> > > >> +     su = su_db->find(&opdata->objectName);
> > > >>       osafassert(su != NULL);
> > > >>
> > > >>       if (is_app_su && (su->saAmfSUAdminState !=
> > > >> SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
> > > >> @@ -1455,7 +1419,7 @@ static void su_ccb_apply_modify_hdlr(str
> > > >>
> > > >>       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> > > >> >objectName.value);
> > > >>
> > > >> -     su = avd_su_get(&opdata->objectName);
> > > >> +     su = su_db->find(&opdata->objectName);
> > > >>
> > > >>       while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
> > > >>               /* Attribute value removed */
> > > >> @@ -1630,11 +1594,7 @@ void avd_su_dec_curr_stdby_si(AVD_SU
> *su
> > > >>
> > > >>  void avd_su_constructor(void)
> > > >>  {
> > > >> -     NCS_PATRICIA_PARAMS patricia_params;
> > > >> -
> > > >> -     patricia_params.key_size = sizeof(SaNameT);
> > > >> -     osafassert(ncs_patricia_tree_init(&su_db, &patricia_params) ==
> > > >> NCSCC_RC_SUCCESS);
> > > >> -
> > > >> +     su_db = new AmfDb<AVD_SU>;
> > > >>       avd_class_impl_set("SaAmfSU", su_rt_attr_cb, su_admin_op_cb,
> > > >>               su_ccb_completed_cb, su_ccb_apply_cb);
> > > >>  }
> > > >> diff --git a/osaf/services/saf/amf/amfd/util.cc
> > > >> b/osaf/services/saf/amf/amfd/util.cc
> > > >> --- a/osaf/services/saf/amf/amfd/util.cc
> > > >> +++ b/osaf/services/saf/amf/amfd/util.cc
> > > >> @@ -24,6 +24,7 @@
> > > >>
> > > >>
> > >
> *************************************************************
> > > >> *****************
> > > >>  */
> > > >>
> > > >> +#include <vector>
> > > >>  #include <string.h>
> > > >>
> > > >>  #include <saImmOm.h>
> > > >> @@ -445,34 +446,15 @@ done:
> > > >>       return rc;
> > > >>  }
> > > >>
> > > >> -
> > > >>
> > >
> /************************************************************
> > > >> *****************
> > > >> - * Function: avd_prep_su_info
> > > >> - *
> > > >> - * Purpose:  This function prepares the SU
> > > >> - * information for the given SU and adds it to the message.
> > > >> - *
> > > >> - * Input: cb - Pointer to the AVD control block
> > > >> - *        su - Pointer to the SU related to which the messages need 
> > > >> to be
> sent.
> > > >> - *        su_msg - Pointer to the SU message being prepared.
> > > >> - *
> > > >> - * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> > > >> - *
> > > >> - * NOTES: none.
> > > >> - *
> > > >> - *
> > > >> -
> > > >>
> > >
> *************************************************************
> > > >> *************/
> > > >> +/**
> > > >> + * Creates and initializes the su_info part of the REG_SU message
> > > >> + * @param su
> > > >> + * @param su_msg
> > > >> + */
> > > >> +static void reg_su_msg_init_su_info(AVD_DND_MSG *su_msg, const
> > > AVD_SU
> > > >> *su)
> > > >> +{
> > > >> +     AVSV_SU_INFO_MSG *su_info = new AVSV_SU_INFO_MSG();
> > > >>
> > > >> -static uint32_t avd_prep_su_info(AVD_CL_CB *cb, AVD_SU *su,
> > > >> AVD_DND_MSG *su_msg)
> > > >> -{
> > > >> -     AVSV_SU_INFO_MSG *su_info;
> > > >> -
> > > >> -     TRACE_ENTER();
> > > >> -
> > > >> -     su_info = new AVSV_SU_INFO_MSG();
> > > >> -
> > > >> -     /* fill and add the SU into
> > > >> -      * the SU message at the top of the list
> > > >> -      */
> > > >>       su_info->name = su->name;
> > > >>       su_info->comp_restart_max = su->sg_of_su-
> > > >> >saAmfSGCompRestartMax;
> > > >>       su_info->comp_restart_prob = su->sg_of_su-
> > > >> >saAmfSGCompRestartProb;
> > > >> @@ -485,9 +467,6 @@ static uint32_t avd_prep_su_info(AVD_CL_
> > > >>       su_info->next = su_msg->msg_info.d2n_reg_su.su_list;
> > > >>       su_msg->msg_info.d2n_reg_su.su_list = su_info;
> > > >>       su_msg->msg_info.d2n_reg_su.num_su++;
> > > >> -
> > > >> -     return NCSCC_RC_SUCCESS;
> > > >> -
> > > >>  }
> > > >>
> > > >>
> > > >>
> > >
> /************************************************************
> > > >> *****************
> > > >> @@ -508,71 +487,40 @@ static uint32_t avd_prep_su_info(AVD_CL_
> > > >>
> > > >>  uint32_t avd_snd_su_reg_msg(AVD_CL_CB *cb, AVD_AVND *avnd,
> bool
> > > >> fail_over)
> > > >>  {
> > > >> -     AVD_SU *i_su = NULL;
> > > >> -     AVD_DND_MSG *su_msg;
> > > >> -     uint32_t i, count = 0;
> > > >> -     SaNameT temp_su_name = {0};
> > > >> +     AVD_SU *su = NULL;
> > > >>       uint32_t rc = NCSCC_RC_SUCCESS;
> > > >>
> > > >>       TRACE_ENTER2("%s", avnd->node_name);
> > > >>
> > > >> -     su_msg = new AVSV_DND_MSG();
> > > >> -
> > > >> -     /* prepare the SU message. */
> > > >> +     AVD_DND_MSG *su_msg = new AVSV_DND_MSG();
> > > >>       su_msg->msg_type = AVSV_D2N_REG_SU_MSG;
> > > >>       su_msg->msg_info.d2n_reg_su.nodeid = avnd->node_info.nodeId;
> > > >>       su_msg->msg_info.d2n_reg_su.msg_on_fover = fail_over;
> > > >>
> > > >> -     /* build the SU message for both the NCS and application SUs. */
> > > >> +     // Add osaf SUs
> > > >> +     for (su = avnd->list_of_ncs_su; su != NULL; su = su-
> >avnd_list_su_next)
> > > >> +             reg_su_msg_init_su_info(su_msg, su);
> > > >>
> > > >> -     /* Check whether the AvND belongs to ACT controller. If yes, then
> send
> > > >> all
> > > >> -        the external SUs/Components to it, otherwise send only cluster
> > > >> -        components. */
> > > >> +     // Add app SUs
> > > >> +     for (su = avnd->list_of_su; su != NULL; su = 
> > > >> su->avnd_list_su_next)
> > > >> +             reg_su_msg_init_su_info(su_msg, su);
> > > >> +
> > > >> +     // Add external SUs but only if node belongs to ACT controller
> > > >>       if (avnd->node_info.nodeId == cb->node_id_avd) {
> > > >> -             count = 2;
> > > >> -     } else
> > > >> -             count = 1;
> > > >> -
> > > >> -     for (i = 0; i <= count; ++i) {
> > > >> -             if (i == 0)
> > > >> -                     i_su = avnd->list_of_ncs_su;
> > > >> -             else if (i == 1)
> > > >> -                     i_su = avnd->list_of_su;
> > > >> -             else {
> > > >> -                     /* For external component, we don't have any node
> > > >> attached to it.
> > > >> -                        So, get the first external SU. */
> > > >> -                     temp_su_name.length = 0;
> > > >> -                     while (NULL != (i_su =
> > > >> avd_su_getnext(&temp_su_name))) {
> > > >> -                             if (true == i_su->su_is_external)
> > > >> -                                     break;
> > > >> -
> > > >> -                             temp_su_name = i_su->name;
> > > >> -                     }
> > > >> +             // filter out external SUs from all SUs
> > > >> +             std::vector<AVD_SU*> ext_su_vec;
> > > >> +             for (std::map<std::string, AVD_SU*>::const_iterator it = 
> > > >> su_db-
> > > >> >begin();
> > > >> +                             it != su_db->end(); it++) {
> > > >> +                     su = it->second;
> > > >> +                     if (su->su_is_external == true)
> > > >> +                             ext_su_vec.push_back(su);
> > > >>               }
> > > >>
> > > >> -             while (i_su != NULL) {
> > > >> -                     /* Add information about this SU to the message 
> > > >> */
> > > >> -                     if (avd_prep_su_info(cb, i_su, su_msg) ==
> > > >> NCSCC_RC_FAILURE) {
> > > >> -                             /* Free all the messages and return 
> > > >> error */
> > > >> -                             d2n_msg_free(su_msg);
> > > >> -                             LOG_EM("%s:%u: %u", __FILE__, __LINE__,
> > > >> avnd->node_info.nodeId);
> > > >> -                             rc = NCSCC_RC_FAILURE;
> > > >> -                             goto done;
> > > >> -                     }
> > > >> -
> > > >> -                     /* get the next SU in the node */
> > > >> -                     if ((0 == i) || (1 == i))
> > > >> -                             i_su = i_su->avnd_list_su_next;
> > > >> -                     else {
> > > >> -                             /* Get the next external SU. */
> > > >> -                             temp_su_name = i_su->name;
> > > >> -                             while (NULL != (i_su =
> > > >> avd_su_getnext(&temp_su_name))) {
> > > >> -                                     if (true == i_su->su_is_external)
> > > >> -                                             break;
> > > >> -
> > > >> -                                     temp_su_name = i_su->name;
> > > >> -                             }
> > > >> -                     }
> > > >> +             // And add them
> > > >> +             for (std::vector<AVD_SU*>::iterator it = 
> > > >> ext_su_vec.begin();
> > > >> +                             it != ext_su_vec.end(); it++) {
> > > >> +                     su = *it;
> > > >> +                     reg_su_msg_init_su_info(su_msg, su);
> > > >>               }
> > > >>       }
> > > >>
> > > >> @@ -627,45 +575,18 @@ done:
> > > >>
> > > >>  uint32_t avd_snd_su_msg(AVD_CL_CB *cb, AVD_SU *su)
> > > >>  {
> > > >> -     AVD_DND_MSG *su_msg;
> > > >>       AVD_AVND *node = NULL;
> > > >>
> > > >>       TRACE_ENTER();
> > > >>
> > > >> -     if (su == NULL) {
> > > >> -             /* This is a invalid situation as the SU
> > > >> -              * needs to be mentioned.
> > > >> -              */
> > > >> -
> > > >> -             /* Log a fatal error that su can't be null */
> > > >> -             LOG_EM("%s:%u: %u", __FILE__, __LINE__, 0);
> > > >> -             return NCSCC_RC_FAILURE;
> > > >> -     }
> > > >> -
> > > >>       m_AVD_GET_SU_NODE_PTR(cb, su, node);
> > > >>
> > > >> -     su_msg = new AVSV_DND_MSG();
> > > >> -
> > > >> -     /* prepare the SU  message. */
> > > >> -
> > > >> +     AVD_DND_MSG *su_msg = new AVSV_DND_MSG();
> > > >>       su_msg->msg_type = AVSV_D2N_REG_SU_MSG;
> > > >> -
> > > >>       su_msg->msg_info.d2n_reg_su.nodeid = node->node_info.nodeId;
> > > >> -
> > > >> -     /* Add information about this SU to the message */
> > > >> -     if (avd_prep_su_info(cb, su, su_msg) == NCSCC_RC_FAILURE) {
> > > >> -             /* Free the messages and return error */
> > > >> -             LOG_EM("%s:%u: %u", __FILE__, __LINE__, node-
> > > >> >node_info.nodeId);
> > > >> -             delete su_msg;
> > > >> -             return NCSCC_RC_FAILURE;
> > > >> -     }
> > > >> -
> > > >> +     reg_su_msg_init_su_info(su_msg, su);
> > > >>       su_msg->msg_info.d2n_reg_su.msg_id = ++(node->snd_msg_id);
> > > >>
> > > >> -     /* send the SU message to the node if return value is failure
> > > >> -      * free messages and return error.
> > > >> -      */
> > > >> -
> > > >>       TRACE("Sending %u to %x", AVSV_D2N_REG_SU_MSG, node-
> > > >> >node_info.nodeId);
> > > >>
> > > >>       if (avd_d2n_msg_snd(cb, node, su_msg) == NCSCC_RC_FAILURE) {
> > > >> @@ -1468,9 +1389,9 @@ void amfd_file_dump(const char *path)
> > > >>               dn = sg->name;
> > > >>       }
> > > >>
> > > >> -     AVD_SU *su;
> > > >> -     dn.length = 0;
> > > >> -     for (su = avd_su_getnext(&dn); su != NULL; su =
> avd_su_getnext(&dn))
> > > >> {
> > > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > > >> >begin();
> > > >> +                     it != su_db->end(); it++) {
> > > >> +             const AVD_SU *su = it->second;
> > > >>               fprintf(f, "%s\n", su->name.value);
> > > >>               fprintf(f, "\tsaAmfSUPreInstantiable=%u\n", su-
> > > >> >saAmfSUPreInstantiable);
> > > >>               fprintf(f, "\tsaAmfSUOperState=%u\n", su-
> > > >> >saAmfSUOperState);
> > > >> @@ -1512,14 +1433,14 @@ void amfd_file_dump(const char *path)
> > > >>       }
> > > >>
> > > >>       AVD_SU_SI_REL *rel;
> > > >> -     dn.length = 0;
> > > >> -     for (su = avd_su_getnext(&dn); su != NULL; su =
> avd_su_getnext(&dn))
> > > >> {
> > > >> +     for (std::map<std::string, AVD_SU*>::const_iterator it = su_db-
> > > >> >begin();
> > > >> +                     it != su_db->end(); it++) {
> > > >> +             const AVD_SU *su = it->second;
> > > >>               for (rel = su->list_of_susi; rel != NULL; rel = 
> > > >> rel->su_next) {
> > > >>                       fprintf(f, "%s,%s\n", rel->su->name.value, 
> > > >> rel->si-
> > > >> >name.value);
> > > >>                       fprintf(f, "\thastate=%u\n", rel->state);
> > > >>                       fprintf(f, "\tfsm=%u\n", rel->fsm);
> > > >>               }
> > > >> -             dn = su->name;
> > > >>       }
> > > >>
> > > >>       dn.length = 0;
> >
> > ------------------------------------------------------------------------------
> > Start Your Social Network Today - Download eXo Platform
> > Build your Enterprise Intranet with eXo Platform Software
> > Java Based Open Source Intranet - Social, Extensible, Cloud Ready
> > Get Started Now And Turn Your Intranet Into A Collaboration Platform
> > http://p.sf.net/sfu/ExoPlatform
> > _______________________________________________
> > Opensaf-devel mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/opensaf-devel

------------------------------------------------------------------------------
Start Your Social Network Today - Download eXo Platform
Build your Enterprise Intranet with eXo Platform Software
Java Based Open Source Intranet - Social, Extensible, Cloud Ready
Get Started Now And Turn Your Intranet Into A Collaboration Platform
http://p.sf.net/sfu/ExoPlatform
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to