Ack(Code Review Only).

Thanks
-Nagu

-----Original Message-----
From: Gary Lee [mailto:gary....@dektech.com.au] 
Sent: 24 October 2018 17:57
To: hans.nordeb...@ericsson.com; minh.c...@dektech.com.au;
nagen...@hasolutions.in
Cc: opensaf-devel@lists.sourceforge.net; Gary Lee
Subject: [PATCH 3/4] amfd: add checkpointing of node failover state [#2918]

---
 src/amf/amfd/chkop.cc    | 10 ++++++++++
 src/amf/amfd/ckpt.h      |  3 ++-
 src/amf/amfd/ckpt_dec.cc | 40 +++++++++++++++++++++++++++++++++++++++-
 src/amf/amfd/ckpt_enc.cc | 26 ++++++++++++++++++++++++--
 src/amf/amfd/ckpt_msg.h  |  1 +
 5 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/src/amf/amfd/chkop.cc b/src/amf/amfd/chkop.cc
index 1ba4140c7..e9a68f4cd 100644
--- a/src/amf/amfd/chkop.cc
+++ b/src/amf/amfd/chkop.cc
@@ -1042,6 +1042,16 @@ uint32_t avsv_send_ckpt_data(AVD_CL_CB *cb, uint32_t
action,
         return NCSCC_RC_SUCCESS;
       }
       break;
+    case AVSV_CKPT_NODE_FAILOVER_STATE:
+      if ((avd_cb->other_avd_adest != 0) &&
+          (avd_cb->avd_peer_ver < AVD_MBCSV_SUB_PART_VERSION_9)) {
+        TRACE(
+            "No ckpt for AVSV_CKPT_NODE_FAILOVER_STATE as peer AMFD has"
+            " lower version:%d",
+            avd_cb->avd_peer_ver);
+        return NCSCC_RC_SUCCESS;
+      }
+      break;
     default:
       return NCSCC_RC_SUCCESS;
   }
diff --git a/src/amf/amfd/ckpt.h b/src/amf/amfd/ckpt.h
index c006f9a69..875776a21 100644
--- a/src/amf/amfd/ckpt.h
+++ b/src/amf/amfd/ckpt.h
@@ -35,9 +35,10 @@
 #define AMF_AMFD_CKPT_H_
 
 // current version
-#define AVD_MBCSV_SUB_PART_VERSION 8
+#define AVD_MBCSV_SUB_PART_VERSION 9
 
 // supported versions
+#define AVD_MBCSV_SUB_PART_VERSION_9 9
 #define AVD_MBCSV_SUB_PART_VERSION_8 8
 #define AVD_MBCSV_SUB_PART_VERSION_7 7
 #define AVD_MBCSV_SUB_PART_VERSION_6 6
diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc
index 9f3949a15..022fa8f4b 100644
--- a/src/amf/amfd/ckpt_dec.cc
+++ b/src/amf/amfd/ckpt_dec.cc
@@ -49,6 +49,7 @@ static uint32_t dec_oper_su(AVD_CL_CB *cb,
NCS_MBCSV_CB_DEC *dec);
 static uint32_t dec_node_up_info(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
 static uint32_t dec_node_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
 static uint32_t dec_node_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
+static uint32_t dec_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC
*dec);
 static uint32_t dec_node_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
 static uint32_t dec_node_rcv_msg_id(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
 static uint32_t dec_node_snd_msg_id(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec);
@@ -160,7 +161,8 @@ const AVSV_DECODE_CKPT_DATA_FUNC_PTR
avd_dec_data_func_list[] = {
     dec_comp_curr_num_csi_stby, dec_comp_oper_state,
dec_comp_readiness_state,
     dec_comp_pres_state, dec_comp_restart_count, nullptr, /*
AVSV_SYNC_COMMIT */
     dec_su_restart_count, dec_si_dep_state, dec_ng_admin_state,
-    dec_avd_to_avd_job_queue_status
+    dec_avd_to_avd_job_queue_status,
+    dec_node_failover_state
 
 };
 
@@ -2958,3 +2960,39 @@ static uint32_t
dec_avd_to_avd_job_queue_status(AVD_CL_CB *cb,
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
 }
+
+static uint32_t dec_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC
*dec) {
+  TRACE_ENTER();
+
+  uint32_t state;
+  SaNameT name;
+
+  osaf_decode_sanamet(&dec->i_uba, &name);
+  const std::string node_name(Amf::to_string(&name));
+  osaf_extended_name_free(&name);
+
+  AVD_AVND* node;
+  node = avd_node_get(node_name);
+
+  if (node == nullptr) {
+    LOG_ER("%s: node not found, nodeid=%s", __FUNCTION__,
node_name.c_str());
+    return NCSCC_RC_FAILURE;
+  }
+
+  osaf_decode_uint32(&dec->i_uba,
+                     reinterpret_cast<uint32_t *>(&state));
+
+  auto failed_node = cb->failover_list.find(node->node_info.nodeId);
+  if (failed_node != cb->failover_list.end()) {
+    failed_node->second->SetState(state);
+  } else {
+    LOG_NO("Node '%s' not found in failover_list. Create new entry",
+            node->node_name.c_str());
+    auto new_node = std::make_shared<NodeStateMachine>(cb,
+      node->node_info.nodeId);
+    new_node->SetState(state);
+    cb->failover_list[node->node_info.nodeId] = new_node;
+  }
+
+  return NCSCC_RC_SUCCESS;
+}
\ No newline at end of file
diff --git a/src/amf/amfd/ckpt_enc.cc b/src/amf/amfd/ckpt_enc.cc
index 0a2d73698..0e675aed5 100644
--- a/src/amf/amfd/ckpt_enc.cc
+++ b/src/amf/amfd/ckpt_enc.cc
@@ -48,6 +48,7 @@ static uint32_t enc_oper_su(AVD_CL_CB *cb,
NCS_MBCSV_CB_ENC *enc);
 static uint32_t enc_node_up_info(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
 static uint32_t enc_node_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
 static uint32_t enc_node_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
+static uint32_t enc_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC
*enc);
 static uint32_t enc_node_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
 static uint32_t enc_node_rcv_msg_id(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
 static uint32_t enc_node_snd_msg_id(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc);
@@ -163,7 +164,8 @@ const AVSV_ENCODE_CKPT_DATA_FUNC_PTR
avd_enc_ckpt_data_func_list[] = {
     enc_comp_curr_num_csi_stby, enc_comp_oper_state,
enc_comp_readiness_state,
     enc_comp_pres_state, enc_comp_restart_count, nullptr, /*
AVSV_SYNC_COMMIT */
     enc_su_restart_count, enc_si_dep_state, enc_ng_admin_state,
-    enc_avd_to_avd_job_queue_status};
+    enc_avd_to_avd_job_queue_status,
+    enc_node_failover_state};
 
 /*
  * Function list for encoding the cold sync response data
@@ -851,8 +853,9 @@ static uint32_t enc_node_oper_state(AVD_CL_CB *cb,
NCS_MBCSV_CB_ENC *enc) {
   if (NCS_MBCSV_ACT_UPDATE == enc->io_action) {
     osaf_encode_sanamet_o2(&enc->io_uba, avnd->name.c_str());
     osaf_encode_uint32(&enc->io_uba, avnd->saAmfNodeOperState);
-  } else
+  } else {
     osafassert(0);
+  }
 
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
@@ -2411,3 +2414,22 @@ static uint32_t
enc_avd_to_avd_job_queue_status(AVD_CL_CB *cb,
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
 }
+
+static uint32_t enc_node_failover_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC
*enc) {
+  TRACE_ENTER();
+
+  const AVD_AVND *avnd = reinterpret_cast<AVD_AVND *>(enc->io_reo_hdl);
+
+  if (NCS_MBCSV_ACT_UPDATE == enc->io_action) {
+    auto failed_node = cb->failover_list.find(avnd->node_info.nodeId);
+    if (failed_node != cb->failover_list.end()) {
+      osaf_encode_sanamet_o2(&enc->io_uba, avnd->name.c_str());
+      TRACE_ENTER2("New state '%u'", failed_node->second->GetState());
+      osaf_encode_uint32(&enc->io_uba, failed_node->second->GetState());
+    }
+  } else {
+    osafassert(0);
+  }
+
+  return NCSCC_RC_SUCCESS;
+}
diff --git a/src/amf/amfd/ckpt_msg.h b/src/amf/amfd/ckpt_msg.h
index 7d8704297..c89ad9249 100644
--- a/src/amf/amfd/ckpt_msg.h
+++ b/src/amf/amfd/ckpt_msg.h
@@ -113,6 +113,7 @@ typedef enum avsv_ckpt_msg_reo_type {
   AVSV_CKPT_SI_DEP_STATE,
   AVSV_CKPT_NG_ADMIN_STATE,
   AVSV_CKPT_AVD_IMM_JOB_QUEUE_STATUS,
+  AVSV_CKPT_NODE_FAILOVER_STATE,
   AVSV_CKPT_MSG_MAX
 } AVSV_CKPT_MSG_REO_TYPE;
 
-- 
2.17.1




_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to