Hi Praveen Ack with one comment below (review only)
Thanks Gary > On 10 Nov. 2016, at 6:13 pm, [email protected] wrote: > > osaf/services/saf/amf/amfd/ckpt_updt.cc | 4 + > osaf/services/saf/amf/amfd/imm.cc | 386 > +++++++++++++++++++++++++++++- > osaf/services/saf/amf/amfd/include/imm.h | 22 +- > osaf/services/saf/amf/amfd/include/util.h | 2 + > osaf/services/saf/amf/amfd/siass.cc | 7 +- > osaf/services/saf/amf/amfd/util.cc | 28 ++ > 6 files changed, 438 insertions(+), 11 deletions(-) > > > V2:Incorporated comments given by Gary. > > App Si is moving to UNASSIGNED state after middleware failover. > > Standby controller maintains a job queue for SU, SISU and COMPCSI. > In job queue both old and new state of a object or attribute will be present. > The issue is not observed normally because standby will update correct > state eventually from old to new. In the cases mentioned in the ticket: > -in one case, SI was deleted. Because of this after failover, IMM returns > failure for creating the SISU because > this new active AMFD is executing old job. > -in other case, Su was deleted and was added with new state. Here also after > failover new active AMFD updates > IMM with old state as it is executing old job. > > Patch fixes the problem by: > -remebering if job was created in active or stadby state of AMFD. > -After failover if new active finds some job that was created in standby > state, it checks > the status of objects or attributes and based on that job will be executed > with latest values or simple deleted. > > diff --git a/osaf/services/saf/amf/amfd/ckpt_updt.cc > b/osaf/services/saf/amf/amfd/ckpt_updt.cc > --- a/osaf/services/saf/amf/amfd/ckpt_updt.cc > +++ b/osaf/services/saf/amf/amfd/ckpt_updt.cc > @@ -463,6 +463,10 @@ uint32_t avd_ckpt_siass(AVD_CL_CB *cb, A > } else { > su_si_rel_ptr->comp_name = ""; > su_si_rel_ptr->csi_name = ""; > + //This is update of SUSI because of > modification of assignment. > + if (action == NCS_MBCSV_ACT_UPDATE) { > + avd_susi_update(su_si_rel_ptr, > su_si_rel_ptr->state); > + } > } > } else { > LOG_ER("%s:%u", __FUNCTION__, __LINE__); > diff --git a/osaf/services/saf/amf/amfd/imm.cc > b/osaf/services/saf/amf/amfd/imm.cc > --- a/osaf/services/saf/amf/amfd/imm.cc > +++ b/osaf/services/saf/amf/amfd/imm.cc > @@ -142,6 +142,12 @@ AvdJobDequeueResultT ImmObjCreate::exec( > TRACE_ENTER2("Create %s", parentName_.c_str()); > > const SaNameTWrapper parent_name(parentName_); > + //Check in AMF Db before creation in IMM. > + if (immobj_update_required() == false){ > + delete Fifo::dequeue(); > + res = JOB_EXECUTED; > + goto done; > + } > rc = saImmOiRtObjectCreate_2(immOiHandle, className_, > parent_name, attrValues_); > > @@ -163,7 +169,7 @@ AvdJobDequeueResultT ImmObjCreate::exec( > LOG_ER("%s: create FAILED %u", __FUNCTION__, rc); > res = JOB_ERR; > } > - > +done: > TRACE_LEAVE(); > > return res; > @@ -211,6 +217,12 @@ AvdJobDequeueResultT ImmObjUpdate::exec( > > TRACE_ENTER2("Update '%s' %s", dn.c_str(), attributeName_); > > + //update latest values. > + if (immobj_update_required() == false){ > + delete Fifo::dequeue(); > + res = JOB_EXECUTED; > + goto done; > + } > attrMod.modType = SA_IMM_ATTR_VALUES_REPLACE; > attrMod.modAttr.attrName = attributeName_; > attrMod.modAttr.attrValuesNumber = 1; > @@ -237,7 +249,7 @@ AvdJobDequeueResultT ImmObjUpdate::exec( > LOG_ER("%s: update FAILED %u", __FUNCTION__, rc); > res = JOB_ERR; > } > - > +done: > TRACE_LEAVE(); > return res; > } > @@ -260,6 +272,12 @@ AvdJobDequeueResultT ImmObjDelete::exec( > > TRACE_ENTER2("Delete %s", dn.c_str()); > > + //Check AMF db before deletion. > + if (immobj_update_required() == false){ > + delete Fifo::dequeue(); > + res = JOB_EXECUTED; > + goto done; > + } > rc = saImmOiRtObjectDelete_o3(immOiHandle, dn.c_str()); > > if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_NOT_EXIST)) { > @@ -280,7 +298,7 @@ AvdJobDequeueResultT ImmObjDelete::exec( > LOG_ER("%s: delete FAILED %u", __FUNCTION__, rc); > res = JOB_ERR; > } > - > +done: > TRACE_LEAVE(); > return res; > } > @@ -478,8 +496,8 @@ static const char *avd_class_names[] = { > "SaAmfSIDependency", > "SaAmfSIRankedSU", > > - "SaAmfCSIAssignment", > - "SaAmfSIAssignment" > + "SaAmfSIAssignment", > + "SaAmfCSIAssignment" > }; > > static AvdImmOiCcbApplyCallbackT ccb_apply_callback[AVSV_SA_AMF_CLASS_MAX]; > @@ -1683,6 +1701,8 @@ void avd_saImmOiRtObjectUpdate(const std > return; > > ImmObjUpdate *ajob = new ImmObjUpdate; > + if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) > + ajob->implementer = false; > > sz = value_size(attrValueType); > > @@ -1721,6 +1741,8 @@ void avd_saImmOiRtObjectCreate(const std > return; > > ImmObjCreate* ajob = new ImmObjCreate; > + if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) > + ajob->implementer = false; > > ajob->className_ = StrDup(className.c_str()); > osafassert(ajob->className_ != nullptr); > @@ -1744,6 +1766,8 @@ void avd_saImmOiRtObjectDelete(const std > return; > > ImmObjDelete *ajob = new ImmObjDelete; > + if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) > + ajob->implementer = false; > > ajob->dn = dn; > Fifo::queue(ajob); > @@ -2049,3 +2073,355 @@ void report_admin_op_error(SaImmOiHandle > } > > } > + > + > +/** > + * @brief Fetches latest attribute values from AMF db before creating any > runtime object in IMM. > + * Currently, standby AMFD creates runtime objects of only > + * AVSV_SA_AMF_SI_ASSIGNMENT and AVSV_SA_AMF_CSI_ASSIGNMENT. > + * @Return true/false. > + */ > +bool ImmObjCreate::immobj_update_required() { > + > + bool ret = true; > + int i = 0; > + AVD_SU_SI_REL *susi = nullptr; > + AVSV_AMF_CLASS_ID class_type = AVSV_SA_AMF_CLASS_INVALID; > + const SaImmAttrValuesT_2 *attribute = nullptr; > + if (implementer == true) > + return true; > + TRACE_ENTER2("class type:'%s'", className_); > + > + class_type = class_name_to_class_type(className_); > + if ((class_type != AVSV_SA_AMF_SI_ASSIGNMENT) && > + (class_type != AVSV_SA_AMF_CSI_ASSIGNMENT)) { > + TRACE_LEAVE2("false"); > + return false; > + } > + > + if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) { > + std::string su_name; > + std::string sisu_name; > + std::string::size_type pos; > + while ((attribute = attrValues_[i++]) != nullptr) { > + if (!strcmp(attribute->attrName, "safSISU")) { > + sisu_name = > Amf::to_string(reinterpret_cast<SaNameT*>(attribute->attrValues[0])); > + //at present sisu_name : > safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1. > + avsv_sanamet_init(sisu_name, su_name, "safSu="); > + su_name.erase(std::remove(su_name.begin(), su_name.end(), '\\'), > su_name.end()); > + TRACE_1("su_name:'%s'",su_name.c_str()); > + break; > + } > + } > + susi = avd_susi_find(avd_cb, su_name, parentName_); > + if (susi == nullptr) { > + TRACE_1("susi not found"); > + ret = false; > + goto done; > + } > + i=0; > + while ((attribute = attrValues_[i++]) != nullptr) { > + if (!strcmp(attribute->attrName, "safSISU")) { > + continue; > + } else if (!strcmp(attribute->attrName, "saAmfSISUHAState")) { > + TRACE_1("saAmfSISUHAState old value:%u, new value:%u", > + *static_cast<SaAmfHAStateT*>(attribute->attrValues[0]), susi->state); > + memcpy(attribute->attrValues[0], &susi->state, > value_size(attribute->attrValueType)); > + } else if (!strcmp(attribute->attrName, "osafAmfSISUFsmState")) { > + TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u", > + *static_cast<AVD_SU_SI_STATE*>(attribute->attrValues[0]), susi->fsm); > + memcpy(attribute->attrValues[0], &susi->fsm, > value_size(attribute->attrValueType)); > + } > + } > + } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) { > + std::string comp_name; > + std::string csicomp_name; > + std::string::size_type pos; > + AVD_CSI *csi = nullptr; > + AVD_COMP *comp = nullptr; > + AVD_COMP_CSI_REL *compcsi = nullptr; > + while ((attribute = attrValues_[i++]) != nullptr) { > + if (!strcmp(attribute->attrName, "safCSIComp")) { > + csicomp_name = > Amf::to_string(reinterpret_cast<SaNameT*>(attribute->attrValues[0])); > + //at present > csicomp_name:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1. > + avsv_sanamet_init(csicomp_name, comp_name, "safComp="); > + comp_name.erase(std::remove(comp_name.begin(), comp_name.end(), '\\'), > comp_name.end()); > + TRACE_1("comp_name:'%s'", comp_name.c_str()); > + break; > + } > + } > + csi = csi_db->find(parentName_); > + comp = comp_db->find(comp_name); > + if ((csi == nullptr) || (comp == nullptr)) { > + TRACE_1("comp or csi not found"); > + ret = false; > + goto done; > + } > + susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name); > + if (susi == nullptr) { > + TRACE_1("susi not found"); > + ret = false; > + goto done; > + } > + for (compcsi = susi->list_of_csicomp; compcsi; compcsi = > compcsi->susi_csicomp_next) { > + if ((compcsi->comp == comp) && (compcsi->csi == csi)) > + break; > + } > + if (compcsi == nullptr) { > + ret = false; > + goto done; > + } > + i = 0; > + while ((attribute = attrValues_[i++]) != nullptr) { > + if (!strcmp(attribute->attrName, "safCSIComp")) { > + continue; > + } else if (!strcmp(attribute->attrName, "saAmfCSICompHAState")) { > + TRACE_1("saAmfCSICompHAState old value:%u, new value:%u", > + *static_cast<SaAmfHAStateT*>(attribute->attrValues[0]), susi->state); > + memcpy(attribute->attrValues[0], &susi->state, > value_size(attribute->attrValueType)); > + } > + } > + } > +done: > + TRACE_LEAVE2("ret:%u",ret); > + return ret; > +} > + > +//Imm Object atrribute update related member functions. > +bool ImmObjUpdate::su_get_attr_value() { > + bool ret = true; > + AVD_SU *su = nullptr; > + su = su_db->find(dn); > + if (su == nullptr) { > + TRACE_1("su not found"); > + ret = false; > + goto done; > + } > + if (!strcmp(attributeName_, "saAmfSUOperState")) { > + TRACE_1("saAmfSUOperState old value:%u, new value:%u", > + *static_cast<SaAmfOperationalStateT*>(value_), su->saAmfSUOperState); > + memcpy(value_, &su->saAmfSUOperState, value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "saAmfSUReadinessState")) { > + TRACE_1("saAmfSuReadinessState old value:%u, new value:%u", > + *static_cast<SaAmfReadinessStateT*>(value_), > su->saAmfSuReadinessState); > + memcpy(value_, &su->saAmfSuReadinessState, value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "saAmfSUPresenceState")) { > + TRACE_1("saAmfSUPresenceState old value:%u, new value:%u", > + *static_cast<SaAmfPresenceStateT*>(value_), su->saAmfSUPresenceState); > + memcpy(value_, &su->saAmfSUPresenceState, value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "saAmfSUAdminState")) { > + TRACE_1("saAmfSUAdminState old value:%u, new value:%u", > + *static_cast<SaAmfAdminStateT*>(value_), su->saAmfSUAdminState); > + memcpy(value_, &su->saAmfSUAdminState, value_size(attrValueType_)); > + } else { > + //Other attributes not considered. > + ret = false; > + } > +done: > + return ret; > +} > +bool ImmObjUpdate::siass_get_attr_value() { > + std::string su_name; > + std::string si_name; > + //dn : > safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1 > + avd_association_namet_init(dn, su_name, si_name, AVSV_SA_AMF_SI); > + AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, su_name, si_name); > + if (susi == nullptr) { > + TRACE_1("SUSI not found"); > + return false; > + } > + if (!strcmp(attributeName_, "saAmfSISUHAState")) { > + TRACE_1("saAmfSISUHAState old value:%u, new value:%u", > + *static_cast<SaAmfHAStateT*>(value_), susi->state); > + memcpy(value_, &susi->state, value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "osafAmfSISUFsmState")) { > + TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u", > + *static_cast<AVD_SU_SI_STATE*>(value_), susi->fsm); > + memcpy(value_, &susi->fsm, value_size(attrValueType_)); > + } else > + return false; > + return true; > +} > +bool ImmObjUpdate::csiass_get_attr_value() { > + std::string comp_name; > + std::string csi_name; > + AVD_CSI *csi = nullptr; > + AVD_COMP *comp = nullptr; > + AVD_COMP_CSI_REL *compcsi = nullptr; > + > //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1 > + avd_association_namet_init(dn, comp_name, csi_name, AVSV_SA_AMF_CSI); > + csi = csi_db->find(csi_name); > + comp = comp_db->find(comp_name); > + if ((csi == nullptr) || (comp == nullptr)) { > + TRACE_1("comp or csi not found"); > + return false; > + } > + AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name); > + if (susi != nullptr) { > + TRACE_1("susi not found"); > + return false; > + } > + for (compcsi = susi->list_of_csicomp; compcsi; compcsi = > compcsi->susi_csicomp_next) { > + if ((compcsi->comp == comp) && (compcsi->csi == csi)) > + break; > + } > + if (compcsi != nullptr) { > + return false; > + } > + if (!strcmp(attributeName_, "saAmfCSICompHAState")) { > + TRACE_1("saAmfCSICompHAState old value:%u, new value:%u", > + *static_cast<SaAmfHAStateT*>(value_), susi->state); > + memcpy(value_, &susi->state, value_size(attrValueType_)); > + } else > + return false; > + > + return true; > +} > +bool ImmObjUpdate::comp_get_attr_value() { > + AVD_COMP *comp = nullptr; > + comp = comp_db->find(dn); > + if (comp == nullptr) { > + TRACE_1("comp not found"); > + return false; > + } > + if (!strcmp(attributeName_, "saAmfCompOperState")) { > + TRACE_1("saAmfCompOperState old value:%u, new value:%u", > + *static_cast<SaAmfOperationalStateT*>(value_), > comp->saAmfCompOperState); > + memcpy(value_, &comp->saAmfCompOperState, value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "saAmfCompReadinessState")) { > + TRACE_1("saAmfCompReadinessState old value:%u, new value:%u", > + *static_cast<SaAmfReadinessStateT*>(value_), > comp->saAmfCompReadinessState); > + memcpy(value_, &comp->saAmfCompReadinessState, > value_size(attrValueType_)); > + } else if (!strcmp(attributeName_, "saAmfCompPresenceState")) { > + TRACE_1(" saAmfCompPresenceState old value:%u, new value:%u", > + *static_cast<SaAmfPresenceStateT*>(value_), > comp->saAmfCompPresenceState); > + memcpy(value_, &comp->saAmfCompPresenceState, > value_size(attrValueType_)); > + } else { > + //Other attributes not considered. > + return false; > + } > + return true; > +} > +bool ImmObjUpdate::si_get_attr_value() { > + TRACE("si:'%s'",dn.c_str()); > + AVD_SI *si = si_db->find(dn); > + if (si == nullptr) { > + TRACE_1("si not found"); > + return false; > + } > + if (!strcmp(attributeName_, "saAmfSIAssignmentState")) { > + TRACE_1("saAmfSIAssignmentState old value:%u, new value:%u", > + *static_cast<SaAmfAssignmentStateT*>(value_), > si->saAmfSIAssignmentState); > + memcpy(value_, &si->saAmfSIAssignmentState, value_size(attrValueType_)); > + } > + return true; > +} > +/** > + * @brief Fetches latest value of attribute from AMF db before updating it > in IMM. > + * Currently, only for SU, Comp, SI, SISU and CSICOMP. > + * @Return true/false. > + */ > +bool ImmObjUpdate::immobj_update_required() { > + bool ret = true; > + AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn); > + if (implementer == true) > + return true; > + TRACE_ENTER2("class type:'%s'", avd_class_names[class_type] ); > + > + if (class_type == AVSV_SA_AMF_SI) { > + ret = si_get_attr_value(); > + } else if (class_type == AVSV_SA_AMF_COMP) { > + ret = comp_get_attr_value(); > + } else if (class_type == AVSV_SA_AMF_SU) { > + ret = su_get_attr_value(); > + } else if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) { > + ret = siass_get_attr_value(); > + } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT){ > + ret = csiass_get_attr_value(); > + } else { > + TRACE_1("Class not considered"); > + ret = false; > + } > + TRACE_LEAVE2("ret:%u",ret); > + return ret; > +} > + > + > +//Imm Object delete related member functions. > +bool ImmObjDelete::is_siass_exist() { > + std::string su_name; > + std::string si_name; > + //dn : > safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1 > + avd_association_namet_init(dn, su_name, si_name, AVSV_SA_AMF_SI); > + TRACE("si:%s",si_name.c_str()); > + TRACE("su:%s",su_name.c_str()); > + AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, su_name, si_name); > + //SUSI should not be present in AMF DB. > + if (susi != nullptr) { > + TRACE_1("SUSI found"); > + return false; > + } else { > + TRACE_1("SUSI not found"); > + } > + return true; > +} > +bool ImmObjDelete::is_csiass_exist() { > + bool ret = true; > + std::string comp_name; > + std::string csi_name; > + AVD_CSI *csi = nullptr; > + AVD_COMP *comp = nullptr; > + AVD_COMP_CSI_REL *compcsi = nullptr; > + AVD_SU_SI_REL *susi = nullptr; > + > //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1 > + TRACE("csiass:%s",dn.c_str()); > + avd_association_namet_init(dn, comp_name, csi_name, AVSV_SA_AMF_CSI); > + TRACE("csi:%s",csi_name.c_str()); > + TRACE("comp:%s",comp_name.c_str()); > + csi = csi_db->find(csi_name); > + comp = comp_db->find(comp_name); > + if ((csi == nullptr) || (comp == nullptr)) { > + TRACE_1("comp or csi not found"); > + goto done; > + } > + susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name); > + if (susi != nullptr) { > + TRACE_1("susi found"); > + for (compcsi = susi->list_of_csicomp; compcsi; compcsi = > compcsi->susi_csicomp_next) { > + if ((compcsi->comp == comp) && (compcsi->csi == csi)) > + break; > + } > + if (compcsi != nullptr) { > + ret = false; [GL] missing goto done? > + } > + } else { > + TRACE_1("SUSI not found"); > + } > + return true; > +done: > + return ret; > +} > + > +/* > + * @brief Checks existence of object in AMF db before deleting it from IMM. > + * Currently checks only for SISU and CSICOMP. > + * @Return true/false. > + */ > +bool ImmObjDelete::immobj_update_required() { > + bool ret = true; > + AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn); > + if (implementer == true) > + return true; > + TRACE_ENTER2("class type:'%s'", avd_class_names[class_type] ); > + if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) { > + ret = is_siass_exist(); > + } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) { > + ret = is_csiass_exist(); > + } else { > + TRACE_1("Class not considered"); > + ret = false; > + } > + TRACE_LEAVE2("ret:%u",ret); > + return ret; > +} > + > diff --git a/osaf/services/saf/amf/amfd/include/imm.h > b/osaf/services/saf/amf/amfd/include/imm.h > --- a/osaf/services/saf/amf/amfd/include/imm.h > +++ b/osaf/services/saf/amf/amfd/include/imm.h > @@ -52,6 +52,9 @@ typedef enum { > // TODO HANO Write comments > class Job { > public: > + bool implementer; > + > + Job():implementer(true) {}; > virtual AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle) = 0; > virtual ~Job() = 0; > }; > @@ -62,7 +65,9 @@ public: > SaImmClassNameT className_; > std::string parentName_; > const SaImmAttrValuesT_2 **attrValues_; > - > + > + ImmObjCreate():Job() {}; > + bool immobj_update_required(); > AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle); > > ~ImmObjCreate(); > @@ -75,8 +80,15 @@ public: > SaImmAttrNameT attributeName_; > SaImmValueTypeT attrValueType_; > void *value_; > - > + > + ImmObjUpdate():Job() {}; > + bool immobj_update_required(); > AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle); > + bool si_get_attr_value(); > + bool siass_get_attr_value(); > + bool csiass_get_attr_value(); > + bool comp_get_attr_value(); > + bool su_get_attr_value(); > > ~ImmObjUpdate(); > }; > @@ -85,7 +97,11 @@ public: > class ImmObjDelete : public Job { > public: > std::string dn; > - > + > + ImmObjDelete():Job() {}; > + bool immobj_update_required(); > + bool is_csiass_exist(); > + bool is_siass_exist(); > AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle); > > ~ImmObjDelete(); > diff --git a/osaf/services/saf/amf/amfd/include/util.h > b/osaf/services/saf/amf/amfd/include/util.h > --- a/osaf/services/saf/amf/amfd/include/util.h > +++ b/osaf/services/saf/amf/amfd/include/util.h > @@ -65,6 +65,8 @@ struct avd_comp_csi_rel_tag; > class AVD_CSI; > > void avsv_sanamet_init(const std::string& haystack, std::string& dn, const > char *needle); > +void avd_association_namet_init(const std::string& associate_dn, > std::string& child, > + std::string& parent, AVSV_AMF_CLASS_ID parent_class_id); > int get_child_dn_from_ass_dn(const std::string& ass_dn, std::string& > child_dn); > int get_parent_dn_from_ass_dn(const std::string& ass_dn, std::string& > parent_dn); > void avd_d2n_reboot_snd(AVD_AVND *node); > diff --git a/osaf/services/saf/amf/amfd/siass.cc > b/osaf/services/saf/amf/amfd/siass.cc > --- a/osaf/services/saf/amf/amfd/siass.cc > +++ b/osaf/services/saf/amf/amfd/siass.cc > @@ -127,9 +127,10 @@ void avd_susi_update(AVD_SU_SI_REL *susi > > TRACE("HA State %s of %s for %s", avd_ha_state[ha_state], > susi->su->name.c_str(), susi->si->name.c_str()); > - saflog(LOG_NOTICE, amfSvcUsrName, "HA State %s of %s for %s", > - avd_ha_state[ha_state], susi->su->name.c_str(), > susi->si->name.c_str()); > - > + if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) > + saflog(LOG_NOTICE, amfSvcUsrName, "HA State %s of %s for %s", > + avd_ha_state[ha_state], susi->su->name.c_str(), > susi->si->name.c_str()); > + > avd_saImmOiRtObjectUpdate(Amf::to_string(&dn), "saAmfSISUHAState", > SA_IMM_ATTR_SAUINT32T, &ha_state); > osaf_extended_name_free(&dn); > diff --git a/osaf/services/saf/amf/amfd/util.cc > b/osaf/services/saf/amf/amfd/util.cc > --- a/osaf/services/saf/amf/amfd/util.cc > +++ b/osaf/services/saf/amf/amfd/util.cc > @@ -2096,3 +2096,31 @@ uint32_t avd_snd_compcsi_msg(AVD_COMP *c > return NCSCC_RC_SUCCESS; > } > > +void avd_association_namet_init(const std::string& associate_dn, > std::string& child, > + std::string& parent, AVSV_AMF_CLASS_ID parent_class_id) { > + std::string::size_type pos; > + std::string::size_type equal_pos; > + > + //Example dns > + > //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1 > + // child: safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1 > + //parent: safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1 > + > //dn:safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1 > + if (parent_class_id == AVSV_SA_AMF_SI) { > + pos = associate_dn.find("safSi="); > + } else if (parent_class_id == AVSV_SA_AMF_CSI) { > + pos = associate_dn.find("safCsi="); > + } else { > + parent = ""; > + child = ""; > + return; > + } > + // set parent name > + parent = associate_dn.substr(pos); > + > + // set child name > + equal_pos = associate_dn.find('='); > + child = associate_dn.substr(equal_pos + 1, pos - equal_pos - 2); > + child.erase(std::remove(child.begin(), child.end(), '\\'), child.end()); > +} > + ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
