Hi Gary, I have published V2 after incorporating comments. Please review it.
Thanks, Praveen On 10-Nov-16 11:08 AM, Gary Lee wrote: > Hi Praveen > > Some initial comments below marked with [GL]. > > Thanks > Gary > >> On 24 Oct. 2016, at 5:22 pm, [email protected] wrote: >> >> osaf/services/saf/amf/amfd/ckpt_updt.cc | 4 + >> osaf/services/saf/amf/amfd/imm.cc | 378 >> ++++++++++++++++++++++++++++++- >> osaf/services/saf/amf/amfd/include/imm.h | 22 +- >> osaf/services/saf/amf/amfd/siass.cc | 7 +- >> 4 files changed, 400 insertions(+), 11 deletions(-) >> >> >> 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 >> @@ -459,6 +459,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 ((implementer == false) && (immobj_status_check() == false)){ >> + delete Fifo::dequeue(); >> + res = JOB_EXECUTED; >> + goto done; >> + } > > > [GL] Maybe immobj_status_check() could be renamed to something like > immobj_update_required() ? > The implementer == false check could be replaced inside this function. > >> 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 ((implementer == false) && (immobj_status_check() == 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 ((implementer == false) && (immobj_status_check() == 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,347 @@ 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_status_check() { >> + >> + 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; >> + 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 >> + get_parent_dn_from_ass_dn(dn, si_name); >> + get_child_dn_from_ass_dn(dn, su_name); >> + 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 >> + get_parent_dn_from_ass_dn(dn, csi_name); >> + get_child_dn_from_ass_dn(dn, comp_name); >> + 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_status_check() { >> + bool ret = true; >> + AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn); >> + 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 >> + get_parent_dn_from_ass_dn(dn, si_name); >> + get_child_dn_from_ass_dn(dn, su_name); > > [GL] I’m not sure the above two functions work with this type of DN. > > >> + 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 >> + get_parent_dn_from_ass_dn(dn, csi_name); >> + get_child_dn_from_ass_dn(dn, comp_name); > > [GL] I’m not sure the above two functions work with this type of DN. > >> + 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"); >> + 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; >> + } >> +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_status_check() { >> + bool ret = true; >> + AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn); >> + 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_status_check(); >> AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle); >> >> ~ImmObjCreate(); >> @@ -75,8 +80,15 @@ public: >> SaImmAttrNameT attributeName_; >> SaImmValueTypeT attrValueType_; >> void *value_; >> - >> + >> + ImmObjUpdate():Job() {}; >> + bool immobj_status_check(); >> 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_status_check(); >> + bool is_csiass_exist(); >> + bool is_siass_exist(); >> AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle); >> >> ~ImmObjDelete(); >> 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); > ------------------------------------------------------------------------------ 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
