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;      
+       }
        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); 
+  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); 
+  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);

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to