Hi Nagu,

regarding item 1 I have to check with HansF. Item 2,  if 
saAmfCompCSISetCallbackTimeout is not configured then saAmfCtDefCallbackTimeout 
is used.
This patch introduces changing attributes in SaAmfCompType and if someone wants 
to change saAmfCtDefCallbackTimeout it will affect 
saAmfCompCSISetCallbackTimeout if it was not
configured, i.e use saAmfCtDefCallbackTimeout. This is how I interpreted this 
requirement. /Regards HansN

-----Original Message-----
From: Nagendra Kumar [mailto:nagendr...@oracle.com] 
Sent: den 18 juli 2014 14:50
To: Hans Nordebäck; Hans Feldt; Praveen Malviya
Cc: opensaf-devel@lists.sourceforge.net
Subject: RE: [PATCH 1 of 1] AMF: support immediate effect when changing 
comp-type attributes V2 [#819]

1.      Is changing saAmfCtDefCallbackTimeout, scope of this ticket ? The other 
attributes remain untouched.
2.      Ideally, if saAmfCompCSISetCallbackTimeout is set, changing 
saAmfCtDefCallbackTimeout should not be affecting 
saAmfCompCSISetCallbackTimeout. So is true for other Timeouts attributes.

Thanks
-Nagu


> -----Original Message-----
> From: Hans Nordeback [mailto:hans.nordeb...@ericsson.com]
> Sent: 15 July 2014 18:04
> To: hans.fe...@ericsson.com; Praveen Malviya; Nagendra Kumar
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: [PATCH 1 of 1] AMF: support immediate effect when changing 
> comp- type attributes V2 [#819]
> 
>  osaf/libs/common/amf/include/amf_defs.h         |   6 +
>  osaf/services/saf/amf/amfd/comptype.cc          |  61 +++++++++++++++++-
>  osaf/services/saf/amf/amfnd/compdb.cc           |  85
> +++++++++++++++++++++++++
>  osaf/services/saf/amf/amfnd/di.cc               |   3 +
>  osaf/services/saf/amf/amfnd/hcdb.cc             |   4 +-
>  osaf/services/saf/amf/amfnd/include/avnd_comp.h |  14 ++++
>  6 files changed, 169 insertions(+), 4 deletions(-)
> 
> 
> diff --git a/osaf/libs/common/amf/include/amf_defs.h
> b/osaf/libs/common/amf/include/amf_defs.h
> --- a/osaf/libs/common/amf/include/amf_defs.h
> +++ b/osaf/libs/common/amf/include/amf_defs.h
> @@ -247,6 +247,12 @@ typedef enum
>     saAmfCompType_ID,
>  } AVSV_AMF_COMP_ATTR_ID;
> 
> +/* Attribute ID enum for the saAmfCompType class */ typedef enum {
> +    saAmfCtDefCallbackTimeout_ID = 1
> +} AVSV_AMF_COMPTYPE_ATTR_ID;
> +
>  /* Attribute ID enum for the SaAmfHealthcheck class */  typedef enum  
> { diff --git a/osaf/services/saf/amf/amfd/comptype.cc
> b/osaf/services/saf/amf/amfd/comptype.cc
> --- a/osaf/services/saf/amf/amfd/comptype.cc
> +++ b/osaf/services/saf/amf/amfd/comptype.cc
> @@ -15,7 +15,9 @@
>   *            Ericsson
>   *
>   */
> -
> +#include <set>
> +#include <string.h>
> +#include "node.h"
>  #include <saImmOm.h>
>  #include <immutil.h>
>  #include <logtrace.h>
> @@ -396,6 +398,61 @@ done1:
>       return rc;
>  }
> 
> +static void ccb_apply_modify_hdlr(const CcbUtilOperationData_t 
> +*opdata) {
> +     const SaImmAttrModificationT_2 *attr_mod;
> +     int i;
> +     const AVD_COMP_TYPE *comp_type;
> +     SaNameT comp_type_name;
> +
> +     TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata-
> >objectName.value);
> +
> +     // input example: opdata.objectName.value,
> safVersion=1,safCompType=AmfDemo1
> +     comp_type_name = opdata->objectName;
> +
> +     if ((comp_type = comptype_db-
> >find(Amf::to_string(&comp_type_name))) == 0) {
> +             LOG_ER("Internal error: %s not found",
> comp_type_name.value);
> +             return;
> +     }
> +
> +     // Create a set of nodes where components "may" be using the given
> comp_type attributes.
> +     // A msg will be sent to the related node regarding this change. If 
> +a
> component has an
> +     // comp_type attribute that overrides this comp_type attribute it 
> +will be
> handled by the amfnd.
> +     std::set<AVD_AVND*, NodeNameCompare> node_set;
> +
> +     AVD_COMP *comp = comp_type->list_of_comp;
> +     while (comp != NULL) {
> +             node_set.insert(comp->su->su_on_node);
> +             TRACE("comp name %s on node %s", comp-
> >comp_info.name.value,  comp->su->su_on_node->name.value);
> +             comp = comp->comp_type_list_comp_next;
> +     }
> +
> +     std::set<AVD_AVND*>::iterator it;
> +     for (it = node_set.begin(); it != node_set.end(); ++it) {
> +             i = 0;
> +             while ((attr_mod = opdata->param.modify.attrMods[i++]) !=
> NULL) {
> +                     AVSV_PARAM_INFO param;
> +                     const SaImmAttrValuesT_2 *attribute = &attr_mod-
> >modAttr;
> +                     SaTimeT *param_val = (SaTimeT *)attribute-
> >attrValues[0];
> +
> +                     memset(&param, 0, sizeof(param));
> +                     param.class_id = AVSV_SA_AMF_COMP_TYPE;
> +                     param.act = AVSV_OBJ_OPR_MOD;
> +                     param.name = opdata->objectName;
> +                     param.value_len = sizeof(*param_val);
> +                     memcpy(param.value, param_val, param.value_len);
> +
> +                     if (!strcmp(attribute->attrName,
> "saAmfCtDefCallbackTimeout")) {
> +                             TRACE("saAmfCtDefCallbackTimeout to '%llu'
> for compType '%s' on node '%s'", *param_val,
> +                                   opdata->objectName.value, (*it)-
> >name.value);
> +                             param.attr_id =
> saAmfCtDefCallbackTimeout_ID;
> +                             avd_snd_op_req_msg(avd_cb, *it, &param);
> +                     } else
> +                             LOG_WA("Unexpected attribute name: %s",
> attribute->attrName);
> +             }
> +     }
> +}
> +
>  static void comptype_ccb_apply_cb(CcbUtilOperationData_t *opdata)  {
>       AVD_COMP_TYPE *comp_type;
> @@ -413,7 +470,7 @@ static void comptype_ccb_apply_cb(CcbUti
>               comptype_delete(static_cast<AVD_COMP_TYPE*>(opdata-
> >userData));
>               break;
>       case CCBUTIL_MODIFY:
> -             // values not used, no need to reinitialize type
> +             ccb_apply_modify_hdlr(opdata);
>               break;
>       default:
>               osafassert(0);
> diff --git a/osaf/services/saf/amf/amfnd/compdb.cc
> b/osaf/services/saf/amf/amfnd/compdb.cc
> --- a/osaf/services/saf/amf/amfnd/compdb.cc
> +++ b/osaf/services/saf/amf/amfnd/compdb.cc
> @@ -888,6 +888,86 @@ done:
>       return rc;
>  }
> 
> +uint32_t avnd_comptype_oper_req(AVND_CB *cb, AVSV_PARAM_INFO
> *param)
> +{
> +     uint32_t rc = NCSCC_RC_FAILURE;
> +
> +     AVND_COMP * comp;
> +     const char* comp_type_name;
> +     SaTimeT saAmfCtDefCallbackTimeout = 0;
> +
> +     TRACE_ENTER2("Op %u, %s", param->act, param->name.value);
> +
> +     switch (param->act) {
> +     case AVSV_OBJ_OPR_MOD:
> +     {
> +             osafassert(sizeof(SaTimeT) == param->value_len);
> +
> +             // 1. find component from componentType,
> +             // input example, param->name.value =
> safVersion=1,safCompType=AmfDemo1
> +             comp_type_name = (char *) param->name.value;
> +             TRACE("comp_type_name: %s", comp_type_name);
> +             osafassert(comp_type_name);
> +             // 2. search each component for a matching compType
> +
> +             comp = (AVND_COMP *) ncs_patricia_tree_getnext(&cb-
> >compdb, (uint8_t *) 0);
> +             while (comp != 0) {
> +                     if (strncmp((const char*) comp-
> >saAmfCompType.value, comp_type_name, comp->saAmfCompType.length)
> == 0) {
> +                             // 3. comptype found, check if component uses
> this comptype attribute value or if
> +                             // component has specialized this attribute
> value.
> +                             TRACE("comp name: %s , comp_type: %s",
> comp->name.value, comp->saAmfCompType.value);
> +
> +                             switch (param->attr_id) {
> +                             case saAmfCtDefCallbackTimeout_ID:
> +                                     saAmfCtDefCallbackTimeout =
> *((SaTimeT *) param->value);
> +                                     if (comp-
> >use_comptype_attr.test(PxiedInstCallbackTimeout)) {
> +                                             comp-
> >pxied_inst_cbk_timeout = saAmfCtDefCallbackTimeout;
> +                                             TRACE("comp-
> >pxied_inst_cbk_timeout modified to '%llu'", 
> >comp->pxied_inst_cbk_timeout);
> +                                     }
> +                                     if (comp-
> >use_comptype_attr.test(TerminateCallbackTimeout)) {
> +                                             comp->term_cbk_timeout =
> saAmfCtDefCallbackTimeout;
> +                                             TRACE("comp-
> >term_cbk_timeout modified to '%llu'", comp->term_cbk_timeout);
> +                                     }
> +                                     if (comp-
> >use_comptype_attr.test(PxiedCleanupCallbackTimeout)) {
> +                                             comp-
> >pxied_clean_cbk_timeout = saAmfCtDefCallbackTimeout;
> +                                             TRACE("comp-
> >pxied_clean_cbk_timeout modified to '%llu'", comp- 
> >pxied_clean_cbk_timeout);
> +                                     }
> +                                     if (comp-
> >use_comptype_attr.test(CsiSetCallbackTimeout)) {
> +                                             comp->csi_set_cbk_timeout =
> saAmfCtDefCallbackTimeout;
> +                                             TRACE("comp-
> >csi_set_cbk_timeout modified to '%llu'", comp->csi_set_cbk_timeout);
> 
> +                                     }
> +                                     if (comp-
> >use_comptype_attr.test(CsiRemoveCallbackTimeout)) {
> +                                             comp->csi_rmv_cbk_timeout
> = saAmfCtDefCallbackTimeout;
> +                                             TRACE("comp-
> >csi_rmv_cbk_timeout modified to '%llu'", comp->csi_rmv_cbk_timeout);
> 
> +                                     }
> +                                     break;
> +                             default:
> +                                     LOG_WA("Unexpected attribute id:
> %d", param->attr_id);
> +                             }
> +                     }
> +                     comp = (AVND_COMP *)
> ncs_patricia_tree_getnext(&cb->compdb, (uint8_t *) & comp->name);
> +             }
> +     }
> +     case AVSV_OBJ_OPR_DEL:
> +     {
> +             // Do nothing
> +             break;
> +     }
> +     default:
> +             LOG_NO("%s: Unsupported action %u", __FUNCTION__,
> param->act);
> +             goto done;
> +     }
> +
> +     rc = NCSCC_RC_SUCCESS;
> +
> +done:
> +     rc = NCSCC_RC_SUCCESS;
> +
> +     TRACE_LEAVE();
> +
> +     return rc;
> +}
> +
>  static void avnd_comptype_delete(amf_comp_type_t *compt)  {
>       int arg_counter;
> @@ -1270,6 +1350,7 @@ static void init_clc_cli_attributes(AVND
>                       attributes, 0, &cmd->timeout) != SA_AIS_OK) {
>               cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
>               comp->pxied_inst_cbk_timeout = comptype-
> >saAmfCtDefCallbackTimeout;
> +             comp->use_comptype_attr.set(PxiedInstCallbackTimeout);
>       } else {
>               comp->pxied_inst_cbk_timeout = cmd->timeout;
>       }
> @@ -1286,6 +1367,7 @@ static void init_clc_cli_attributes(AVND
>               if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) {
>                       cmd->timeout = comptype-
> >saAmfCtDefCallbackTimeout;
>                       comp->term_cbk_timeout = cmd->timeout;
> +                     comp-
> >use_comptype_attr.set(TerminateCallbackTimeout);
>               }
>               else
>                       cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
> @@ -1302,6 +1384,7 @@ static void init_clc_cli_attributes(AVND
>                       attributes, 0, &cmd->timeout) != SA_AIS_OK) {
>               cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
>               comp->pxied_clean_cbk_timeout = comptype-
> >saAmfCtDefCallbackTimeout;
> +             comp->use_comptype_attr.set(PxiedCleanupCallbackTimeout);
>       } else {
>               comp->pxied_clean_cbk_timeout = cmd->timeout;
>       }
> @@ -1412,10 +1495,12 @@ static int comp_init(AVND_COMP *comp, co
>       if
> (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompCSISetCallbackTi
> meout"), attributes,
>                           0, &comp->csi_set_cbk_timeout) != SA_AIS_OK)
>               comp->csi_set_cbk_timeout = comptype-
> >saAmfCtDefCallbackTimeout;
> +             comp->use_comptype_attr.set(CsiSetCallbackTimeout);
> 
>       if
> (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompCSIRmvCallbackT
> imeout"), attributes,
>                           0, &comp->csi_rmv_cbk_timeout) != SA_AIS_OK)
>               comp->csi_rmv_cbk_timeout = comptype-
> >saAmfCtDefCallbackTimeout;
> +             comp->use_comptype_attr.set(CsiRemoveCallbackTimeout);
> 
>       if
> (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompQuiescingComple
> teTimeout"), attributes,
>                           0, &comp->quies_complete_cbk_timeout) !=
> SA_AIS_OK)
> diff --git a/osaf/services/saf/amf/amfnd/di.cc
> b/osaf/services/saf/amf/amfnd/di.cc
> --- a/osaf/services/saf/amf/amfnd/di.cc
> +++ b/osaf/services/saf/amf/amfnd/di.cc
> @@ -225,6 +225,9 @@ uint32_t avnd_evt_avd_operation_request_
>       case AVSV_SA_AMF_COMP:
>               rc = avnd_comp_oper_req(cb, param);
>               break;
> +     case AVSV_SA_AMF_COMP_TYPE:
> +             rc = avnd_comptype_oper_req(cb, param);
> +             break;
>       case AVSV_SA_AMF_HEALTH_CHECK:
>               rc = avnd_hc_oper_req(cb, param);
>               break;
> diff --git a/osaf/services/saf/amf/amfnd/hcdb.cc
> b/osaf/services/saf/amf/amfnd/hcdb.cc
> --- a/osaf/services/saf/amf/amfnd/hcdb.cc
> +++ b/osaf/services/saf/amf/amfnd/hcdb.cc
> @@ -368,7 +368,7 @@ static void comp_hctype_update_compdb(AV  {
>       AVND_COMP_HC_REC *comp_hc_rec;
>       AVND_COMP * comp;
> -     char *comp_type_name;
> +     const char *comp_type_name;
>       AVSV_HLT_KEY hlt_chk;
>       AVND_COMP_HC_REC tmp_hc_rec;
> 
> @@ -385,7 +385,7 @@ static void comp_hctype_update_compdb(AV
> 
>                       // 3. matching compType found, check that component 
> does not have 
> a SaAmfHealthcheck rec (specialization)
>                       std::string hlt_chk_key = search_key((const char*)
> param->name.value, "safHealthcheckKey=");
> -                     if (hlt_chk_key.size() == 0) {
> +                     if (hlt_chk_key.empty()) {
>                               LOG_ER("%s: failed to get healthcheckKey from 
> %s", __FUNCTION__, 
> param->name.value);
>                               return;
>                       }
> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> --- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> +++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
> @@ -30,6 +30,8 @@
>  #ifndef AVND_COMP_H
>  #define AVND_COMP_H
> 
> +#include <bitset>
> +
>  struct avnd_cb_tag;
>  struct avnd_su_si_rec;
>  struct avnd_su_tag;
> @@ -279,6 +281,15 @@ typedef struct avnd_pxied_rec {
> 
>  typedef AVSV_COMP_INFO AVND_COMP_PARAM;
> 
> +enum UsedComptypeAttrs {
> +        PxiedInstCallbackTimeout,
> +        PxiedCleanupCallbackTimeout,
> +        TerminateCallbackTimeout,
> +        CsiSetCallbackTimeout,
> +        CsiRemoveCallbackTimeout,
> +        NumAttrs
> +};
> +
>  typedef struct avnd_comp_tag {
>       NCS_PATRICIA_NODE tree_node;    /* comp tree node (key is
> comp name) */
>       NCS_DB_LINK_LIST_NODE su_dll_node;      /* su dll node (key is 
> inst-level)
> */
> @@ -362,6 +373,8 @@ typedef struct avnd_comp_tag {
>       bool pending_delete; /* Used in deleting component when su is in
>                               instantiated state.*/
> 
> +     std::bitset<NumAttrs> use_comptype_attr;
> +
>  } AVND_COMP;
> 
>  #define AVND_COMP_NULL ((AVND_COMP *)0) @@ -874,6 +887,7 @@ extern 
> AVND_COMP_HC_REC *avnd_mbcsv_comp  extern void 
> avnd_mbcsv_comp_hc_rec_del(struct avnd_cb_tag *cb, AVND_COMP *comp, 
> AVND_COMP_HC_REC *rec);
> 
>  extern uint32_t avnd_comp_oper_req(struct avnd_cb_tag *cb, 
> AVSV_PARAM_INFO *param);
> +extern uint32_t avnd_comptype_oper_req(struct avnd_cb_tag *cb,
> AVSV_PARAM_INFO *param);
>  extern unsigned int avnd_comp_config_get_su(struct avnd_su_tag *su);  
> extern int avnd_comp_config_reinit(AVND_COMP *comp);  extern void 
> avnd_comp_delete(AVND_COMP *comp);

------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls. 
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to