Hi I will push this on Friday, with the changes suggested by Hans, if there are no more comments.
Thanks Gary On 6/9/17, 2:19 pm, "Gary Lee" <[email protected]> wrote: It is possible for an object to be deleted in IMM, before a standby SC finishes initilization. Now, if the related callbacks are processed by the standby late, then unnecessary assertions or null pointer accesses may occur. --- src/amf/amfd/cb.h | 1 + src/amf/amfd/comp.cc | 4 ++++ src/amf/amfd/compcstype.cc | 6 ++++++ src/amf/amfd/cstype.cc | 8 ++++++++ src/amf/amfd/hlt.cc | 7 +++++++ src/amf/amfd/node.cc | 11 +++++++++++ src/amf/amfd/nodeswbundle.cc | 3 +++ src/amf/amfd/sg.cc | 10 ++++++++++ src/amf/amfd/sgtype.cc | 10 ++++++++++ src/amf/amfd/si.cc | 10 ++++++++++ src/amf/amfd/si_dep.cc | 4 ++++ src/amf/amfd/sirankedsu.cc | 4 ++++ src/amf/amfd/su.cc | 14 ++++++++++++-- src/amf/amfd/sutype.cc | 7 +++++++ src/amf/amfd/svctype.cc | 8 ++++++++ src/amf/amfd/svctypecstypes.cc | 5 +++++ 16 files changed, 110 insertions(+), 2 deletions(-) diff --git a/src/amf/amfd/cb.h b/src/amf/amfd/cb.h index 6cdf9944f..6140258db 100644 --- a/src/amf/amfd/cb.h +++ b/src/amf/amfd/cb.h @@ -136,6 +136,7 @@ typedef struct cl_cb_tag { SaAmfHAStateT avail_state_avd; /* the redundancy state for * Availability director */ + bool is_active() {return avail_state_avd == SA_AMF_HA_ACTIVE;}; MDS_HDL vaddr_pwe_hdl; /* The pwe handle returned when * vdest address is created. diff --git a/src/amf/amfd/comp.cc b/src/amf/amfd/comp.cc index 4f2d16ac9..2e2c5b3ed 100644 --- a/src/amf/amfd/comp.cc +++ b/src/amf/amfd/comp.cc @@ -1752,6 +1752,10 @@ void comp_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata) { TRACE_ENTER(); AVD_COMP *comp = comp_db->find(Amf::to_string(&opdata->objectName)); + if (comp == nullptr && avd_cb->is_active() == false) { + TRACE_LEAVE(); + return; + } /* comp should be found in the database even if it was * due to parent su delete the changes are applied in * bottom up order so all the component deletes are applied diff --git a/src/amf/amfd/compcstype.cc b/src/amf/amfd/compcstype.cc index f45cb9fd9..b88bd801a 100644 --- a/src/amf/amfd/compcstype.cc +++ b/src/amf/amfd/compcstype.cc @@ -358,6 +358,10 @@ static SaAisErrorT compcstype_ccb_completed_cb(CcbUtilOperationData_t *opdata) { AVD_COMP_CSI_REL *compcsi; cst = compcstype_db->find(Amf::to_string(&opdata->objectName)); + if (cst == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + break; + } osafassert(cst); avsv_sanamet_init(Amf::to_string(&opdata->objectName), comp_name, "safComp="); @@ -380,6 +384,7 @@ static SaAisErrorT compcstype_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; } done: + TRACE_LEAVE(); return rc; } @@ -407,6 +412,7 @@ static void compcstype_ccb_apply_cb(CcbUtilOperationData_t *opdata) { osafassert(0); break; } + TRACE_LEAVE(); } static SaAisErrorT compcstype_rt_attr_callback( diff --git a/src/amf/amfd/cstype.cc b/src/amf/amfd/cstype.cc index a72aeecf2..cadc6dfa0 100644 --- a/src/amf/amfd/cstype.cc +++ b/src/amf/amfd/cstype.cc @@ -200,6 +200,11 @@ static SaAisErrorT cstype_ccb_completed_hdlr(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: cst = cstype_db->find(object_name); + if (cst == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + break; + } if (cst->list_of_csi != nullptr) { /* check whether there exists a delete operation for * each of the CSI in the cs_type list in the current CCB @@ -247,6 +252,9 @@ static void cstype_ccb_apply_cb(CcbUtilOperationData_t *opdata) { cstype_add_to_model(cst); break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + break; + } cstype_delete(static_cast<AVD_CS_TYPE *>(opdata->userData)); break; default: diff --git a/src/amf/amfd/hlt.cc b/src/amf/amfd/hlt.cc index f0fd0c2b1..27863db6e 100644 --- a/src/amf/amfd/hlt.cc +++ b/src/amf/amfd/hlt.cc @@ -71,6 +71,10 @@ static SaAisErrorT ccb_completed_delete_hdlr(CcbUtilOperationData_t *opdata) { avsv_sanamet_init(Amf::to_string(&opdata->objectName), comp_name, "safComp="); comp = comp_db->find(comp_name); + if (comp == nullptr && avd_cb->is_active() == false) { + opdata->userData = nullptr; + goto done; + } for (curr_susi = comp->su->list_of_susi; curr_susi != nullptr; curr_susi = curr_susi->su_next) for (compcsi = curr_susi->list_of_csicomp; compcsi; @@ -160,6 +164,9 @@ static void ccb_apply_modify_hdlr(CcbUtilOperationData_t *opdata) { static void ccb_apply_delete_hdlr(CcbUtilOperationData_t *opdata) { AVSV_PARAM_INFO param = {0}; + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + return; + } AVD_AVND *node = static_cast<AVD_AVND *>(opdata->userData); param.class_id = AVSV_SA_AMF_HEALTH_CHECK; diff --git a/src/amf/amfd/node.cc b/src/amf/amfd/node.cc index 9521a0978..d23c31ffe 100644 --- a/src/amf/amfd/node.cc +++ b/src/amf/amfd/node.cc @@ -532,6 +532,12 @@ static SaAisErrorT node_ccb_completed_delete_hdlr( TRACE_ENTER2("'%s'", osaf_extended_name_borrow(&opdata->objectName)); + if (node == nullptr && avd_cb->is_active() == false) { + opdata->userData = nullptr; + goto done; + } + osafassert(node != nullptr); + if (node->node_info.member) { report_ccb_validation_error(opdata, "Node '%s' is still cluster member", osaf_extended_name_borrow(&opdata->objectName)); @@ -783,6 +789,11 @@ static SaAisErrorT node_ccb_completed_cb(CcbUtilOperationData_t *opdata) { } static void node_ccb_apply_delete_hdlr(AVD_AVND *node) { + if (node == nullptr && avd_cb->is_active() == false) { + TRACE_ENTER(); + TRACE_LEAVE(); + return; + } TRACE_ENTER2("'%s'", node->name.c_str()); avd_node_delete_nodeid(node); avd_node_delete(node); diff --git a/src/amf/amfd/nodeswbundle.cc b/src/amf/amfd/nodeswbundle.cc index 16df1b432..4ab79f71c 100644 --- a/src/amf/amfd/nodeswbundle.cc +++ b/src/amf/amfd/nodeswbundle.cc @@ -122,6 +122,9 @@ static int is_swbdl_delete_ok(const std::string &bundle_dn, /* Check if any comps are referencing this bundle */ avsv_sanamet_init(bundle_dn, node_dn, "safAmfNode="); node = avd_node_get(node_dn); + if (node == nullptr && avd_cb->is_active() == false) { + return 1; + } if (!is_swbdl_delete_ok_for_node(bundle_dn, node_dn, node->list_of_ncs_su, opdata)) diff --git a/src/amf/amfd/sg.cc b/src/amf/amfd/sg.cc index 98cccc6bb..c0e7d7320 100644 --- a/src/amf/amfd/sg.cc +++ b/src/amf/amfd/sg.cc @@ -1624,6 +1624,12 @@ static SaAisErrorT sg_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: sg = sg_db->find(Amf::to_string(&opdata->objectName)); + if (sg == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + break; + } + osafassert(sg != nullptr); if (sg->list_of_si.empty() == false) { /* check whether there is parent app delete */ const SaNameTWrapper app_name(sg->app->name); @@ -1680,6 +1686,10 @@ static void sg_ccb_apply_cb(CcbUtilOperationData_t *opdata) { sg_add_to_model(sg); break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + break; + } + osafassert(opdata->userData != nullptr); avd_sg_delete(static_cast<AVD_SG *>(opdata->userData)); break; case CCBUTIL_MODIFY: diff --git a/src/amf/amfd/sgtype.cc b/src/amf/amfd/sgtype.cc index e97321eb1..25cfd7c20 100644 --- a/src/amf/amfd/sgtype.cc +++ b/src/amf/amfd/sgtype.cc @@ -382,6 +382,12 @@ static SaAisErrorT sgtype_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: sgt = sgtype_db->find(Amf::to_string(&opdata->objectName)); + if (sgt == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + goto done; + } + osafassert(sgt != nullptr); for (const auto &sg : sgt->list_of_sg) { SaNameTWrapper sg_name(sg->name); @@ -492,6 +498,10 @@ static void sgtype_ccb_apply_cb(CcbUtilOperationData_t *opdata) { sgtype_ccb_apply_modify_hdlr(opdata); break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + break; + } + osafassert(opdata->userData != nullptr); sgtype_delete(static_cast<AVD_AMF_SG_TYPE *>(opdata->userData)); break; default: diff --git a/src/amf/amfd/si.cc b/src/amf/amfd/si.cc index 27245339c..74b465314 100644 --- a/src/amf/amfd/si.cc +++ b/src/amf/amfd/si.cc @@ -1079,6 +1079,12 @@ static SaAisErrorT si_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: si = avd_si_get(Amf::to_string(&opdata->objectName)); + if (si == nullptr && avd_cb->is_active () == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + goto done; + } + osafassert(si != nullptr); if (nullptr != si->list_of_sisu) { report_ccb_validation_error(opdata, "SaAmfSI is in use '%s'", si->name.c_str()); @@ -1293,6 +1299,10 @@ static void si_ccb_apply_cb(CcbUtilOperationData_t *opdata) { si->si_add_to_model(); break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + break; + } + osafassert(opdata->userData != nullptr); avd_si_delete(static_cast<AVD_SI *>(opdata->userData)); break; case CCBUTIL_MODIFY: diff --git a/src/amf/amfd/si_dep.cc b/src/amf/amfd/si_dep.cc index 2772be2b8..55fcb28cb 100644 --- a/src/amf/amfd/si_dep.cc +++ b/src/amf/amfd/si_dep.cc @@ -1359,6 +1359,10 @@ static void sidep_ccb_apply_cb(CcbUtilOperationData_t *opdata) { case CCBUTIL_DELETE: avd_sidep_indx_init(Amf::to_string(&opdata->objectName), &tmp_sidep); sidep = sidep_db_find(tmp_sidep.spons_name, tmp_sidep.dep_name); + if (sidep == nullptr && avd_cb->is_active() == false) { + break; + } + osafassert(sidep != nullptr); dep_si = avd_si_get(sidep->dep_name); osafassert(dep_si != nullptr); /* If SI is in tolerance timer running state because of this diff --git a/src/amf/amfd/sirankedsu.cc b/src/amf/amfd/sirankedsu.cc index 0b060a09f..64cde49f5 100644 --- a/src/amf/amfd/sirankedsu.cc +++ b/src/amf/amfd/sirankedsu.cc @@ -340,6 +340,10 @@ static void sirankedsu_ccb_apply_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active () == false) { + break; + } + osafassert(opdata->userData != nullptr); /* delete and free the structure */ avd_sirankedsu_del_si_list( avd_cb, static_cast<AVD_SUS_PER_SI_RANK *>(opdata->userData)); diff --git a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc index 3726a71fb..9ade12f97 100644 --- a/src/amf/amfd/su.cc +++ b/src/amf/amfd/su.cc @@ -1661,6 +1661,11 @@ static SaAisErrorT su_ccb_completed_delete_hdlr( is_app_su = 0; su = su_db->find(Amf::to_string(&opdata->objectName)); + if (su == nullptr && avd_cb->is_active() == false) { + opdata->userData = nullptr; + TRACE_LEAVE(); + return SA_AIS_OK; + } osafassert(su != nullptr); if (is_app_su) { @@ -2008,10 +2013,15 @@ static void su_ccb_apply_modify_hdlr(struct CcbUtilOperationData *opdata) { * @param su */ void su_ccb_apply_delete_hdlr(struct CcbUtilOperationData *opdata) { - AVD_SU *su = static_cast<AVD_SU *>(opdata->userData); AVD_AVND *su_node_ptr; AVSV_PARAM_INFO param; - AVD_SG *sg = su->sg_of_su; + AVD_SG *sg; + + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + return; + } + AVD_SU *su = static_cast<AVD_SU *>(opdata->userData); + sg = su->sg_of_su; TRACE_ENTER2("'%s'", su->name.c_str()); diff --git a/src/amf/amfd/sutype.cc b/src/amf/amfd/sutype.cc index 344b94332..e3fe7b3d3 100644 --- a/src/amf/amfd/sutype.cc +++ b/src/amf/amfd/sutype.cc @@ -281,6 +281,9 @@ static void sutype_ccb_apply_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: sut = sutype_db->find(Amf::to_string(&opdata->objectName)); + if (sut == nullptr && avd_cb->is_active() == false) { + break; + } sutype_db->erase(sut->name); sutype_delete(&sut); break; @@ -373,6 +376,10 @@ static SaAisErrorT sutype_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: sut = sutype_db->find(Amf::to_string(&opdata->objectName)); + if (sut == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + break; + } /* check whether there exists a delete operation for * each of the SU in the su_type list in the current CCB diff --git a/src/amf/amfd/svctype.cc b/src/amf/amfd/svctype.cc index d576542bd..c7e597e80 100644 --- a/src/amf/amfd/svctype.cc +++ b/src/amf/amfd/svctype.cc @@ -155,6 +155,11 @@ static SaAisErrorT svctype_ccb_completed_cb(CcbUtilOperationData_t *opdata) { break; case CCBUTIL_DELETE: svc_type = svctype_db->find(Amf::to_string(&opdata->objectName)); + if (svc_type == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + break; + } /* check whether there exists a delete operation for * each of the SI in the svc_type list in the current CCB @@ -200,6 +205,9 @@ static void svctype_ccb_apply_cb(CcbUtilOperationData_t *opdata) { svctype_db_add(svc_type); break; case CCBUTIL_DELETE: + if (opdata->userData == nullptr && avd_cb->is_active() == false) { + break; + } svctype_delete(static_cast<AVD_SVC_TYPE *>(opdata->userData)); break; default: diff --git a/src/amf/amfd/svctypecstypes.cc b/src/amf/amfd/svctypecstypes.cc index f1f8e439a..381dc3980 100644 --- a/src/amf/amfd/svctypecstypes.cc +++ b/src/amf/amfd/svctypecstypes.cc @@ -157,6 +157,11 @@ static SaAisErrorT svctypecstypes_ccb_completed_cb( case CCBUTIL_DELETE: svctypecstype = svctypecstypes_db->find(Amf::to_string(&opdata->objectName)); + if (svctypecstype == nullptr && avd_cb->is_active() == false) { + rc = SA_AIS_OK; + opdata->userData = nullptr; + break; + } if (svctypecstype->curr_num_csis == 0) { rc = SA_AIS_OK; opdata->userData = svctypecstype; -- 2.11.0 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
