osaf/services/saf/amf/amfd/comp.cc        |   2 +-
 osaf/services/saf/amf/amfd/include/comp.h |   1 +
 osaf/services/saf/amf/amfd/include/su.h   |   2 +-
 osaf/services/saf/amf/amfd/node.cc        |  54 +++++++++++++++++++++++++++++++
 osaf/services/saf/amf/amfd/su.cc          |   2 +-
 osaf/services/saf/amf/amfd/util.cc        |  16 +++++++++
 6 files changed, 74 insertions(+), 3 deletions(-)


If SUs are deleted at Act Amfd when Stdby Amfd has finished
reading objects from Imm database, Stdby Amfd still has those SUs.
Now, if node hosting those Sus are deleted, Act Amfd says Ok, but
Stdby Amfd says it still has some SUs left on that node to be deleted.
Hence in apply callback, Stdby Amfd crashes.
So, this patch makes sure that in this particular scenarios, if
node is being deleted and if there are some Sus and its child obkects
are still there, Stdby Amfd deletes them.

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
@@ -1577,7 +1577,7 @@ static void comp_ccb_apply_modify_hdlr(s
        TRACE_LEAVE();
 }
 
-static void comp_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata)
+void comp_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata)
 {
        TRACE_ENTER();
 
diff --git a/osaf/services/saf/amf/amfd/include/comp.h 
b/osaf/services/saf/amf/amfd/include/comp.h
--- a/osaf/services/saf/amf/amfd/include/comp.h
+++ b/osaf/services/saf/amf/amfd/include/comp.h
@@ -275,4 +275,5 @@ bool comp_is_preinstantiable(const AVD_C
 extern bool is_comp_assigned_any_csi(AVD_COMP *comp);
 extern SaAisErrorT check_comp_stability(const AVD_COMP*);
 extern AVD_CTCS_TYPE *get_ctcstype(const SaNameT *comptype_name, const SaNameT 
*cstype_name);
+extern void comp_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata);
 #endif
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
@@ -171,5 +171,5 @@ extern SaAisErrorT avd_su_config_get(con
  * Class constructor, must be called before any other function
  */
 extern void avd_su_constructor(void);
-
+extern void su_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata);
 #endif
diff --git a/osaf/services/saf/amf/amfd/node.cc 
b/osaf/services/saf/amf/amfd/node.cc
--- a/osaf/services/saf/amf/amfd/node.cc
+++ b/osaf/services/saf/amf/amfd/node.cc
@@ -165,9 +165,56 @@ AVD_AVND *avd_node_new(const SaNameT *dn
 
 void avd_node_delete(AVD_AVND *node)
 {
+       TRACE_ENTER();
        osafassert(node->pg_csi_list.n_nodes == 0);
        if (node->node_info.nodeId)
                avd_node_delete_nodeid(node);
+       /* Check if the SUs and related objects are still left. This can
+          happen on Standby Amfd when it has just read the configuration
+          and before it becomes applier, Act Amfd deletes SUs. Those SUs
+          will be left out at Standby Amfd. Though this could be rare.*/
+       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) {
+               if (node->list_of_su.empty() != true) {
+                       std::vector<AVD_SU*> *su_list = nullptr;
+                       su_list = &node->list_of_su;
+                       std::vector<AVD_SU*>::const_iterator su_iter;
+                       for (su_iter = su_list->begin(); su_iter != 
su_list->end(); ) {
+                               AVD_SU *su = *su_iter;
+                               TRACE("Standby Amfd, su '%s' not deleted", 
su->name.value);
+                               std::vector<AVD_COMP*> *comp_list = nullptr;
+                               comp_list = &su->list_of_comp;
+                               std::vector<AVD_COMP*>::const_iterator 
comp_iter;
+                               for (comp_iter = comp_list->begin(); comp_iter 
!= comp_list->end(); ) {
+                                       AVD_COMP *comp = *comp_iter;
+                                       TRACE("Standby Amfd, comp '%s' not 
deleted", comp->comp_info.name.value);
+                                       /* Delete the CompCsType. */
+                                       for (std::map<std::string, 
AVD_COMPCS_TYPE*>::const_iterator it =
+                                                       compcstype_db->begin();
+                                                       it != 
compcstype_db->end(); it++) {
+                                               AVD_COMPCS_TYPE *compcstype = 
it->second;
+                                               if (compcstype->comp == comp) {
+                                                       TRACE("Standby Amfd, 
compcstype '%s' not deleted",
+                                                                       
compcstype->name.value);
+                                                       
compcstype_db->erase(Amf::to_string(&compcstype->name));
+                                                       delete compcstype;
+                                               }
+                                       }
+
+                                       /* Delete the Comp. */
+                                       struct CcbUtilOperationData opdata;
+                                       memset(&opdata.objectName, 0, 
sizeof(SaNameT));
+                                       memcpy(opdata.objectName.value, 
comp->comp_info.name.value,
+                                                       
comp->comp_info.name.length);
+                                       opdata.objectName.length = 
comp->comp_info.name.length;
+                                       comp_ccb_apply_delete_hdlr(&opdata);
+                               }
+                               /* Delete the SU. */
+                               struct CcbUtilOperationData opdata;
+                               opdata.userData = su;
+                               su_ccb_apply_delete_hdlr(&opdata);
+                       }
+               }
+       }
        m_AVSV_SEND_CKPT_UPDT_ASYNC_RMV(avd_cb, node, 
AVSV_CKPT_AVD_NODE_CONFIG);
        node_name_db->erase(Amf::to_string(&node->name));
        delete [] node->node_name;
@@ -493,6 +540,10 @@ static SaAisErrorT node_ccb_completed_de
                return SA_AIS_ERR_BAD_OPERATION;
        }
 
+       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) {
+               goto done_ok;
+       }
+
        /* Check to see that no SUs exists on this node */
        if (node->list_of_su.empty() != true) {
                /* check whether there exists a delete operation for 
@@ -569,6 +620,9 @@ static SaAisErrorT node_ccb_completed_de
                        }
                }
        }
+
+done_ok:
+       rc = SA_AIS_OK;
        opdata->userData = node;
 done:
        TRACE_LEAVE();
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
@@ -1783,7 +1783,7 @@ static void su_ccb_apply_modify_hdlr(str
  * 
  * @param su
  */
-static void su_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata)
+void su_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata)
 {
        AVD_SU *su = static_cast<AVD_SU*>(opdata->userData);
        AVD_AVND *su_node_ptr;
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
@@ -1551,6 +1551,22 @@ int amfd_file_dump(const char *filename)
                        fprintf(f, "    saAmfCompCurrProxyName: %s\n", 
comp->saAmfCompCurrProxyName.value);
        }
 
+        fprintf(f, "COMPCS_TYPE:\n");
+        for (std::map<std::string, AVD_COMPCS_TYPE*>::const_iterator it = 
compcstype_db->begin();
+                        it != compcstype_db->end(); it++) {
+                const AVD_COMPCS_TYPE *compcs_type  = it->second;
+                fprintf(f, "  dn: %s\n", compcs_type->name.value);
+                fprintf(f, "    saAmfCompNumMaxActiveCSIs: %u\n",
+                                compcs_type->saAmfCompNumMaxActiveCSIs);
+                fprintf(f, "    saAmfCompNumMaxStandbyCSIs: %u\n",
+                                compcs_type->saAmfCompNumMaxStandbyCSIs);
+                fprintf(f, "    saAmfCompNumCurrActiveCSIs: %u\n",
+                                compcs_type->saAmfCompNumCurrActiveCSIs);
+                fprintf(f, "    saAmfCompNumCurrStandbyCSIs: %u\n",
+                                compcs_type->saAmfCompNumCurrStandbyCSIs);
+        }
+
+
        fprintf(f, "Node Groups:\n");
        for (std::map<std::string, AVD_AMF_NG*>::const_iterator it = 
nodegroup_db->begin();
                         it != nodegroup_db->end(); it++) {

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to