Hi Praveen, you mean that we can use version 1 of this patch then add your modified.patch on top of it and ignore version 2? /Thanks HansN
On 05/05/2015 03:06 PM, praveen malviya wrote: > > > On 28-Apr-15 4:39 PM, Hans Nordeback wrote: >> osaf/services/saf/amf/amfd/include/node.h | 1 + >> osaf/services/saf/amf/amfd/ndproc.cc | 23 ++- >> osaf/services/saf/amf/amfd/node.cc | 2 +- >> osaf/services/saf/amf/amfd/nodegroup.cc | 230 >> ++++++++++++++++++++++++++++++ >> 4 files changed, 253 insertions(+), 3 deletions(-) >> >> >> diff --git a/osaf/services/saf/amf/amfd/include/node.h >> b/osaf/services/saf/amf/amfd/include/node.h >> --- a/osaf/services/saf/amf/amfd/include/node.h >> +++ b/osaf/services/saf/amf/amfd/include/node.h >> @@ -232,4 +232,5 @@ extern void avd_nodeswbundle_constructor >> extern void ng_complete_admin_op(AVD_AMF_NG *ng, SaAisErrorT result); >> extern void avd_ng_admin_state_set(AVD_AMF_NG* ng, SaAmfAdminStateT >> state); >> extern bool are_all_ngs_in_unlocked_state(const AVD_AVND *node); >> +extern void node_sus_termstate_set(AVD_AVND *node, bool term_state); >> #endif >> 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 >> @@ -779,8 +779,26 @@ void avd_data_update_req_evh(AVD_CL_CB * >> l_val = ntohl(*((uint32_t >> *)&n2d_msg->msg_info.n2d_data_req.param_info.value[0])); >> su->set_pres_state(static_cast<SaAmfPresenceStateT>(l_val)); >> >> + AVD_AMF_NG *ng = su->su_on_node->admin_ng; >> + >> + if (ng != 0) { >> + TRACE("NG: admin_oper %u", >> ng->admin_ng_pend_cbk.admin_oper); >> + TRACE("NG: node->su_cnt_admin_oper %u", >> node->su_cnt_admin_oper); >> + TRACE("NG: node_oper_list size: %u", >> node->admin_ng->oper_list_size()); >> + >> + su->su_on_node->su_cnt_admin_oper--; >> + >> + if (node->su_cnt_admin_oper == 0) { >> + ng->node_oper_list.erase(Amf::to_string(&node->name)); >> + TRACE("node_oper_list size:%u", >> ng->oper_list_size()); >> + } >> + /*If adm oper changes are done on all the >> SUs on each node of nodegroup >> + then reply to IMM for status of admin >> operation.*/ >> + if (ng->node_oper_list.empty()) >> + ng_complete_admin_op(ng, SA_AIS_OK); >> + >> /* Send response to any admin callbacks >> delivered by IMM if not sent already. */ >> - if >> (su->su_on_node->admin_node_pend_cbk.invocation != 0) { >> + } else if >> (su->su_on_node->admin_node_pend_cbk.invocation != 0) { >> node_admin_op_report_to_imm(su, >> static_cast<SaAmfPresenceStateT>(l_val)); >> } else if (su->pend_cbk.invocation != 0) { >> su_admin_op_report_to_imm(su, >> static_cast<SaAmfPresenceStateT>(l_val)); >> @@ -843,7 +861,8 @@ void avd_data_update_req_evh(AVD_CL_CB * >> done: >> avsv_dnd_msg_free(n2d_msg); >> evt->info.avnd_msg = NULL; >> - TRACE_LEAVE(); >> + >> + TRACE_LEAVE2("su_cnt_admin_oper: %u", node->su_cnt_admin_oper); >> } >> >> /***************************************************************************** >> 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 >> @@ -1057,7 +1057,7 @@ void avd_node_admin_lock_unlock_shutdown >> * >> * @param node >> */ >> -static void node_sus_termstate_set(AVD_AVND *node, bool term_state) >> +void node_sus_termstate_set(AVD_AVND *node, bool term_state) >> { >> AVD_SU *su; >> >> 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 >> @@ -23,6 +23,7 @@ >> #include <cluster.h> >> #include <imm.h> >> #include <set> >> +#include <list> >> >> AmfDb<std::string, AVD_AMF_NG> *nodegroup_db = 0; >> static AVD_AMF_NG *ng_create(SaNameT *dn, const SaImmAttrValuesT_2 >> **attributes); >> @@ -722,6 +723,130 @@ void ng_complete_admin_op(AVD_AMF_NG *ng >> node->admin_ng = NULL; >> } >> } >> + >> + >> +static bool suRank(const AVD_AVND* a, const AVD_AVND* b) >> +{ >> + if (a->list_of_su && b->list_of_su) { >> + TRACE("Node %s and %s has SUs", a->name.value, >> b->name.value); >> + return a->list_of_su->saAmfSURank < >> b->list_of_su->saAmfSURank; >> + } else { >> + TRACE("Node %s or %s has no SUs", a->name.value, >> b->name.value); >> + return false; >> + } >> +} >> + >> +/** >> + * Sends msg to instantiate SUs on the node as part of unlock >> instantiation >> + * >> + * @param node >> + */ >> +uint32_t ng_node_admin_unlock_instantiation(AVD_AMF_NG *ng) >> +{ >> + std::list<AVD_AVND*> ng_nodes; // to be sorted by su rank for >> the whole node group >> + AVD_SU *su; >> + AVD_AVND *node; >> + uint32_t rc = NCSCC_RC_SUCCESS; >> + >> + TRACE_ENTER2("'%s'", ng->name.value); >> + >> + for (std::set<std::string>::const_iterator iter = >> ng->saAmfNGNodeList.begin(); >> + iter != ng->saAmfNGNodeList.end(); ++iter) { >> + node = avd_node_get(*iter); >> + node_admin_state_set(node, SA_AMF_ADMIN_LOCKED); >> + node_sus_termstate_set(node, false); >> + >> + if (node->node_info.member == false) { >> + LOG_NO("'%s' UNLOCK_INSTANTIATION: CLM node is not >> member", node->name.value); >> + continue; >> + } >> + if (node->saAmfNodeOperState == SA_AMF_OPERATIONAL_DISABLED) { >> + LOG_NO("'%s' UNLOCK_INSTANTIATION: AMF node oper state >> disabled", node->name.value); >> + continue; >> + } >> + node->su_cnt_admin_oper = 0; >> + node->admin_ng = ng; >> + >> + ng_nodes.push_back(node); >> + } >> + >> + // list of nodegroup nodes sorted in suRank order >> + ng_nodes.sort(suRank); >> + > Since nodes simultaneously hosts SUs from different SGs, nodes may > host a high rank SUs from one SG and a low rank SU from other SG. So > while instantiating all SUs of a node a lower rank SU may get > instantiated first then a higher ranked SU hosted on some other node > of same nodegroup. > I have gone ahead and modified version 1 of your patch itself (see > attached modified.patch). This can be applied on top of the version1 > and takes care of instantiating the SUs on the nodes of nodegroup > honoring SU ranks in the SG. Patch also incorporates some other > comments also. > We can use this patch on top of version 1 ad the final patch if you > are ok. > > Thanks, > Praveen > >> + for (std::list<AVD_AVND*>::iterator it = ng_nodes.begin(); it != >> ng_nodes.end(); it++) { >> + node = *it; >> + /* instantiate the SUs on this Node */ >> + su = node->list_of_su; >> + while (su != NULL) { >> + if ((su->saAmfSUAdminState != >> SA_AMF_ADMIN_LOCKED_INSTANTIATION) && >> + (su->sg_of_su->saAmfSGAdminState != >> SA_AMF_ADMIN_LOCKED_INSTANTIATION) && >> + (su->saAmfSUPresenceState == >> SA_AMF_PRESENCE_UNINSTANTIATED) && >> + (su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)) { >> + >> + if (su->saAmfSUPreInstantiable == true) { >> + if (su->sg_of_su->saAmfSGNumPrefInserviceSUs > >> + (sg_instantiated_su_count(su->sg_of_su) + >> + su->sg_of_su->try_inst_counter)) { >> + if (avd_snd_presence_msg(avd_cb, su, false) >> == NCSCC_RC_SUCCESS) { >> + node->su_cnt_admin_oper++; >> + su->sg_of_su->try_inst_counter++; >> + } else { >> + rc = NCSCC_RC_FAILURE; >> + LOG_WA("Failed Instantiation '%s'", >> su->name.value); >> + } >> + } >> + } >> + } >> + su = su->avnd_list_su_next; >> + } >> + >> + node_reset_su_try_inst_counter(node); >> + >> + if (node->su_cnt_admin_oper > 0) >> + node->admin_ng->node_oper_list.insert(Amf::to_string(&node->name)); >> + } >> + >> + TRACE_LEAVE2("%u", rc); >> + return rc; >> +} >> + >> +/** >> + * Sends msg to terminate all SUs on the node as part of lock >> instantiation >> + * >> + * @param node >> + */ >> +uint32_t ng_node_admin_lock_instantiation(AVD_AVND *node) >> +{ >> + AVD_SU *su; >> + uint32_t rc = NCSCC_RC_SUCCESS; >> + >> + TRACE_ENTER2("%s", node->name.value); >> + >> + /* terminate all the SUs on this Node */ >> + su = node->list_of_su; >> + while (su != NULL) { >> + if ((su->saAmfSUPreInstantiable == true) && >> + (su->saAmfSUPresenceState != >> SA_AMF_PRESENCE_UNINSTANTIATED) && >> + (su->saAmfSUPresenceState != >> SA_AMF_PRESENCE_INSTANTIATION_FAILED) && >> + (su->saAmfSUPresenceState != >> SA_AMF_PRESENCE_TERMINATION_FAILED)) { >> + >> + if (avd_snd_presence_msg(avd_cb, su, true) == >> NCSCC_RC_SUCCESS) { >> + node->su_cnt_admin_oper++; >> + } else { >> + rc = NCSCC_RC_FAILURE; >> + LOG_WA("Failed Termination '%s'", su->name.value); >> + } >> + } >> + su = su->avnd_list_su_next; >> + } >> + >> + if (node->su_cnt_admin_oper > 0) >> + node->admin_ng->node_oper_list.insert(Amf::to_string(&node->name)); >> + >> + TRACE_LEAVE2("rc: %u, node_oper_list size %u", rc, >> node->admin_ng->oper_list_size()); >> + return rc; >> +} >> + >> /** >> * @brief Handles node level funtionality during nodegroup lock >> * or shutdown operation. For each SU hosted on this >> node, >> @@ -811,6 +936,7 @@ void ng_unlock(AVD_AMF_NG *ng) >> } >> TRACE_LEAVE2("node_oper_list size:%u",ng->oper_list_size()); >> } >> + >> /** >> * Handle admin operations on SaAmfNodeGroup objects. >> * >> @@ -829,6 +955,110 @@ static void ng_admin_op_cb(SaImmOiHandle >> TRACE_ENTER2("'%s', inv:'%llu', >> op:'%llu'",ng_name->value,invocation,op_id); >> >> switch(op_id) { >> + case SA_AMF_ADMIN_LOCK_INSTANTIATION: >> + rc = check_ng_stability(ng); >> + if (rc != SA_AIS_OK) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> + SA_AIS_ERR_TRY_AGAIN, NULL, >> + "Some entity is unstable, Operation cannot " >> + "be performed on '%s'" >> + "Check syslog for entity details", >> ng_name->value); >> + goto done; >> + } >> + if (ng->saAmfNGAdminState == >> SA_AMF_ADMIN_LOCKED_INSTANTIATION) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> SA_AIS_ERR_NO_OP, NULL, >> + "'%s' Invalid Admin Operation LOCK >> INSTANTIATION in state %s", >> + ng->name.value, >> avd_adm_state_name[ng->saAmfNGAdminState]); >> + goto done; >> + } >> + if (ng->saAmfNGAdminState != SA_AMF_ADMIN_LOCKED) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> SA_AIS_ERR_BAD_OPERATION, NULL, >> + "'%s' Invalid Admin Operation >> LOCK_INSTANTIATION in state %s", >> + ng->name.value, >> avd_adm_state_name[ng->saAmfNGAdminState]); >> + goto done; >> + } >> + rc = check_red_model_service_outage(ng); >> + if (rc != SA_AIS_OK) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> + SA_AIS_ERR_NOT_SUPPORTED, NULL, >> + "SUs of unsupported red models hosted on >> '%s'" >> + "Check syslog for entity details", >> ng_name->value); >> + goto done; >> + } >> + ng->admin_ng_pend_cbk.invocation = invocation; >> + ng->admin_ng_pend_cbk.admin_oper = >> static_cast<SaAmfAdminOperationIdT>(op_id); >> + ng->node_oper_list.clear(); >> + >> + avd_ng_admin_state_set(ng, SA_AMF_ADMIN_LOCKED_INSTANTIATION); >> + for (std::set<std::string>::const_iterator iter = >> ng->saAmfNGNodeList.begin(); >> + iter != ng->saAmfNGNodeList.end(); ++iter) { >> + AVD_AVND *node = avd_node_get(*iter); >> + node->su_cnt_admin_oper = 0; >> + node->admin_ng = ng; >> + node_sus_termstate_set(node, true); >> + node_admin_state_set(node, >> SA_AMF_ADMIN_LOCKED_INSTANTIATION); >> + >> + if (node->node_info.member == false) { >> + LOG_NO("'%s' LOCK_INSTANTIATION: CLM node is not >> member", node->name.value); >> + continue; >> + } >> + >> + if (node->saAmfNodeOperState == >> SA_AMF_OPERATIONAL_DISABLED) { >> + LOG_NO("'%s' LOCK_INSTANTIATION: AMF node oper state >> disabled", node->name.value); >> + continue; >> + } >> + } >> + >> + for (std::set<std::string>::const_iterator iter = >> ng->saAmfNGNodeList.begin(); >> + iter != ng->saAmfNGNodeList.end(); ++iter) { >> + AVD_AVND *node = avd_node_get(*iter); >> + ng_node_admin_lock_instantiation(node); >> + } >> + >> + if (ng->node_oper_list.empty()) >> + ng_complete_admin_op(ng, SA_AIS_OK); >> + break; >> + case SA_AMF_ADMIN_UNLOCK_INSTANTIATION: >> + rc = check_ng_stability(ng); >> + if (rc != SA_AIS_OK) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> + SA_AIS_ERR_TRY_AGAIN, NULL, >> + "Some entity is unstable, Operation cannot " >> + "be performed on '%s'" >> + "Check syslog for entity details", >> ng_name->value); >> + goto done; >> + } >> + if (ng->saAmfNGAdminState == SA_AMF_ADMIN_LOCKED) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> SA_AIS_ERR_NO_OP, NULL, >> + "'%s' Already in LOCKED state", >> ng->name.value); >> + goto done; >> + } >> + >> + if (ng->saAmfNGAdminState != >> SA_AMF_ADMIN_LOCKED_INSTANTIATION) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> SA_AIS_ERR_BAD_OPERATION, NULL, >> + "'%s' Invalid Admin Operation >> UNLOCK_INSTANTIATION in state %s", >> + ng->name.value, >> avd_adm_state_name[ng->saAmfNGAdminState]); >> + goto done; >> + } >> + rc = check_red_model_service_outage(ng); >> + if (rc != SA_AIS_OK) { >> + report_admin_op_error(avd_cb->immOiHandle, invocation, >> + SA_AIS_ERR_NOT_SUPPORTED, NULL, >> + "SUs of unsupported red models hosted on >> '%s'" >> + "Check syslog for entity details", >> ng_name->value); >> + goto done; >> + } >> + >> + ng->admin_ng_pend_cbk.invocation = invocation; >> + ng->admin_ng_pend_cbk.admin_oper = >> static_cast<SaAmfAdminOperationIdT>(op_id); >> + ng->node_oper_list.clear(); >> + >> + avd_ng_admin_state_set(ng, SA_AMF_ADMIN_LOCKED); >> + ng_node_admin_unlock_instantiation(ng); >> + >> + if (ng->node_oper_list.empty()) >> + ng_complete_admin_op(ng, SA_AIS_OK); >> + break; >> case SA_AMF_ADMIN_LOCK: >> rc = check_ng_stability(ng); >> if (rc != SA_AIS_OK) { >> ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel