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

Reply via email to