Hi Praveen, Ack (Test only).
Thanks, Quyen Subject: [devel] [PATCH 1 of 1] amfd: do not assign SUs on locked nodes when ng is deleted. [#1507] Date: Tue, 29 Sep 2015 12:37:07 +0530 From: [email protected] To: [email protected], [email protected], [email protected] CC: [email protected] osaf/services/saf/amf/amfd/nodegroup.cc | 44 ++++++++++++++++++++++++++++++--- 1 files changed, 40 insertions(+), 4 deletions(-) A nodegroup is deleted in locked state when some of the nodes are kept in admin unlocked state. Application remains in unassigned state. In CCB apply for deletion of NG, AMF is going for new assignments on the nodes of NG which are in locked state. Patch fixes the problem by calling the assignment logic only for unlocked nodes in CCB apply for deletion of NG. diff --git a/osaf/services/saf/amf/amfd/nodegroup.cc b/osaf/services/saf/amf/amfd/nodegroup.cc --- a/osaf/services/saf/amf/amfd/nodegroup.cc +++ b/osaf/services/saf/amf/amfd/nodegroup.cc @@ -568,14 +568,49 @@ static void ng_ccb_apply_modify_hdlr(Ccb TRACE_LEAVE(); } -static void node_ccb_completed_delete_hdlr(CcbUtilOperationData_t *opdata) +static void ng_ccb_apply_delete_hdlr(CcbUtilOperationData_t *opdata) { TRACE_ENTER(); AVD_AMF_NG *ng = avd_ng_get(&opdata->objectName); + if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) { + //Since AMF will delete NG, clear its pointers in node. + for (std::set<std::string>::const_iterator iter = ng->saAmfNGNodeList.begin(); + iter != ng->saAmfNGNodeList.end(); ++iter) { + AVD_AVND *node = avd_node_get(*iter); + node->admin_ng = NULL; + } + ng_delete(ng); + goto done; + } //Temporarily keep NG in UNLOCKED state to assign SUs. ng->saAmfNGAdminState = SA_AMF_ADMIN_UNLOCKED; - ng_unlock(ng); - + for (std::set<std::string>::const_iterator iter = ng->saAmfNGNodeList.begin(); + iter != ng->saAmfNGNodeList.end(); ++iter) { + AVD_AVND *node = avd_node_get(*iter); + if ((node->saAmfNodeOperState == SA_AMF_OPERATIONAL_DISABLED) || + (node->saAmfNodeAdminState != SA_AMF_ADMIN_UNLOCKED) || + (node->node_info.member == false)) + continue; + for (const auto& su : node->list_of_su) { + if (su->is_in_service() == true) { + su->set_readiness_state(SA_AMF_READINESS_IN_SERVICE); + } + } + } + for (std::set<std::string>::const_iterator iter = ng->saAmfNGNodeList.begin(); + iter != ng->saAmfNGNodeList.end(); ++iter) { + AVD_AVND *node = avd_node_get(*iter); + if ((node->saAmfNodeOperState == SA_AMF_OPERATIONAL_DISABLED) || + (node->node_info.member == false) || + (node->saAmfNodeAdminState != SA_AMF_ADMIN_UNLOCKED) || + (avd_cb->init_state == AVD_INIT_DONE)) + continue; + /* This node is capable of assignment. Let the SG semantics decide which + su to choose for assignment. + */ + for (const auto& su : node->list_of_su) + su->sg_of_su->su_insvc(avd_cb, su); + } //Since AMF will delete NG, clear its pointers in node. for (std::set<std::string>::const_iterator iter = ng->saAmfNGNodeList.begin(); iter != ng->saAmfNGNodeList.end(); ++iter) { @@ -584,6 +619,7 @@ static void node_ccb_completed_delete_hd } ng->node_oper_list.clear(); ng_delete(ng); +done: TRACE_LEAVE2("deleted %s", opdata->objectName.value); } /** @@ -606,7 +642,7 @@ static void ng_ccb_apply_cb(CcbUtilOpera ng_ccb_apply_modify_hdlr(opdata); break; case CCBUTIL_DELETE: - node_ccb_completed_delete_hdlr(opdata); + ng_ccb_apply_delete_hdlr(opdata); break; default: osafassert(0); ---------------------------------------------------------------------------- -- _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
