Ack from me , with some minor comments: 1)PR doc needs to be updated. 2)Small fix similar to #1356 is required for lock-in and unlock-in operation also. 3)Two more minor comments below inline with [Praveen].
Thanks, Praveen On 12-May-15 1:19 PM, Hans Nordeback wrote: > osaf/services/saf/amf/amfd/include/sg.h | 1 + > osaf/services/saf/amf/amfd/ndproc.cc | 2 + > osaf/services/saf/amf/amfd/nodegroup.cc | 197 > ++++++++++++++++++++++++++++++++ > osaf/services/saf/amf/amfd/sgproc.cc | 20 +++- > 4 files changed, 219 insertions(+), 1 deletions(-) > > > Merged the V1 of this patch with Praveens patch. > > diff --git a/osaf/services/saf/amf/amfd/include/sg.h > b/osaf/services/saf/amf/amfd/include/sg.h > --- a/osaf/services/saf/amf/amfd/include/sg.h > +++ b/osaf/services/saf/amf/amfd/include/sg.h > @@ -552,6 +552,7 @@ extern bool sg_is_tolerance_timer_runnin > extern void avd_sg_adjust_config(AVD_SG *sg); > extern uint32_t sg_instantiated_su_count(const AVD_SG *sg); > extern bool sg_stable_after_lock_in_or_unlock_in(AVD_SG *sg); > +extern void process_su_si_response_for_ng(AVD_SU *su, SaAisErrorT res); > > > #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 > @@ -784,6 +784,8 @@ void avd_data_update_req_evh(AVD_CL_CB * > 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)); > + } else if (su->su_on_node->admin_ng != > NULL) { > + > process_su_si_response_for_ng(su, SA_AIS_OK); > } > > if (l_val == > SA_AMF_PRESENCE_TERMINATION_FAILED) { > 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 > @@ -824,6 +824,91 @@ void ng_unlock(AVD_AMF_NG *ng) > } > TRACE_LEAVE2("node_oper_list size:%u",ng->oper_list_size()); > } > + > +/** > + * Set term_state for all pre-inst SUs hosted on the specified node > + * > + * @param node > + */ > +static void node_sus_termstate_set(AVD_AVND *node, bool term_state) > +{ > + AVD_SU *su; > + > + for (su = node->list_of_su; su; su = su->avnd_list_su_next) { > + if (su->saAmfSUPreInstantiable == true) > + su->set_term_state(term_state); > + } > +} > + > +/** > + * perform unlock-instantiation on NG with honoring saAmfSURank. > + * > + * @param cb > + * @param ng > + */ > +static void ng_admin_unlock_inst(AVD_AMF_NG *ng) > +{ > + uint32_t su_try_inst; > + std::set<std::string> tmp_sg_list; > + TRACE_ENTER2("%s", ng->name.value); > + > + 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->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; > + } > + for (AVD_SU *node_su = node->list_of_su; node_su != NULL; > node_su = node_su->avnd_list_su_next) { > + /*Instantiate only those SUs in this SG which are > hosted on the Nodes of NG. > + Also honor saAmfSURank while instantating. > + */ > + AVD_SG *sg = node_su->sg_of_su; > + > + std::set<std::string>::const_iterator iter1 ; > + iter1 = tmp_sg_list.find(Amf::to_string(&sg->name)); > + if (iter1 != tmp_sg_list.end()) > + continue; > + > + AVD_SU *su = sg->list_of_su; > + for (su_try_inst = 0; su != NULL; su = > su->sg_list_su_next) { > + //Continue if this SU is not hosted on the Node > of NG. > + if > (node_in_nodegroup(Amf::to_string(&su->su_on_node->name), ng) == false) > + continue; > + > + if ((su->saAmfSUAdminState != > SA_AMF_ADMIN_LOCKED_INSTANTIATION) && > + (node->saAmfNodeAdminState != > SA_AMF_ADMIN_LOCKED_INSTANTIATION) && > + (su->saAmfSUOperState == > SA_AMF_OPERATIONAL_ENABLED) && > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED)) { > + if ((su->saAmfSUPreInstantiable == > false) || > + (node->node_state != > AVD_AVND_STATE_PRESENT)) > + continue; > + > + if (sg->saAmfSGNumPrefInserviceSUs > > su_try_inst) { > + if > (avd_snd_presence_msg(avd_cb, su, false) != NCSCC_RC_SUCCESS) { > + LOG_NO("Failed to send > Instantiation of '%s'", su->name.value); > + } else { > + > su->su_on_node->su_cnt_admin_oper++; > + su_try_inst++; > + } > + } > + } > + } > + tmp_sg_list.insert(Amf::to_string(&sg->name)); > + } > + TRACE("node:'%s', su_cnt_admin_oper:%u", > + node->name.value, node->su_cnt_admin_oper); > + if (node->su_cnt_admin_oper > 0) > + ng->node_oper_list.insert(Amf::to_string(&node->name)); > + } > + TRACE("node_oper_list size:%u",ng->oper_list_size()); > + TRACE_LEAVE(); > +} > + > /** > * Handle admin operations on SaAmfNodeGroup objects. > * > @@ -842,6 +927,118 @@ 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_BAD_OPERATION, NULL, [Praveen] Here return code should be SA_AIS_ERR_NO_OP. > + "'%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); [Praveen] Above line is not aligned. > + node_admin_state_set(node, > 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); > + 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; > + } > + avd_node_admin_lock_instantiation(node); > + TRACE("node:'%s', su_cnt_admin_oper:%u", > + node->name.value, > node->su_cnt_admin_oper); > + if (node->su_cnt_admin_oper > 0) > + > ng->node_oper_list.insert(Amf::to_string(&node->name)); > + } > + TRACE("node_oper_list size:%u",ng->oper_list_size()); > + 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); > + 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, false); > + node_admin_state_set(node, SA_AMF_ADMIN_LOCKED); > + } > + ng_admin_unlock_inst(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) { > diff --git a/osaf/services/saf/amf/amfd/sgproc.cc > b/osaf/services/saf/amf/amfd/sgproc.cc > --- a/osaf/services/saf/amf/amfd/sgproc.cc > +++ b/osaf/services/saf/amf/amfd/sgproc.cc > @@ -329,7 +329,7 @@ static void node_complete_admin_op(AVD_A > * @param[in] ptr to SU (AVD_SU). > * @param[in] res(SaAisErrorT). > */ > -static void process_su_si_response_for_ng(AVD_SU *su, SaAisErrorT res) > +void process_su_si_response_for_ng(AVD_SU *su, SaAisErrorT res) > { > TRACE_ENTER2("'%s'",su->name.value); > AVD_AMF_NG *ng = su->su_on_node->admin_ng; > @@ -377,6 +377,24 @@ static void process_su_si_response_for_n > avd_ng_admin_state_set(ng, SA_AMF_ADMIN_LOCKED); > } > } > + if (ng->saAmfNGAdminState == SA_AMF_ADMIN_LOCKED_INSTANTIATION) { > + if ((su->saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED) || > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_TERMINATION_FAILED)) { > + su->su_on_node->su_cnt_admin_oper--; > + TRACE("node:'%s', su_cnt_admin_oper:%u", > + > su->su_on_node->name.value,su->su_on_node->su_cnt_admin_oper); > + } > + } > + if ((ng->saAmfNGAdminState == SA_AMF_ADMIN_LOCKED) && > + (ng->admin_ng_pend_cbk.admin_oper == > SA_AMF_ADMIN_UNLOCK_INSTANTIATION)) { > + if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED) > || > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_TERMINATION_FAILED) || > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_INSTANTIATION_FAILED)) { > + su->su_on_node->su_cnt_admin_oper--; > + TRACE("node:'%s', su_cnt_admin_oper:%u", > + > su->su_on_node->name.value,su->su_on_node->su_cnt_admin_oper); > + } > + } > /*If no futher SU is undergoing assignment changes, erase node from > nodgroup operation tracking list.*/ > if (node->su_cnt_admin_oper == 0) { > ------------------------------------------------------------------------------ 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