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