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;