In reported problem, active AMFD checkpointed admin state of node to
standby AMFD, but it could not update it to IMM before leaving cluster.
Since standby AMFD does not maintain Node attributes in IMM job queue, it also
does not update it to IMM. Hence user does not see updated admin state of node.
Currently standby AMFD maintains attributes of only SU, SI, CSI and comp in
imm job queue.

With this patch, standby AMFD will now maintain node attributes in imm job
queue at standby. Now in failover situations, standby will update latest states
of node in imm.
---
 src/amf/amfd/ckpt_dec.cc  |  6 ++++++
 src/amf/amfd/ckpt_updt.cc |  5 +++++
 src/amf/amfd/imm.cc       | 31 ++++++++++++++++++++++++++++++-
 src/amf/amfd/imm.h        |  1 +
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc
index 52150dd..9f3949a 100644
--- a/src/amf/amfd/ckpt_dec.cc
+++ b/src/amf/amfd/ckpt_dec.cc
@@ -843,6 +843,9 @@ static uint32_t dec_node_admin_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec) {
 
   cb->async_updt_cnt.node_updt++;
 
+  avd_saImmOiRtObjectUpdate(avnd_struct->name, "saAmfNodeAdminState",
+                              SA_IMM_ATTR_SAUINT32T,
+                              &avnd_struct->saAmfNodeAdminState);
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
 }
@@ -886,6 +889,9 @@ static uint32_t dec_node_oper_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec) {
   avnd_struct->saAmfNodeOperState = avnd.saAmfNodeOperState;
 
   cb->async_updt_cnt.node_updt++;
+  avd_saImmOiRtObjectUpdate(avnd_struct->name, "saAmfNodeOperState",
+                            SA_IMM_ATTR_SAUINT32T,
+                            &avnd_struct->saAmfNodeOperState);
 
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
diff --git a/src/amf/amfd/ckpt_updt.cc b/src/amf/amfd/ckpt_updt.cc
index 7a4a34b..471c687 100644
--- a/src/amf/amfd/ckpt_updt.cc
+++ b/src/amf/amfd/ckpt_updt.cc
@@ -69,6 +69,11 @@ uint32_t avd_ckpt_node(AVD_CL_CB *cb, AVD_AVND *ckpt_node,
   if (nullptr == avd_node_find_nodeid(ckpt_node->node_info.nodeId))
     avd_node_add_nodeid(node);
 
+  avd_saImmOiRtObjectUpdate(node->name, "saAmfNodeOperState",
+                            SA_IMM_ATTR_SAUINT32T, &node->saAmfNodeOperState);
+  avd_saImmOiRtObjectUpdate(node->name, "saAmfNodeAdminState",
+                              SA_IMM_ATTR_SAUINT32T,
+                              &node->saAmfNodeAdminState);
 done:
   TRACE_LEAVE2("%u", rc);
   return rc;
diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc
index 7b1aa33..f524bfb 100644
--- a/src/amf/amfd/imm.cc
+++ b/src/amf/amfd/imm.cc
@@ -1823,7 +1823,8 @@ bool check_to_create_immjob_at_standby_amfd(const 
std::string &dn) {
   if ((class_type == AVSV_SA_AMF_SU) || (class_type == AVSV_SA_AMF_COMP) ||
       (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) ||
       (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) ||
-      (class_type == AVSV_SA_AMF_SI) || (class_type == AVSV_SA_AMF_CSI)) {
+      (class_type == AVSV_SA_AMF_SI) || (class_type == AVSV_SA_AMF_CSI) ||
+      (class_type == AVSV_SA_AMF_NODE)) {
     TRACE("Class Type:%s", avd_class_names[class_type]);
     return true;
   }
@@ -2537,6 +2538,32 @@ bool ImmObjUpdate::si_get_attr_value() {
   }
   return true;
 }
+
+bool ImmObjUpdate::node_get_attr_value() {
+  bool ret = true;
+  AVD_AVND *node = node_name_db->find(dn);
+  if (node == nullptr) {
+    TRACE_1("node not found");
+    ret = false;
+    goto done;
+  }
+  if (!strcmp(attributeName_, "saAmfNodeOperState")) {
+    TRACE_1("saAmfNodeOperState old value:%u, new value:%u",
+            *static_cast<SaAmfOperationalStateT *>(value_),
+            node->saAmfNodeOperState);
+    memcpy(value_, &node->saAmfNodeOperState, value_size(attrValueType_));
+  } else if (!strcmp(attributeName_, "saAmfNodeAdminState")) {
+    TRACE_1("saAmfNodeAdminState old value:%u, new value:%u",
+            *static_cast<SaAmfAdminStateT *>(value_), 
node->saAmfNodeAdminState);
+    memcpy(value_, &node->saAmfNodeAdminState, value_size(attrValueType_));
+  } else {
+    // Other attributes not considered.
+    ret = false;
+  }
+done:
+  return ret;
+}
+
 /**
  * @brief  Fetches latest value of attribute from AMF db before updating it in
  * IMM. Currently, only for SU, Comp, SI, SISU and CSICOMP.
@@ -2558,6 +2585,8 @@ bool ImmObjUpdate::immobj_update_required() {
     ret = siass_get_attr_value();
   } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) {
     ret = csiass_get_attr_value();
+  } else if (class_type == AVSV_SA_AMF_NODE) {
+    ret = node_get_attr_value();
   } else {
     TRACE_1("Class not considered");
     ret = false;
diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h
index 535ee72..f0152ac 100644
--- a/src/amf/amfd/imm.h
+++ b/src/amf/amfd/imm.h
@@ -107,6 +107,7 @@ class ImmObjUpdate : public ImmJob {
   bool csiass_get_attr_value();
   bool comp_get_attr_value();
   bool su_get_attr_value();
+  bool node_get_attr_value();
 
   ~ImmObjUpdate();
 };
-- 
1.9.1


------------------------------------------------------------------------------
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to