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

Reply via email to