Ack, code review only/Regards HansN On 07/15/14 15:10, [email protected] wrote: > osaf/services/saf/amf/amfd/include/db_template.h | 3 + > osaf/services/saf/amf/amfd/include/su.h | 1 + > osaf/services/saf/amf/amfd/sg.cc | 11 +- > osaf/services/saf/amf/amfd/sgproc.cc | 110 > +++++++++++++++++++++- > osaf/services/saf/amf/amfd/su.cc | 22 ++++ > 5 files changed, 136 insertions(+), 11 deletions(-) > > > As of now, Amf is not considering in-service su to > instantiate as per saAmfSGNumPrefInserviceSUs. > This patch instantiates su if it is eligible. > It also terminates the out of service sus if any other > su gets unlocked and becomes eligible for getting assignment. > > diff --git a/osaf/services/saf/amf/amfd/include/db_template.h > b/osaf/services/saf/amf/amfd/include/db_template.h > --- a/osaf/services/saf/amf/amfd/include/db_template.h > +++ b/osaf/services/saf/amf/amfd/include/db_template.h > @@ -38,9 +38,12 @@ class AmfDb { > > typedef std::map<Key, T*> AmfDbMap; > typedef typename AmfDbMap::const_iterator const_iterator; > + typedef typename AmfDbMap::const_reverse_iterator const_reverse_iterator; > > const_iterator begin() const {return db.begin();} > const_iterator end() const {return db.end();} > + const_reverse_iterator rbegin() const {return db.rbegin();} > + const_reverse_iterator rend() const {return db.rend();} > > private: > AmfDbMap db; > 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 > @@ -119,6 +119,7 @@ class AVD_SU { > void set_su_switch(SaToggleState state); > avd_avnd_tag *get_node_ptr(void); > bool is_in_service(void); > + bool is_instantiable(void); > void reset_all_comps_assign_flag(); > AVD_COMP *find_unassigned_comp_that_provides_cstype(const SaNameT > *cstype); > void disable_comps(SaAisErrorT result); > diff --git a/osaf/services/saf/amf/amfd/sg.cc > b/osaf/services/saf/amf/amfd/sg.cc > --- a/osaf/services/saf/amf/amfd/sg.cc > +++ b/osaf/services/saf/amf/amfd/sg.cc > @@ -1713,14 +1713,15 @@ uint32_t sg_instantiated_su_count(const > AVD_SU *su; > > for (su = sg->list_of_su, inst_su_count = 0; su != NULL; su = > su->sg_list_su_next) { > - TRACE_1("su'%s', pres state'%u'", su->name.value, > su->saAmfSUPresenceState); > - if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED) > || > - (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_INSTANTIATING) || > - (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_RESTARTING)) { > + TRACE_1("su'%s', pres state'%u', in_serv'%u', PrefIn'%u'", > su->name.value, > + su->saAmfSUPresenceState, > su->saAmfSuReadinessState, sg->saAmfSGNumPrefInserviceSUs); > + if (((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED) > || > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_INSTANTIATING) || > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_RESTARTING))) { > inst_su_count ++; > } > } > - > + TRACE_LEAVE2("%u", inst_su_count); > return inst_su_count; > } > > 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 > @@ -28,6 +28,7 @@ > > #include <immutil.h> > #include <logtrace.h> > +#include <set> > > #include <amfd.h> > #include <imm.h> > @@ -1332,6 +1333,77 @@ done: > TRACE_LEAVE(); > } > > +/** > + * @brief This function finds higher rank unlocked, uninstantiated su. > + * @param ptr to sg > + * @param pointer to su > + * > + */ > +AVD_SU* su_to_instantiate(AVD_SG *sg) > +{ > + for (AVD_SU* i_su = sg->list_of_su; i_su != NULL; i_su = > i_su->sg_list_su_next) { > + TRACE("%s", i_su->name.value); > + if (i_su->is_instantiable()) > + return i_su; > + } > + return NULL; > +} > + > +/** > + * @brief This function finds lower rank unassigned, locked, intantiated > su. > + * @param ptr to sg > + * @param pointer to su > + * > + */ > +AVD_SU* su_to_terminate(AVD_SG *sg) > +{ > + AmfDb<std::string, AVD_SU> *su_rank = NULL; > + su_rank = new AmfDb<std::string, AVD_SU>; > + for (AVD_SU* i_su = sg->list_of_su; i_su != NULL; i_su = > i_su->sg_list_su_next) { > + TRACE("In Seq %s, %u", i_su->name.value, i_su->saAmfSURank); > + su_rank->insert(Amf::to_string(&i_su->name), i_su); > + } > + for (std::map<std::string, AVD_SU*>::const_reverse_iterator rit = > su_rank->rbegin(); > + rit != su_rank->rend(); ++rit) { > + AVD_SU *su = rit->second; > + TRACE("Rev %s, %u, %u, %u", su->name.value, su->saAmfSURank, > + su->saAmfSuReadinessState, > su->saAmfSUPresenceState); > + } > + for (std::map<std::string, AVD_SU*>::const_reverse_iterator rit = > su_rank->rbegin(); > + rit != su_rank->rend(); ++rit) { > + AVD_SU *su = rit->second; > + TRACE("Rev 2 %s, %u, %u, %u", su->name.value, su->saAmfSURank, > + su->saAmfSuReadinessState, > su->saAmfSUPresenceState); > + if ((su->saAmfSuReadinessState == > SA_AMF_READINESS_OUT_OF_SERVICE) && > + (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_INSTANTIATED) && > + (su->list_of_susi == NULL)) { > + return su; > + } > + } > + return NULL; > +} > + > +/** > + * @brief This function finds higher rank unlocked, uninstantiated su. > + * @param ptr to sg > + * @param pointer to su > + * > + */ > +uint32_t in_serv_su(AVD_SG *sg) > +{ > + TRACE_ENTER(); > + uint32_t in_serv = 0; > + for (AVD_SU* i_su = sg->list_of_su; i_su != NULL; i_su = > i_su->sg_list_su_next) { > + TRACE_ENTER2("%s", i_su->name.value); > + if (i_su->is_in_service()) { > + TRACE_ENTER2(" in_serv_su %s", i_su->name.value); > + in_serv ++; > + } > + } > + TRACE_LEAVE2("%u", in_serv); > + return in_serv; > +} > + > > /***************************************************************************** > * Function: avd_sg_app_su_inst_func > * > @@ -1397,8 +1469,6 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_ > } > > } else if ((i_su->saAmfSUPreInstantiable == true) && > - (sg->saAmfSGNumPrefInserviceSUs > > (sg_instantiated_su_count(i_su->sg_of_su) + > - > num_try_insvc_su)) && > (i_su->saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED) && > ((i_su->saAmfSUAdminState == > SA_AMF_ADMIN_UNLOCKED) || > (i_su->saAmfSUAdminState == > SA_AMF_ADMIN_LOCKED)) && > @@ -1408,10 +1478,38 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_ > (su_node_ptr->node_info.member == true) > && > (i_su->saAmfSUOperState == > SA_AMF_OPERATIONAL_ENABLED) && > (i_su->term_state == false)) { > - > - /* Try to Instantiate this SU */ > - if (avd_snd_presence_msg(cb, i_su, false) == > NCSCC_RC_SUCCESS) { > - num_try_insvc_su++; > + TRACE("%u, %u", sg->saAmfSGNumPrefInserviceSUs, > num_try_insvc_su); > + if (sg->saAmfSGNumPrefInserviceSUs > > (sg_instantiated_su_count(i_su->sg_of_su) + > + num_try_insvc_su)){ > + /* Try to Instantiate this SU */ > + if (avd_snd_presence_msg(cb, i_su, > false) == NCSCC_RC_SUCCESS) { > + num_try_insvc_su++; > + } > + } else { > + /* Check whether in-serv su are > sufficient. */ > + if (sg->saAmfSGNumPrefInserviceSUs > > in_serv_su(sg)) { > + /* Find most eligible SU(Higher > Rank, Unlocked) to instantiate. */ > + AVD_SU* su_inst = > su_to_instantiate(sg); > + /* Find lower rank unassigned, > locked, intantiated su to terminate. */ > + AVD_SU* su_term = > su_to_terminate(sg); > + TRACE("%p, %p", su_inst, > su_term); > + if (su_inst && su_term) { > + TRACE("%s, %s", > su_inst->name.value, su_term->name.value); > + /* Try to Instantiate > this SU */ > + if > (avd_snd_presence_msg(cb, su_inst, false) == NCSCC_RC_SUCCESS) { > + /* Don't > increment num_try_insvc_su as we are any way > + going to > terminate one SU. */; > + if > (avd_snd_presence_msg(cb, su_term, true) == > + > NCSCC_RC_SUCCESS) { > + > su_term->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); > + > num_insvc_su --; > + } > + } > + } else { > + /* No action to take if > any su can't be instantiated or > + if any su can't be > terminated. */ > + } > + } > } > } else > TRACE("nop for %s", i_su->name.value); > 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 > @@ -852,6 +852,7 @@ void AVD_SU::unlock(SaImmOiHandleT immoi > avd_sg_app_su_inst_func(avd_cb, sg_of_su); > } else > LOG_IN("SU '%s' is not in service", name.value); > + avd_sg_app_su_inst_func(avd_cb, sg_of_su); > > if (is_oper_successful == true) { > if (sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_REALIGN ) { > @@ -1943,6 +1944,27 @@ bool AVD_SU::is_in_service(void) { > } > } > > + > +/** > + * Checks if the SU can be made instantiated. > + * @param su > + * @return true if SU can be made in-service > + */ > +bool AVD_SU::is_instantiable(void) { > + struct avd_avnd_tag *node = get_node_ptr(); > + const AVD_SG *sg = sg_of_su; > + const AVD_APP *app = sg->app; > + > + return (avd_cluster->saAmfClusterAdminState == > SA_AMF_ADMIN_UNLOCKED) && > + (app->saAmfApplicationAdminState == > SA_AMF_ADMIN_UNLOCKED) && > + (saAmfSUAdminState == SA_AMF_ADMIN_UNLOCKED) && > + (sg->saAmfSGAdminState == SA_AMF_ADMIN_UNLOCKED) && > + (node->saAmfNodeAdminState == SA_AMF_ADMIN_UNLOCKED) > && > + (node->saAmfNodeOperState == > SA_AMF_OPERATIONAL_ENABLED) && > + (saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED) && > + (saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED); > +} > + > void AVD_SU::set_saAmfSUPreInstantiable(bool value) { > saAmfSUPreInstantiable = static_cast<SaBoolT>(value); > avd_saImmOiRtObjectUpdate(&name, "saAmfSUPreInstantiable",
------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
