Re: [devel] [PATCH 1/1] amfd: not accept lock-in if su is reparing [#3121]
Hi Thang, I assume you have tried and there is no way to reuse the current *state* of su to prevent the lock-in op in this scenario, and this patch tested ok with upgrade/downgrade. The down side of adding checkpoint is that we will stick with it even then we find better solution later on, since removing the checkpoint would cause a nbc. No comments from me. Thanks Minh On 2/12/19 2:39 pm, thang.d.nguyen wrote: 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(&su->is_inst
[devel] [PATCH 1/1] amfd: not accept lock-in if su is reparing [#3121]
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(&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_e