---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel