osaf/services/saf/amf/amfd/app.cc | 95 ++++++++++++++-----------------
osaf/services/saf/amf/amfd/ckpt_enc.cc | 11 +--
osaf/services/saf/amf/amfd/ckpt_updt.cc | 7 +-
osaf/services/saf/amf/amfd/include/app.h | 21 +++++--
osaf/services/saf/amf/amfd/sg.cc | 2 +-
osaf/services/saf/amf/amfd/si.cc | 2 +-
osaf/services/saf/amf/amfd/util.cc | 16 ++--
7 files changed, 74 insertions(+), 80 deletions(-)
diff --git a/osaf/services/saf/amf/amfd/app.cc
b/osaf/services/saf/amf/amfd/app.cc
--- a/osaf/services/saf/amf/amfd/app.cc
+++ b/osaf/services/saf/amf/amfd/app.cc
@@ -24,60 +24,47 @@
#include <imm.h>
#include <si.h>
-static NCS_PATRICIA_TREE app_db;
+// A map with application instances, key is DN as std:string
+AmfAppMap *AmfAppDb::db;
-void avd_app_db_add(AVD_APP *app)
-{
- unsigned int rc;
-
- if (avd_app_get(&app->name) == NULL) {
- rc = ncs_patricia_tree_add(&app_db, &app->tree_node);
- osafassert(rc == NCSCC_RC_SUCCESS);
- }
+void AmfAppDb::insert(AVD_APP *app) {
+ std::string name((const char*)app->name.value, app->name.length);
+ (*db)[name] = app;
}
-AVD_APP *avd_app_new(const SaNameT *dn)
+void AmfAppDb::erase(AVD_APP *app) {
+ std::string name((const char*)app->name.value, app->name.length);
+ AmfAppMap::iterator it = db->find(name);
+ db->erase(it);
+}
+
+AVD_APP *AmfAppDb::find(const SaNameT *dn) {
+ std::string name((const char*)dn->value, dn->length);
+ AmfAppMap::iterator it = db->find(name);
+ if (it == db->end())
+ return NULL;
+ else
+ return it->second;
+}
+
+// TODO(hafe) change this to a constructor
+static AVD_APP *avd_app_new(const SaNameT *dn)
{
- AVD_APP *app;
-
- app = new AVD_APP();
-
+ AVD_APP *app = new AVD_APP();
memcpy(app->name.value, dn->value, dn->length);
app->name.length = dn->length;
- app->tree_node.key_info = (uint8_t *)&(app->name);
-
return app;
}
-void avd_app_delete(AVD_APP *app)
+// TODO(hafe) change this to a destructor
+static void avd_app_delete(AVD_APP *app)
{
- unsigned int rc = ncs_patricia_tree_del(&app_db, &app->tree_node);
- osafassert(rc == NCSCC_RC_SUCCESS);
+ AmfAppDb::erase(app);
m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, app, AVSV_CKPT_AVD_APP_CONFIG);
avd_apptype_remove_app(app);
delete app;
}
-AVD_APP *avd_app_get(const SaNameT *dn)
-{
- SaNameT tmp = {0};
-
- tmp.length = dn->length;
- memcpy(tmp.value, dn->value, tmp.length);
-
- return (AVD_APP *)ncs_patricia_tree_get(&app_db, (uint8_t *)&tmp);
-}
-
-AVD_APP *avd_app_getnext(const SaNameT *dn)
-{
- SaNameT tmp = {0};
-
- tmp.length = dn->length;
- memcpy(tmp.value, dn->value, tmp.length);
-
- return (AVD_APP *)ncs_patricia_tree_getnext(&app_db, (uint8_t *)&tmp);
-}
-
static void app_add_to_model(AVD_APP *app)
{
TRACE_ENTER2("%s", app->name.value);
@@ -88,7 +75,10 @@ static void app_add_to_model(AVD_APP *ap
goto done;
}
- avd_app_db_add(app);
+ if (AmfAppDb::find(&app->name) == NULL) {
+ AmfAppDb::insert(app);
+ }
+
/* Find application type and make a link with app type */
app->app_type = avd_apptype_get(&app->saAmfAppType);
osafassert(app->app_type);
@@ -229,7 +219,8 @@ AVD_APP *avd_app_create(const SaNameT *d
** If called at new active at failover, the object is found in the DB
** but needs to get configuration attributes initialized.
*/
- if (NULL == (app = avd_app_get(dn))) {
+ app = AmfAppDb::find(dn);
+ if (app == NULL) {
if ((app = avd_app_new(dn)) == NULL)
goto done;
} else
@@ -314,7 +305,7 @@ static void app_ccb_apply_cb(CcbUtilOper
break;
case CCBUTIL_MODIFY: {
const SaImmAttrModificationT_2 *attr_mod;
- app = avd_app_get(&opdata->objectName);
+ app = AmfAppDb::find(&opdata->objectName);
while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL)
{
const SaImmAttrValuesT_2 *attribute =
&attr_mod->modAttr;
@@ -334,7 +325,7 @@ static void app_ccb_apply_cb(CcbUtilOper
break;
}
case CCBUTIL_DELETE:
- app = avd_app_get(&opdata->objectName);
+ app = AmfAppDb::find(&opdata->objectName);
/* by this time all the SGs and SIs under this
* app object should have been *DELETED* just
* do a sanity check here
@@ -359,7 +350,7 @@ static void app_admin_op_cb(SaImmOiHandl
TRACE_ENTER2("%s", object_name->value);
/* Find the app name. */
- app = avd_app_get(object_name);
+ app = AmfAppDb::find(object_name);
osafassert(app != NULL);
if (op_id == SA_AMF_ADMIN_UNLOCK) {
@@ -416,7 +407,7 @@ done:
static SaAisErrorT app_rt_attr_cb(SaImmOiHandleT immOiHandle,
const SaNameT *objectName, const SaImmAttrNameT *attributeNames)
{
- AVD_APP *app = avd_app_get(objectName);
+ AVD_APP *app = AmfAppDb::find(objectName);
SaImmAttrNameT attributeName;
int i = 0;
@@ -493,12 +484,10 @@ SaAisErrorT avd_app_config_get(void)
void avd_app_constructor(void)
{
- NCS_PATRICIA_PARAMS patricia_params;
-
- patricia_params.key_size = sizeof(SaNameT);
- osafassert(ncs_patricia_tree_init(&app_db, &patricia_params) ==
NCSCC_RC_SUCCESS);
-
- avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfApplication"),
app_rt_attr_cb, app_admin_op_cb,
- app_ccb_completed_cb, app_ccb_apply_cb);
+ AmfAppDb::db = new AmfAppMap;
+ avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfApplication"),
+ app_rt_attr_cb,
+ app_admin_op_cb,
+ app_ccb_completed_cb,
+ app_ccb_apply_cb);
}
-
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
@@ -2243,16 +2243,12 @@ static uint32_t enc_cs_node_config(AVD_C
static uint32_t enc_cs_app_config(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc,
uint32_t *num_of_obj)
{
uint32_t status = NCSCC_RC_SUCCESS;
- SaNameT app_name;
- AVD_APP *app;
EDU_ERR ederror = static_cast<EDU_ERR>(0);
TRACE_ENTER();
- /*
- * Walk through the entire list and send the entire list data.
- */
- app_name.length = 0;
- for (app = avd_app_getnext(&app_name); app != NULL; app =
avd_app_getnext(&app_name)) {
+ /* Walk through all application instances and encode. */
+ for (AmfAppMap::iterator it = AmfAppDb::db->begin(); it !=
AmfAppDb::db->end(); it++) {
+ AVD_APP *app = it->second;
status = m_NCS_EDU_VER_EXEC(&cb->edu_hdl,
avsv_edp_ckpt_msg_app, &enc->io_uba,
EDP_OP_TYPE_ENC, app, &ederror,
enc->i_peer_version);
@@ -2261,7 +2257,6 @@ static uint32_t enc_cs_app_config(AVD_CL
return NCSCC_RC_FAILURE;
}
- app_name = app->name;
(*num_of_obj)++;
}
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
@@ -18,6 +18,7 @@
#include <logtrace.h>
#include <amfd.h>
#include <csi.h>
+#include <app.h>
static char *action_name[] = {
const_cast<char*>("invalid"),
@@ -95,14 +96,14 @@ done:
uint32_t avd_ckpt_app(AVD_CL_CB *cb, AVD_APP *ckpt_app, NCS_MBCSV_ACT_TYPE
action)
{
uint32_t rc = NCSCC_RC_SUCCESS;
- AVD_APP *app;
TRACE_ENTER2("%s - '%s'", action_name[action], ckpt_app->name.value);
osafassert (action == NCS_MBCSV_ACT_UPDATE);
- if (NULL == (app = avd_app_get(&ckpt_app->name))) {
- LOG_ER("avd_app_get FAILED for '%s'", ckpt_app->name.value);
+ AVD_APP *app = AmfAppDb::find(&ckpt_app->name);
+ if (app == NULL) {
+ LOG_ER("%s failed to find '%s'", __FUNCTION__,
ckpt_app->name.value);
rc = NCSCC_RC_FAILURE;
goto done;
}
diff --git a/osaf/services/saf/amf/amfd/include/app.h
b/osaf/services/saf/amf/amfd/include/app.h
--- a/osaf/services/saf/amf/amfd/include/app.h
+++ b/osaf/services/saf/amf/amfd/include/app.h
@@ -24,8 +24,13 @@
#ifndef AVD_APP_H
#define AVD_APP_H
+#include <map>
+#include <string>
+
#include <saAmf.h>
#include <saImm.h>
+
+// TODO(hafe) remove include below when apptype is using map
#include <ncspatricia.h>
#include <sg.h>
#include <si.h>
@@ -42,8 +47,8 @@ typedef struct avd_app_type_tag {
struct avd_app_tag *list_of_app;
} AVD_APP_TYPE;
+// TODO (hafe) change to class AmfApp
typedef struct avd_app_tag {
- NCS_PATRICIA_NODE tree_node; /* key is name */
SaNameT name;
SaNameT saAmfAppType;
SaAmfAdminStateT saAmfApplicationAdminState;
@@ -54,11 +59,15 @@ typedef struct avd_app_tag {
struct avd_app_type_tag *app_type;
} AVD_APP;
-extern void avd_app_db_add(AVD_APP *app);
-extern AVD_APP *avd_app_new(const SaNameT *dn);
-extern void avd_app_delete(AVD_APP *app);
-extern AVD_APP *avd_app_get(const SaNameT *app_name);
-extern AVD_APP *avd_app_getnext(const SaNameT *app_name);
+typedef std::map<std::string, AVD_APP*> AmfAppMap;
+
+class AmfAppDb {
+ public:
+ static AmfAppMap *db;
+ static void insert(AVD_APP *app);
+ static void erase(AVD_APP *app);
+ static AVD_APP *find(const SaNameT *name);
+};
extern void avd_app_add_si(AVD_APP *app, struct avd_si_tag *si);
extern void avd_app_remove_si(AVD_APP *app, struct avd_si_tag *si);
diff --git a/osaf/services/saf/amf/amfd/sg.cc b/osaf/services/saf/amf/amfd/sg.cc
--- a/osaf/services/saf/amf/amfd/sg.cc
+++ b/osaf/services/saf/amf/amfd/sg.cc
@@ -66,7 +66,7 @@ static void sg_add_to_model(AVD_SG *sg)
}
avsv_sanamet_init(&sg->name, &dn, "safApp");
- sg->app = avd_app_get(&dn);
+ sg->app = AmfAppDb::find(&dn);
avd_sg_db_add(sg);
sg->sg_type = avd_sgtype_get(&sg->saAmfSGType);
diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc
--- a/osaf/services/saf/amf/amfd/si.cc
+++ b/osaf/services/saf/amf/amfd/si.cc
@@ -450,7 +450,7 @@ static void si_add_to_model(AVD_SI *si)
}
avsv_sanamet_init(&si->name, &dn, "safApp");
- si->app = avd_app_get(&dn);
+ si->app = AmfAppDb::find(&dn);
avd_si_db_add(si);
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
@@ -1391,13 +1391,14 @@ void avsv_sanamet_init_from_association_
}
/**
- * Call this function from GDB to dump the AVD state. Example
- * below.
+ * Dumps the director state to file
+ * This can be done using GDB:
+ * $ gdb --pid=`pgrep osafamfd` -ex 'call
amfd_file_dump("/tmp/osafamfd.dump")' \
+ * /usr/local/lib/opensaf/osafamfd
*
* @param path
*/
-/* gdb --pid=`pgrep ncs_scap` -ex 'call avd_file_dump("/tmp/avd.dump")'
/usr/local/lib/opensaf/ncs_scap */
-void avd_file_dump(const char *path)
+void amfd_file_dump(const char *path)
{
SaNameT dn = {0};
FILE *f = fopen(path, "w");
@@ -1422,13 +1423,12 @@ void avd_file_dump(const char *path)
node_id = node->node_info.nodeId;
}
- AVD_APP *app;
- dn.length = 0;
- for (app = avd_app_getnext(&dn); app != NULL; app =
avd_app_getnext(&dn)) {
+ for (AmfAppMap::iterator it = AmfAppDb::db->begin();
+ it != AmfAppDb::db->end(); it++) {
+ const AVD_APP *app = it->second;
fprintf(f, "%s\n", app->name.value);
fprintf(f, "\tsaAmfApplicationAdminState=%u\n",
app->saAmfApplicationAdminState);
fprintf(f, "\tsaAmfApplicationCurrNumSGs=%u\n",
app->saAmfApplicationCurrNumSGs);
- dn = app->name;
}
AVD_SG *sg;
------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today.
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel