From: Anand Sundararaj <[email protected]>
---
src/amf/amfd/chkop.cc | 9 +++++++
src/amf/amfd/ckpt.h | 3 ++-
src/amf/amfd/ckpt_dec.cc | 49 ++++++++++++++++++++++++++++++++++++-
src/amf/amfd/ckpt_enc.cc | 38 ++++++++++++++++++++++++++++-
src/amf/amfd/ckpt_msg.h | 1 +
src/amf/amfd/ckpt_updt.cc | 1 +
src/amf/amfd/clm.cc | 3 ++-
src/amf/amfd/node.cc | 56 +++++++++++++++++++++++++++++++++++++++++-
src/amf/amfd/node.h | 2 ++
src/amf/amfd/sgproc.cc | 25 +++++++++++++++++++
src/amf/amfd/util.cc | 1 +
src/amf/amfnd/avnd_su.h | 1 +
src/amf/amfnd/di.cc | 62 +++++++++++++++++++++++++++++++++++++++++++++++
src/amf/amfnd/err.cc | 2 +-
src/amf/amfnd/su.cc | 2 +-
15 files changed, 248 insertions(+), 7 deletions(-)
diff --git a/src/amf/amfd/chkop.cc b/src/amf/amfd/chkop.cc
index 1ed6dd6..eb4ee62 100644
--- a/src/amf/amfd/chkop.cc
+++ b/src/amf/amfd/chkop.cc
@@ -883,6 +883,14 @@ uint32_t avsv_send_ckpt_data(AVD_CL_CB *cb, uint32_t
action,
cb->async_updt_cnt.node_updt++;
break;
+ case AVSV_CKPT_RECVR_NODE_FOVER_SWOVER:
+ if (avd_cb->avd_peer_ver < AVD_MBCSV_SUB_PART_VERSION_12) {
+ /* No need to send the message to old std as this async is newly added.
+ */
+ return NCSCC_RC_SUCCESS;
+ }
+ cb->async_updt_cnt.node_updt++;
+ break;
case AVSV_CKPT_AVD_APP_CONFIG:
if ((avd_cb->avd_peer_ver >= AVD_MBCSV_SUB_PART_VERSION_4) &&
((action == NCS_MBCSV_ACT_ADD) || (action == NCS_MBCSV_ACT_RMV)))
@@ -1348,6 +1356,7 @@ static uint32_t avsv_validate_reo_type_in_csync(AVD_CL_CB
*cb,
case AVSV_CKPT_AVND_RCV_MSG_ID:
case AVSV_CKPT_AVND_SND_MSG_ID:
case AVSV_CKPT_NODE_FAILOVER_STATE:
+ case AVSV_CKPT_RECVR_NODE_FOVER_SWOVER:
if (cb->synced_reo_type >= AVSV_CKPT_AVD_NODE_CONFIG)
status = NCSCC_RC_SUCCESS;
break;
diff --git a/src/amf/amfd/ckpt.h b/src/amf/amfd/ckpt.h
index f092f5b..aa6d11c 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 11
+#define AVD_MBCSV_SUB_PART_VERSION 12
// supported versions
+#define AVD_MBCSV_SUB_PART_VERSION_12 12
#define AVD_MBCSV_SUB_PART_VERSION_11 11
#define AVD_MBCSV_SUB_PART_VERSION_10 10
#define AVD_MBCSV_SUB_PART_VERSION_9 9
diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc
index 7030f43..3ec1e51 100644
--- a/src/amf/amfd/ckpt_dec.cc
+++ b/src/amf/amfd/ckpt_dec.cc
@@ -64,6 +64,7 @@ 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_recvr_node_fover_swover(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);
@@ -164,7 +165,8 @@ const AVSV_DECODE_CKPT_DATA_FUNC_PTR
avd_dec_data_func_list[] = {
dec_su_restart_count, dec_si_dep_state, dec_ng_admin_state,
dec_avd_to_avd_job_queue_status,
dec_node_failover_state,
- dec_su_inst_msg_processed
+ dec_su_inst_msg_processed,
+ dec_recvr_node_fover_swover
};
/*
@@ -282,6 +284,8 @@ void decode_node_config(NCS_UBAID *ub, AVD_AVND *avnd,
osaf_extended_name_free(&node_name);
if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_10) {
osaf_decode_uint32(ub, &avnd->failover_state);
+ if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_12)
+ osaf_decode_bool(ub, &avnd->recvr_fail_sw);
}
TRACE_LEAVE();
}
@@ -3090,3 +3094,46 @@ static uint32_t dec_node_failover_state(AVD_CL_CB *cb,
NCS_MBCSV_CB_DEC *dec) {
return NCSCC_RC_SUCCESS;
}
+
+/****************************************************************************\
+ * Function: dec_recvr_node_fover_swover
+ *
+ * Purpose: Decode node failover/switchover recovery.
+ *
+ * Input: cb - CB pointer.
+ * dec - Decode arguments passed by MBCSV.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ *
+ * NOTES:
+ *
+ *
+\**************************************************************************/
+static uint32_t dec_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_DEC
*dec) {
+ AVD_AVND avnd;
+ AVD_AVND *avnd_struct;
+
+ TRACE_ENTER();
+
+ /*
+ * Action in this case is just to update.
+ */
+ SaNameT name;
+ osaf_decode_sanamet(&dec->i_uba, &name);
+ avnd.name = Amf::to_string(&name);
+ osaf_extended_name_free(&name);
+ osaf_decode_uint32(&dec->i_uba,
+ reinterpret_cast<uint32_t *>(&avnd.recvr_fail_sw));
+
+ if (nullptr == (avnd_struct = avd_node_get(avnd.name))) {
+ LOG_ER("%s: node not found, nodeid=%s", __FUNCTION__, avnd.name.c_str());
+ return NCSCC_RC_FAILURE;
+ }
+
+ /* Update the fields received in this checkpoint message */
+ avnd_struct->recvr_fail_sw = avnd.recvr_fail_sw;
+
+ cb->async_updt_cnt.node_updt++;
+ TRACE_LEAVE();
+ return NCSCC_RC_SUCCESS;
+}
diff --git a/src/amf/amfd/ckpt_enc.cc b/src/amf/amfd/ckpt_enc.cc
index 26f66ce..e96fe27 100644
--- a/src/amf/amfd/ckpt_enc.cc
+++ b/src/amf/amfd/ckpt_enc.cc
@@ -63,6 +63,7 @@ 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_recvr_node_fover_swover(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);
@@ -166,7 +167,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_su_inst_msg_processed};
+ enc_node_failover_state, enc_su_inst_msg_processed,
enc_recvr_node_fover_swover};
/*
* Function list for encoding the cold sync response data
@@ -269,6 +270,8 @@ void encode_node_config(NCS_UBAID *ub, const AVD_AVND *avnd,
if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_10) {
osaf_encode_uint32(ub, avnd->failover_state);
}
+ if (peer_version >= AVD_MBCSV_SUB_PART_VERSION_12)
+ osaf_encode_bool(ub, avnd->recvr_fail_sw);
}
/****************************************************************************\
@@ -2464,3 +2467,36 @@ static uint32_t enc_node_failover_state(AVD_CL_CB *cb,
NCS_MBCSV_CB_ENC *enc) {
return NCSCC_RC_SUCCESS;
}
+
+/****************************************************************************\
+ * Function: enc_recvr_node_fover_swover
+ *
+ * Purpose: Encode node failover/switchover recovery.
+ *
+ * Input: cb - CB pointer.
+ * enc - Encode arguments passed by MBCSV.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ *
+ * NOTES:
+ *
+ *
+\**************************************************************************/
+static uint32_t enc_recvr_node_fover_swover(AVD_CL_CB *cb, NCS_MBCSV_CB_ENC
*enc) {
+ TRACE_ENTER();
+
+ const AVD_AVND *avnd = reinterpret_cast<AVD_AVND *>(enc->io_reo_hdl);
+
+ /*
+ * Action in this case is just to update. If action passed is add/rmv then
log
+ * error. Call EDU encode to encode this field.
+ */
+ 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->recvr_fail_sw);
+ } else
+ osafassert(0);
+
+ TRACE_LEAVE();
+ return NCSCC_RC_SUCCESS;
+}
diff --git a/src/amf/amfd/ckpt_msg.h b/src/amf/amfd/ckpt_msg.h
index 7b5960a..8b7c527 100644
--- a/src/amf/amfd/ckpt_msg.h
+++ b/src/amf/amfd/ckpt_msg.h
@@ -115,6 +115,7 @@ typedef enum avsv_ckpt_msg_reo_type {
AVSV_CKPT_AVD_IMM_JOB_QUEUE_STATUS,
AVSV_CKPT_NODE_FAILOVER_STATE,
AVSV_CKPT_SU_INST_PROCESSED,
+ AVSV_CKPT_RECVR_NODE_FOVER_SWOVER, // Checkpoint Node failover/switchover
recovery
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 b01eadb..b58877d 100644
--- a/src/amf/amfd/ckpt_updt.cc
+++ b/src/amf/amfd/ckpt_updt.cc
@@ -58,6 +58,7 @@ uint32_t avd_ckpt_node(AVD_CL_CB *cb, AVD_AVND *ckpt_node,
/* Update all runtime attributes */
node->saAmfNodeAdminState = ckpt_node->saAmfNodeAdminState;
node->saAmfNodeOperState = ckpt_node->saAmfNodeOperState;
+ node->recvr_fail_sw = ckpt_node->recvr_fail_sw;
node->node_state = ckpt_node->node_state;
node->rcv_msg_id = ckpt_node->rcv_msg_id;
node->snd_msg_id = ckpt_node->snd_msg_id;
diff --git a/src/amf/amfd/clm.cc b/src/amf/amfd/clm.cc
index cfbe36a..620ce28 100644
--- a/src/amf/amfd/clm.cc
+++ b/src/amf/amfd/clm.cc
@@ -27,7 +27,8 @@
static void clm_node_join_complete(AVD_AVND *node) {
TRACE_ENTER();
/* Enable the node in any case. */
- avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED);
+ if(node->recvr_fail_sw == false)
+ avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED);
/* For each of the SUs calculate the readiness state.
** call the SG FSM with the new readiness state.
diff --git a/src/amf/amfd/node.cc b/src/amf/amfd/node.cc
index 2c04fca..4c63055 100644
--- a/src/amf/amfd/node.cc
+++ b/src/amf/amfd/node.cc
@@ -108,6 +108,7 @@ void AVD_AVND::initialize() {
saAmfNodeOperState = SA_AMF_OPERATIONAL_DISABLED;
admin_node_pend_cbk = {};
su_cnt_admin_oper = {};
+ su_cnt_admin_repair = {};
node_state = AVD_AVND_STATE_ABSENT;
list_of_ncs_su = {};
list_of_su = {};
@@ -1247,6 +1248,23 @@ void AVD_AVND::node_sus_termstate_set(bool term_state)
const {
}
/**
+ * Update count of application SUs of the given node.
+ *
+ * @param node pointer
+ * @return None
+ */
+static uint32_t application_sus_count(AVD_AVND *node) {
+ uint32_t count = 0;
+ /* Count the applications SUs hosted on this node. */
+ for (const auto &su : node->list_of_su) {
+ if (su->su_is_external == false)
+ count++;
+ }
+ TRACE("count '%u'", count);
+ return count;
+}
+
+/**
* Handle admin operations on SaAmfNode objects.
*
* @param immOiHandle
@@ -1532,9 +1550,44 @@ static void node_admin_op_cb(SaImmOiHandleT immOiHandle,
}
break;
+ case SA_AMF_ADMIN_REPAIRED:
+ if (node->saAmfNodeOperState == SA_AMF_OPERATIONAL_ENABLED) {
+ report_admin_op_error(
+ immOiHandle, invocation, SA_AIS_ERR_NO_OP, nullptr,
+ "Admin repair request for '%s', op state already enabled",
+ node->name.c_str());
+ goto done;
+ }
+
+ if (node->node_info.member == false) {
+ LOG_NO("'%s' ADMIN_REPAIRED: CLM node is not member",
+ node->name.c_str());
+ avd_saImmOiAdminOperationResult(immOiHandle, invocation,
SA_AIS_ERR_TRY_AGAIN);
+ goto done;
+ }
+
+ if (0 == application_sus_count(node)) {
+ // Node is configured without appl su, return from here.
+ avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED);
+ avd_saImmOiAdminOperationResult(immOiHandle, invocation, SA_AIS_OK);
+ goto done;
+ }
+
+ /* forward the admin op req to the node director */
+ if (avd_admin_op_msg_snd(node->name, AVSV_SA_AMF_NODE,
SA_AMF_ADMIN_REPAIRED,
+ node) == NCSCC_RC_SUCCESS) {
+ node->admin_node_pend_cbk.admin_oper = SA_AMF_ADMIN_REPAIRED;
+ node->admin_node_pend_cbk.invocation = invocation;
+ node->su_cnt_admin_repair = application_sus_count(node);
+ } else {
+ report_admin_op_error(immOiHandle, invocation, SA_AIS_ERR_TIMEOUT,
nullptr,
+ "Admin op request send failed '%s'", node->name.c_str());
+ }
+ break;
+
default:
report_admin_op_error(immOiHandle, invocation, SA_AIS_ERR_NOT_SUPPORTED,
- nullptr, "UNSUPPORTED ADMIN OPERATION (%llu)",
+ nullptr, "UNSUPPORTED ADMIN OPERATION (%llu)",
operationId);
break;
}
@@ -1591,6 +1644,7 @@ void node_reset_su_try_inst_counter(const AVD_AVND *node)
{
su->sg_of_su->try_inst_counter = 0;
}
}
+
/**
* @brief Checks all nodegroup of nodes are in UNLOCKED state.
* @param ptr to Node (AVD_AVND).
diff --git a/src/amf/amfd/node.h b/src/amf/amfd/node.h
index 097f54b..37b8ce9 100644
--- a/src/amf/amfd/node.h
+++ b/src/amf/amfd/node.h
@@ -108,6 +108,8 @@ class AVD_AVND {
callbacks on this node */
uint32_t su_cnt_admin_oper; /* count to keep track SUs on this
node
undergoing node admin op */
+ uint32_t su_cnt_admin_repair; /* Count to keep track SUs on this node
+ being repaired by node admin repair op */
/************ AMF B.04 **************************************************/
diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc
index 1d7e62a..78ccb31 100644
--- a/src/amf/amfd/sgproc.cc
+++ b/src/amf/amfd/sgproc.cc
@@ -877,6 +877,8 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) {
*/
avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_DISABLED);
node->recvr_fail_sw = true;
+ m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node,
+ AVSV_CKPT_RECVR_NODE_FOVER_SWOVER);
for (const auto &i_su : node->list_of_su) {
i_su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE);
}
@@ -898,6 +900,8 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) {
*/
avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_DISABLED);
node->recvr_fail_sw = true;
+ m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node,
+ AVSV_CKPT_RECVR_NODE_FOVER_SWOVER);
// if maintenance campaign is ongoing, disable node reboot
if (su->restrict_auto_repair() == true) node_reboot_req = false;
@@ -1025,6 +1029,26 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT *evt) {
}
}
} else { /* if(su->sg_of_su->sg_ncs_spec == true) */
+ // This is a case of Node repair
+ if ((n2d_msg->msg_info.n2d_opr_state.node_oper_state ==
+ SA_AMF_OPERATIONAL_ENABLED) &&
+ (node->admin_node_pend_cbk.invocation) &&
+ (node->admin_node_pend_cbk.admin_oper == SA_AMF_ADMIN_REPAIRED)) {
+ avd_node_oper_state_set(node, SA_AMF_OPERATIONAL_ENABLED);
+ if (node->su_cnt_admin_repair > 0) node->su_cnt_admin_repair--;
+ if (node->su_cnt_admin_repair == 0) {
+ /* if this is the last SU then send out the pending callback */
+ avd_saImmOiAdminOperationResult(
+ cb->immOiHandle, node->admin_node_pend_cbk.invocation,
+ SA_AIS_OK);
+ node->admin_node_pend_cbk.invocation = 0;
+ node->admin_node_pend_cbk.admin_oper =
+ static_cast<SaAmfAdminOperationIdT>(0);
+ node->recvr_fail_sw = false;
+ m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, node,
+ AVSV_CKPT_RECVR_NODE_FOVER_SWOVER);
+ }
+ }
/* If oper state of Uninstantiated SU got ENABLED so try to instantiate
it
after evaluating SG. */
if (su->saAmfSUPresenceState == SA_AMF_PRESENCE_UNINSTANTIATED) {
@@ -2326,6 +2350,7 @@ void avd_node_down_mw_susi_failover(AVD_CL_CB *cb,
AVD_AVND *avnd) {
SA_AIS_ERR_REPAIR_PENDING,
&avnd->admin_node_pend_cbk,
"node failure");
avnd->su_cnt_admin_oper = 0;
+ avnd->su_cnt_admin_repair = 0;
}
TRACE_LEAVE();
diff --git a/src/amf/amfd/util.cc b/src/amf/amfd/util.cc
index 3b3c6dd..a7b6a77 100644
--- a/src/amf/amfd/util.cc
+++ b/src/amf/amfd/util.cc
@@ -1397,6 +1397,7 @@ int amfd_file_dump(const char *filename) {
fprintf(f, " saAmfNodeOperState: %s\n",
avd_oper_state_name[node->saAmfNodeOperState]);
fprintf(f, " node_state: %u\n", node->node_state);
+ fprintf(f, " recvr_fail_sw: %u\n", node->recvr_fail_sw);
fprintf(f, " adest:%" PRIx64 "\n", node->adest);
fprintf(f, " rcv_msg_id: %u\n", node->rcv_msg_id);
fprintf(f, " snd_msg_id: %u\n", node->snd_msg_id);
diff --git a/src/amf/amfnd/avnd_su.h b/src/amf/amfnd/avnd_su.h
index 45effd6..46a711f 100644
--- a/src/amf/amfnd/avnd_su.h
+++ b/src/amf/amfnd/avnd_su.h
@@ -461,5 +461,6 @@ extern AVND_SU *avnd_sudb_rec_get_next(AmfDb<std::string,
AVND_SU> &sudb,
extern void sudb_rec_comp_add(AVND_SU *su, AVND_COMP *comp, uint32_t *rc);
uint32_t avnd_evt_avd_compcsi_evh(struct avnd_cb_tag *cb,
struct avnd_evt_tag *evt);
+extern bool comp_in_term_failed_state(void);
#endif // AMF_AMFND_AVND_SU_H_
diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
index 7b01868..5bff121 100644
--- a/src/amf/amfnd/di.cc
+++ b/src/amf/amfnd/di.cc
@@ -92,6 +92,68 @@ static uint32_t avnd_evt_node_admin_op_req(AVND_CB *cb,
AVND_EVT *evt) {
cb->rcv_msg_id = info->msg_id;
switch (info->oper_id) {
+ case SA_AMF_ADMIN_REPAIRED: {
+ /* Node has been repaired. Reset states of this node and all DISABLED
+ * SUs/comps. And update AMF director accordingly.
+ * No need to reset states of ENABLED SUs(in case of
+ * SA_AMF_NODE_SWITCHOVER, only faulty components/SU are disabled,
+ * other SUs assignments are simply switched over.)
+ * But for ENABLED Sus, send oper state message, so that, they
+ * are evaluated for assignments.
+ */
+ LOG_NO("Repair request for Node'%s'", Amf::to_string(&info->dn).c_str());
+
+ // Reset this node state first, so that when SU enabled message
+ // reaches at Amfd, it starts giving assignments to those SUs.
+ cb->oper_state = SA_AMF_OPERATIONAL_ENABLED;
+ cb->term_state = AVND_TERM_STATE_UP;
+ cb->node_err_esc_level = AVND_ERR_ESC_LEVEL_0;
+ cb->failed_su = nullptr;
+ cb->su_failover_cnt = 0;
+
+ /* Reset all faulty SUs and Comps */
+ for (AVND_SU *su = avnd_sudb_rec_get_next(cb->sudb, ""); su != nullptr;
+ su = avnd_sudb_rec_get_next(cb->sudb, su->name)) {
+ if (su->is_ncs || su->su_is_external)
+ continue;
+ su->comp_restart_cnt = 0;
+ su->su_restart_cnt = 0;
+ su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0;
+ if (m_AVND_SU_OPER_STATE_IS_ENABLED(su)){
+ rc = avnd_di_oper_send(cb, su, 0);
+ continue;
+ }
+ // Reset the components states.
+ for (AVND_COMP *comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(
+ m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
+ comp; comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(
+ m_NCS_DBLIST_FIND_NEXT(&comp->su_dll_node))) {
+ comp->admin_oper = false;
+ m_AVND_COMP_STATE_RESET(comp);
+ avnd_comp_pres_state_set(cb, comp, SA_AMF_PRESENCE_UNINSTANTIATED);
+
+ m_AVND_COMP_OPER_STATE_SET(comp, SA_AMF_OPERATIONAL_ENABLED);
+ avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, saAmfCompOperState_ID,
+ comp->name, comp->oper);
+ }
+
+ // Reset the SUs states.
+ if ((su->pres == SA_AMF_PRESENCE_TERMINATION_FAILED) &&
+ (comp_in_term_failed_state() == false))
+ avnd_failed_state_file_delete();
+
+ su->admin_op_Id = static_cast<SaAmfAdminOperationIdT>(0);
+ reset_suRestart_flag(su);
+ m_AVND_SU_STATE_RESET(su);
+ m_AVND_SU_OPER_STATE_SET(su, SA_AMF_OPERATIONAL_ENABLED);
+ avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSUOperState_ID, su->name,
+ su->oper);
+ avnd_su_pres_state_set(cb, su, SA_AMF_PRESENCE_UNINSTANTIATED);
+ rc = avnd_di_oper_send(cb, su, 0);
+ } // End of for loop for su
+ break;
+ } // End of case SA_AMF_ADMIN_REPAIRED:
+
default:
LOG_NO("%s: unsupported adm op %u", __FUNCTION__, info->oper_id);
rc = NCSCC_RC_FAILURE;
diff --git a/src/amf/amfnd/err.cc b/src/amf/amfnd/err.cc
index aeec373..c549047 100644
--- a/src/amf/amfnd/err.cc
+++ b/src/amf/amfnd/err.cc
@@ -1135,7 +1135,7 @@ uint32_t avnd_err_rcvr_node_failover(AVND_CB *cb, AVND_SU
*failed_su,
for (comp = avnd_compdb_rec_get_next(cb->compdb, ""); comp != nullptr;
comp = avnd_compdb_rec_get_next(cb->compdb, comp->name)) {
if (comp->su->is_ncs || comp->su->su_is_external) continue;
-
+ rc = avnd_comp_curr_info_del(cb, comp);
rc = avnd_comp_clc_fsm_run(cb, comp, AVND_COMP_CLC_PRES_FSM_EV_CLEANUP);
if (rc != NCSCC_RC_SUCCESS) {
LOG_ER("'%s' termination failed", comp->name.c_str());
diff --git a/src/amf/amfnd/su.cc b/src/amf/amfnd/su.cc
index d8e388a..cb4928d 100644
--- a/src/amf/amfnd/su.cc
+++ b/src/amf/amfnd/su.cc
@@ -639,7 +639,7 @@ done:
return rc;
}
-static bool comp_in_term_failed_state(void) {
+bool comp_in_term_failed_state(void) {
for (AVND_COMP *comp = avnd_compdb_rec_get_next(avnd_cb->compdb, "");
comp != nullptr;
comp = avnd_compdb_rec_get_next(avnd_cb->compdb, comp->name)) {
--
2.7.4
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel