AMFD should not accept lock-in admin op on SU if the SU is repairing. --- src/amf/amfd/chkop.cc | 9 +++++++++ src/amf/amfd/ckpt.h | 3 ++- src/amf/amfd/ckpt_dec.cc | 42 +++++++++++++++++++++++++++++++++++++-- src/amf/amfd/ckpt_enc.cc | 30 +++++++++++++++++++++++++++- src/amf/amfd/ckpt_msg.h | 1 + src/amf/amfd/ckpt_updt.cc | 1 + src/amf/amfd/sgproc.cc | 1 + src/amf/amfd/su.cc | 19 ++++++++++++++++++ src/amf/amfd/su.h | 3 +++ 9 files changed, 105 insertions(+), 4 deletions(-)
diff --git a/src/amf/amfd/chkop.cc b/src/amf/amfd/chkop.cc index 56b0142a6..15408b657 100644 --- a/src/amf/amfd/chkop.cc +++ b/src/amf/amfd/chkop.cc @@ -923,6 +923,14 @@ uint32_t avsv_send_ckpt_data(AVD_CL_CB *cb, uint32_t action, /* No need to send the message as standy would get the applier callback */ return NCSCC_RC_SUCCESS; + case AVSV_CKPT_SU_INST_PROCESSED: + if (avd_cb->avd_peer_ver < AVD_MBCSV_SUB_PART_VERSION_11) { + /* No need to send the message to old std as this async is newly added. + */ + return NCSCC_RC_SUCCESS; + } + cb->async_updt_cnt.su_updt++; + break; /* else fall through */ case AVSV_CKPT_SU_SI_CURR_ACTIVE: case AVSV_CKPT_SU_SI_CURR_STBY: @@ -1366,6 +1374,7 @@ static uint32_t avsv_validate_reo_type_in_csync(AVD_CL_CB *cb, case AVSV_CKPT_SU_SI_CURR_STBY: case AVSV_CKPT_SU_ADMIN_STATE: case AVSV_CKPT_SU_TERM_STATE: + case AVSV_CKPT_SU_INST_PROCESSED: case AVSV_CKPT_SU_SWITCH: case AVSV_CKPT_SU_OPER_STATE: case AVSV_CKPT_SU_PRES_STATE: diff --git a/src/amf/amfd/ckpt.h b/src/amf/amfd/ckpt.h index 2e1538719..f092f5b8c 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 10 +#define AVD_MBCSV_SUB_PART_VERSION 11 // supported versions +#define AVD_MBCSV_SUB_PART_VERSION_11 11 #define AVD_MBCSV_SUB_PART_VERSION_10 10 #define AVD_MBCSV_SUB_PART_VERSION_9 9 #define AVD_MBCSV_SUB_PART_VERSION_8 8 diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc index 75213f821..7030f43b1 100644 --- a/src/amf/amfd/ckpt_dec.cc +++ b/src/amf/amfd/ckpt_dec.cc @@ -63,6 +63,7 @@ static uint32_t dec_su_si_curr_active(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); +static uint32_t dec_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); static uint32_t dec_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec); @@ -162,8 +163,8 @@ const AVSV_DECODE_CKPT_DATA_FUNC_PTR avd_dec_data_func_list[] = { 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_node_failover_state - + dec_node_failover_state, + dec_su_inst_msg_processed }; /* @@ -445,6 +446,9 @@ static void decode_su(NCS_UBAID *ub, AVD_SU *su, uint16_t peer_version) { if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_2) osaf_decode_bool(ub, &su->su_is_external); + + if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_11) + osaf_decode_bool(ub, &su->is_inst_msg_processed); } /****************************************************************************\ @@ -1538,6 +1542,40 @@ static uint32_t dec_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec) { return NCSCC_RC_SUCCESS; } +/****************************************************************************\ + * + * Purpose: Decode SU inst msg of service + * + * Input: cb - CB pointer. + * dec - Decode arguments passed by MBCSV. + * + * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + * + * NOTES: + * + * +\**************************************************************************/ +static uint32_t dec_su_inst_msg_processed( + AVD_CL_CB *cb, NCS_MBCSV_CB_DEC *dec) { + SaNameT name; + + TRACE_ENTER(); + + osaf_decode_sanamet(&dec->i_uba, &name); + AVD_SU *su = su_db->find(Amf::to_string(&name)); + osafassert(su != nullptr); + osaf_decode_uint32(&dec->i_uba, + reinterpret_cast<uint32_t *>(&su->is_inst_msg_processed)); + + cb->async_updt_cnt.su_updt++; + + TRACE_LEAVE2("'%s', is_inst_msg_processed=%u, su_updt:%d", + osaf_extended_name_borrow(&name), su->is_inst_msg_processed, + cb->async_updt_cnt.su_updt); + osaf_extended_name_free(&name); + return NCSCC_RC_SUCCESS; +} + /****************************************************************************\ * * Purpose: Decode SU toggle SI. diff --git a/src/amf/amfd/ckpt_enc.cc b/src/amf/amfd/ckpt_enc.cc index 2ca98f82d..26f66ce9f 100644 --- a/src/amf/amfd/ckpt_enc.cc +++ b/src/amf/amfd/ckpt_enc.cc @@ -62,6 +62,7 @@ static uint32_t enc_su_si_curr_active(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_si_curr_stby(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_admin_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); +static uint32_t enc_su_inst_msg_processed(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_switch(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_oper_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); static uint32_t enc_su_pres_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc); @@ -165,7 +166,7 @@ const AVSV_ENCODE_CKPT_DATA_FUNC_PTR avd_enc_ckpt_data_func_list[] = { 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_node_failover_state}; + enc_node_failover_state, enc_su_inst_msg_processed}; /* * Function list for encoding the cold sync response data @@ -419,6 +420,9 @@ static void encode_su(NCS_UBAID *ub, AVD_SU *su, uint16_t peer_version) { if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_2) osaf_encode_bool(ub, su->su_is_external); + + if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_11) + osaf_encode_bool(ub, su->is_inst_msg_processed); } /****************************************************************************\ @@ -1297,6 +1301,30 @@ static uint32_t enc_su_term_state(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc) { return NCSCC_RC_SUCCESS; } +/****************************************************************************\ + * + * Purpose: Encode SU inst msg of service. + * + * Input: cb - CB pointer. + * enc - Encode arguments passed by MBCSV. + * + * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + * + * NOTES: + * + * +\**************************************************************************/ +static uint32_t enc_su_inst_msg_processed( + AVD_CL_CB *cb, NCS_MBCSV_CB_ENC *enc) { + TRACE_ENTER(); + osafassert(NCS_MBCSV_ACT_UPDATE == enc->io_action); + const AVD_SU *su = reinterpret_cast<AVD_SU *>(enc->io_reo_hdl); + osaf_encode_sanamet_o2(&enc->io_uba, su->name.c_str()); + osaf_encode_bool(&enc->io_uba, su->is_inst_msg_processed); + TRACE_LEAVE(); + return NCSCC_RC_SUCCESS; +} + /****************************************************************************\ * * Purpose: Encode SU toggle SI. diff --git a/src/amf/amfd/ckpt_msg.h b/src/amf/amfd/ckpt_msg.h index c89ad9249..7b5960a85 100644 --- a/src/amf/amfd/ckpt_msg.h +++ b/src/amf/amfd/ckpt_msg.h @@ -114,6 +114,7 @@ typedef enum avsv_ckpt_msg_reo_type { AVSV_CKPT_NG_ADMIN_STATE, AVSV_CKPT_AVD_IMM_JOB_QUEUE_STATUS, AVSV_CKPT_NODE_FAILOVER_STATE, + AVSV_CKPT_SU_INST_PROCESSED, AVSV_CKPT_MSG_MAX } AVSV_CKPT_MSG_REO_TYPE; diff --git a/src/amf/amfd/ckpt_updt.cc b/src/amf/amfd/ckpt_updt.cc index 471c68730..b01eadb24 100644 --- a/src/amf/amfd/ckpt_updt.cc +++ b/src/amf/amfd/ckpt_updt.cc @@ -205,6 +205,7 @@ uint32_t avd_ckpt_su(AVD_CL_CB *cb, AVD_SU *ckpt_su, su->saAmfSUNumCurrStandbySIs = ckpt_su->saAmfSUNumCurrStandbySIs; su->saAmfSUHostedByNode = ckpt_su->saAmfSUHostedByNode; su->term_state = ckpt_su->term_state; + su->is_inst_msg_processed = ckpt_su->is_inst_msg_processed; su->su_switch = ckpt_su->su_switch; su->saAmfSURestartCount = ckpt_su->saAmfSURestartCount; diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc index ddd825d44..1d7e62a23 100644 --- a/src/amf/amfd/sgproc.cc +++ b/src/amf/amfd/sgproc.cc @@ -2126,6 +2126,7 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_CB *cb, AVD_SG *sg) { } } else { if (avd_snd_presence_msg(cb, i_su, false) == NCSCC_RC_SUCCESS) { + i_su->set_inst_msg_processed(false); num_try_insvc_su++; } } diff --git a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc index 8c8ef9d4f..e1da8f726 100644 --- a/src/amf/amfd/su.cc +++ b/src/amf/amfd/su.cc @@ -51,6 +51,7 @@ void AVD_SU::initialize() { term_state = false; su_switch = AVSV_SI_TOGGLE_STABLE; su_is_external = false; + is_inst_msg_processed = true; su_act_state = 0; sg_of_su = nullptr; su_on_node = nullptr; @@ -810,6 +811,12 @@ void AVD_SU::set_pres_state(SaAmfPresenceStateT pres_state) { */ return; + if ((pres_state == SA_AMF_PRESENCE_INSTANTIATED) || + (pres_state == SA_AMF_PRESENCE_INSTANTIATION_FAILED) || + (pres_state == SA_AMF_PRESENCE_TERMINATION_FAILED)) { + set_inst_msg_processed(true); + } + osafassert(pres_state <= SA_AMF_PRESENCE_TERMINATION_FAILED); TRACE_ENTER2("'%s' %s => %s", name.c_str(), avd_pres_state_name[saAmfSUPresenceState], @@ -1085,6 +1092,12 @@ void AVD_SU::lock_instantiation(SaImmOiHandleT immoi_handle, goto done; } + if (is_inst_msg_processed == false) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, + nullptr, "'%s' instantiate not done", name.c_str()); + goto done; + } + if (list_of_susi != nullptr) { report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, nullptr, "SIs still assigned to this SU '%s'", @@ -2377,6 +2390,12 @@ void AVD_SU::set_term_state(bool state) { m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, AVSV_CKPT_SU_TERM_STATE); } +void AVD_SU::set_inst_msg_processed(bool processed) { + is_inst_msg_processed = processed; + TRACE("%s inst_msg_processed %u", name.c_str(), processed); + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, AVSV_CKPT_SU_INST_PROCESSED); +} + void AVD_SU::set_su_switch(SaToggleState state, bool wrt_to_imm) { su_switch = state; TRACE("%s su_switch %u", name.c_str(), su_switch); diff --git a/src/amf/amfd/su.h b/src/amf/amfd/su.h index 7afc5abee..f32f3138a 100644 --- a/src/amf/amfd/su.h +++ b/src/amf/amfd/su.h @@ -87,6 +87,8 @@ class AVD_SU { bool su_is_external; /* indicates if this SU is external */ + bool is_inst_msg_processed; /* indicate inst msg sent to nd */ + int su_act_state; // not used, kept for EDU, remove later bool wait_for_contained_to_quiesce; @@ -122,6 +124,7 @@ class AVD_SU { void set_all_susis_assigned_quiesced(void); void set_all_susis_assigned(void); void set_term_state(bool state); + void set_inst_msg_processed(bool processed); void remove_from_model(); void set_su_switch(SaToggleState state, bool wrt_to_imm = true); AVD_AVND *get_node_ptr(void) const; -- 2.17.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel