osaf/services/saf/avsv/avd/avd_clm.cc | 1 +
osaf/services/saf/avsv/avd/avd_node.cc | 7 +-
osaf/services/saf/avsv/avd/avd_sg.cc | 9 +-
osaf/services/saf/avsv/avd/avd_sgproc.cc | 371 ++++++++++++++++---------
osaf/services/saf/avsv/avd/avd_su.cc | 1 +
osaf/services/saf/avsv/avd/include/avd_proc.h | 3 +
6 files changed, 242 insertions(+), 150 deletions(-)
Refloating the patch after incorporating comments.
diff --git a/osaf/services/saf/avsv/avd/avd_clm.cc
b/osaf/services/saf/avsv/avd/avd_clm.cc
--- a/osaf/services/saf/avsv/avd/avd_clm.cc
+++ b/osaf/services/saf/avsv/avd/avd_clm.cc
@@ -50,6 +50,7 @@ static void clm_node_join_complete(AVD_A
(node->node_state ==
AVD_AVND_STATE_NO_CONFIG) ||
(node->node_state ==
AVD_AVND_STATE_NCS_INIT)) {
if ((su->sg_of_su->saAmfSGAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+ (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(su->saAmfSUAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
/* When the SU will instantiate then
prescence state change message will come
and so store the callback parameters
to send response later on. */
diff --git a/osaf/services/saf/avsv/avd/avd_node.cc
b/osaf/services/saf/avsv/avd/avd_node.cc
--- a/osaf/services/saf/avsv/avd/avd_node.cc
+++ b/osaf/services/saf/avsv/avd/avd_node.cc
@@ -721,7 +721,8 @@ uint32_t node_admin_unlock_instantiation
while (su != NULL) {
if ((su->saAmfSUAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
(su->sg_of_su->saAmfSGAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
- (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED)) {
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) &&
+ (su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)) {
if (su->saAmfSUPreInstantiable == true) {
if (su->sg_of_su->saAmfSGNumPrefInserviceSUs >
@@ -735,9 +736,7 @@ uint32_t node_admin_unlock_instantiation
LOG_WA("Failed Instantiation
'%s'", su->name.value);
}
}
- } else {
- avd_su_oper_state_set(su,
SA_AMF_OPERATIONAL_ENABLED);
- }
+ }
}
su = su->avnd_list_su_next;
}
diff --git a/osaf/services/saf/avsv/avd/avd_sg.cc
b/osaf/services/saf/avsv/avd/avd_sg.cc
--- a/osaf/services/saf/avsv/avd/avd_sg.cc
+++ b/osaf/services/saf/avsv/avd/avd_sg.cc
@@ -944,8 +944,9 @@ static void sg_app_sg_admin_unlock_inst(
/* Instantiate the SUs in this SG */
for (su = sg->list_of_su, su_try_inst = 0; su != NULL; su =
su->sg_list_su_next) {
if ((su->saAmfSUAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
- (su->su_on_node->saAmfNodeAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION)
- && (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED)) {
+ (su->su_on_node->saAmfNodeAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+ (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
+ (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED)) {
if (su->saAmfSUPreInstantiable == true) {
if (su->su_on_node->node_state ==
AVD_AVND_STATE_PRESENT) {
@@ -963,9 +964,7 @@ static void sg_app_sg_admin_unlock_inst(
/* set uncondionally of msg snd outcome */
m_AVD_SET_SU_TERM(cb, su, false);
- } else {
- avd_su_oper_state_set(su,
SA_AMF_OPERATIONAL_ENABLED);
- }
+ }
}
}
diff --git a/osaf/services/saf/avsv/avd/avd_sgproc.cc
b/osaf/services/saf/avsv/avd/avd_sgproc.cc
--- a/osaf/services/saf/avsv/avd/avd_sgproc.cc
+++ b/osaf/services/saf/avsv/avd/avd_sgproc.cc
@@ -36,6 +36,9 @@
#include <avd_si_dep.h>
static SaAisErrorT avd_d2n_reboot_snd(AVD_AVND *node);
+static uint32_t sg_su_failover_func(AVD_SU *su);
+static void su_try_repair(const AVD_SU *su);
+static uint32_t su_recover_from_fault(AVD_SU *su);
/*****************************************************************************
* Function: avd_new_assgn_susi
@@ -370,14 +373,19 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
while (i_su != NULL) {
avd_su_readiness_state_set(i_su, SA_AMF_READINESS_OUT_OF_SERVICE);
if (i_su->list_of_susi !=
AVD_SU_SI_REL_NULL) {
- node_reboot_req = false;
- /* Since assignments
exists call the SG FSM.
+ /* Delay Node reboot if:
+ a)Faulted SU
has saAmfSUFailover flag set but
+ other
healthy SUs are present on node.
+ b)Only faulted
SU exists on the node and its
+
saAmfSUFailover flag is false.
*/
- if
(i_su->sg_of_su->su_fault(cb, i_su) == NCSCC_RC_FAILURE) {
- /* Bad
situation. Free the message and return since
- * receive id
was not processed the event will again
- * comeback
which we can then process.
- */
+ if (((i_su == su) &&
(!i_su->saAmfSUFailover)) ||
+ ((i_su
!= su) &&
+
(i_su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)))
+ node_reboot_req
= false;
+
+ /* Since assignments
exists call the SG FSM.*/
+ if
(su_recover_from_fault(i_su) == NCSCC_RC_FAILURE) {
LOG_ER("%s:%d
%s", __FUNCTION__, __LINE__, i_su->name.value);
goto done;
}
@@ -387,16 +395,12 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
* to be done for the SG on
which this SU exists.
*/
if (avd_sg_app_su_inst_func(cb,
i_su->sg_of_su) == NCSCC_RC_FAILURE) {
- /* Bad situation. Free
the message and return since
- * receive id was not
processed the event will again
- * comeback which we
can then process.
- */
LOG_ER("%s:%d %s",
__FUNCTION__, __LINE__, i_su->name.value);
goto done;
}
i_su = i_su->avnd_list_su_next;
- } /* while(i_su != AVD_SU_NULL) */
+ }
break;
default :
break;
@@ -410,41 +414,53 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
avd_d2n_reboot_snd(node);
} else {
saflog(LOG_NOTICE,
amfSvcUsrName,
- "Autorepair
disabled for '%s', NO reboot ordered",
+ "NodeAutorepair
disabled for '%s', NO reboot ordered",
node->name.value);
+
}
}
} else { /* if
(n2d_msg->msg_info.n2d_opr_state.node_oper_state ==
SA_AMF_OPERATIONAL_DISABLED) */
- if (su->list_of_susi !=
AVD_SU_SI_REL_NULL) {
- /* Since assignments exists
call the SG FSM.
- */
+ if (su->list_of_susi != AVD_SU_SI_REL_NULL) {
+ /* Since assignments exists call the SG
FSM. */
+ switch
(n2d_msg->msg_info.n2d_opr_state.rec_rcvr.saf_amf) {
+ case SA_AMF_COMPONENT_FAILOVER:
if (su->sg_of_su->su_fault(cb,
su) == NCSCC_RC_FAILURE) {
- /* Bad situation. Free
the message and return since
- * receive id was not
processed the event will again
- * comeback which we
can then process.
- */
LOG_ER("%s:%d %s",
__FUNCTION__, __LINE__, su->name.value);
goto done;
}
+ break;
+ case AVSV_ERR_RCVR_SU_FAILOVER:
+ if (sg_su_failover_func(su) ==
NCSCC_RC_FAILURE) {
+ LOG_ER("%s:%d %s",
__FUNCTION__, __LINE__, su->name.value);
+ goto done;
+ }
+ break;
+ default :
+ LOG_ER("Recovery:'%u' not
supported",
+
n2d_msg->msg_info.n2d_opr_state.rec_rcvr.saf_amf);
+ break;
}
+ }
- /* Verify the SG to check if any
instantiations need
- * to be done for the SG on which this
SU exists.
+ su_try_repair(su);
+
+ /* Verify the SG to check if any instantiations
need
+ * to be done for the SG on which this SU
exists.
+ */
+ if (avd_sg_app_su_inst_func(cb, su->sg_of_su)
== NCSCC_RC_FAILURE) {
+ /* Bad situation. Free the message and
return since
+ * receive id was not processed the
event will again
+ * comeback which we can then process.
*/
- if (avd_sg_app_su_inst_func(cb,
su->sg_of_su) == NCSCC_RC_FAILURE) {
- /* Bad situation. Free the
message and return since
- * receive id was not processed
the event will again
- * comeback which we can then
process.
- */
- LOG_ER("%s:%d %s",
__FUNCTION__, __LINE__, su->sg_of_su->name.value);
- goto done;
- }
+ LOG_ER("%s:%d %s", __FUNCTION__,
__LINE__, su->sg_of_su->name.value);
+ goto done;
+ }
- } /* else
(n2d_msg->msg_info.n2d_opr_state.node_oper_state ==
SA_AMF_OPERATIONAL_DISABLED) */
+ } /* else
(n2d_msg->msg_info.n2d_opr_state.node_oper_state ==
SA_AMF_OPERATIONAL_DISABLED) */
- }
- /* else if(cb->init_state == AVD_APP_STATE) */
+ }
+ /* else if(cb->init_state == AVD_APP_STATE) */
} /* if (n2d_msg->msg_info.n2d_opr_state.su_oper_state ==
SA_AMF_OPERATIONAL_DISABLED) */
else if (n2d_msg->msg_info.n2d_opr_state.su_oper_state ==
SA_AMF_OPERATIONAL_ENABLED) {
avd_su_oper_state_set(su, SA_AMF_OPERATIONAL_ENABLED);
@@ -472,6 +488,13 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
if (m_AVD_APP_SU_IS_INSVC(su, su_node_ptr)) {
+ /* If oper state of Uninstantiated SU got
ENABLED so try to instantiate it
+ after evaluating SG. */
+ if (su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) {
+ avd_sg_app_su_inst_func(cb,
su->sg_of_su);
+ goto done;
+ }
+
avd_su_readiness_state_set(su,
SA_AMF_READINESS_IN_SERVICE);
if ((cb->init_state == AVD_APP_STATE) &&
(old_state == SA_AMF_READINESS_OUT_OF_SERVICE)) {
/* An application SU has become in
service call SG FSM */
@@ -908,17 +931,10 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
if ((su->saAmfSUNumCurrActiveSIs == 0) &&
(su->saAmfSUNumCurrStandbySIs == 0)) {
/* For lock and shutdown, response to
IMM admin operation should be
sent when response for DEL operation
is received */
- if (AVSV_SUSI_ACT_DEL ==
n2d_msg->msg_info.n2d_su_si_assign.msg_act) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-
su->pend_cbk.invocation, SA_AIS_OK);
- su->pend_cbk.invocation = 0;
- su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
+ if (AVSV_SUSI_ACT_DEL ==
n2d_msg->msg_info.n2d_su_si_assign.msg_act)
+ avd_su_complete_admin_op(su,
SA_AIS_OK);
} else if
(n2d_msg->msg_info.n2d_su_si_assign.error != NCSCC_RC_SUCCESS) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle, su->pend_cbk.invocation,
-
SA_AIS_ERR_REPAIR_PENDING);
- su->pend_cbk.invocation = 0;
- su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ avd_su_complete_admin_op(su,
SA_AIS_ERR_REPAIR_PENDING);
}
/* else lock is still not complete so don't
send result. */
} else if (su->pend_cbk.admin_oper ==
SA_AMF_ADMIN_UNLOCK) {
@@ -926,18 +942,12 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
/* Respond to IMM when SG is STABLE or if a
fault occured */
if (n2d_msg->msg_info.n2d_su_si_assign.error ==
NCSCC_RC_SUCCESS) {
if (su->sg_of_su->sg_fsm_state ==
AVD_SG_FSM_STABLE) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-
su->pend_cbk.invocation, SA_AIS_OK);
- su->pend_cbk.invocation = 0;
- su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ avd_su_complete_admin_op(su,
SA_AIS_OK);
} else
; // wait for SG to become
STABLE
- } else {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle, su->pend_cbk.invocation,
-
SA_AIS_ERR_TIMEOUT);
- su->pend_cbk.invocation = 0;
- su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
+ }
+ else
+ avd_su_complete_admin_op(su,
SA_AIS_ERR_TIMEOUT);
}
} else if (su->su_on_node->admin_node_pend_cbk.invocation != 0)
{
/* decrement the SU count on the node undergoing admin
operation
@@ -979,12 +989,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
(su->sg_of_su->sg_fsm_state ==
AVD_SG_FSM_STABLE)) {
for (temp_su =
su->sg_of_su->list_of_su; temp_su != NULL;
temp_su =
temp_su->sg_list_su_next) {
- if
(temp_su->pend_cbk.invocation != 0) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-
temp_su->pend_cbk.invocation, SA_AIS_OK);
-
temp_su->pend_cbk.invocation = 0;
-
temp_su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(0);
- }
+
avd_su_complete_admin_op(temp_su, SA_AIS_OK);
}
} else
; // wait for SG to become STABLE
@@ -1035,7 +1040,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
avd_d2n_reboot_snd(node);
} else {
saflog(LOG_NOTICE, amfSvcUsrName,
- "Autorepair disabled for '%s', NO
reboot ordered",
+ "NodeAutorepair disabled for '%s', NO
reboot ordered",
node->name.value);
}
}
@@ -1089,6 +1094,7 @@ void avd_sg_app_node_su_inst_func(AVD_CL
(i_su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) &&
(i_su->saAmfSUAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
(i_su->sg_of_su->saAmfSGAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+ (i_su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(i_su->su_on_node->saAmfNodeAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
if (i_su->saAmfSUPreInstantiable == true) {
if
(i_su->sg_of_su->saAmfSGNumPrefInserviceSUs >
@@ -1184,8 +1190,8 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_
if ((i_su->saAmfSUPreInstantiable == false) &&
(i_su->saAmfSUPresenceState ==
SA_AMF_PRESENCE_UNINSTANTIATED) &&
(su_node_ptr->saAmfNodeOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
+ (i_su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(i_su->term_state == false)) {
- avd_su_oper_state_set(i_su,
SA_AMF_OPERATIONAL_ENABLED);
m_AVD_GET_SU_NODE_PTR(cb, i_su, su_node_ptr);
if (m_AVD_APP_SU_IS_INSVC(i_su, su_node_ptr)) {
@@ -1208,6 +1214,7 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_
(i_su->su_on_node->saAmfNodeAdminState
!= SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
(su_node_ptr->saAmfNodeOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(su_node_ptr->node_info.member == true)
&&
+ (i_su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(i_su->term_state == false)) {
/* Try to Instantiate this SU */
@@ -1346,7 +1353,6 @@ done:
void avd_node_down_mw_susi_failover(AVD_CL_CB *cb, AVD_AVND *avnd)
{
AVD_SU *i_su;
- AVD_COMP *i_comp;
TRACE_ENTER2("'%s'", avnd->name.value);
@@ -1362,31 +1368,8 @@ void avd_node_down_mw_susi_failover(AVD_
avd_su_oper_state_set(i_su, SA_AMF_OPERATIONAL_DISABLED);
avd_su_pres_state_set(i_su, SA_AMF_PRESENCE_UNINSTANTIATED);
avd_su_readiness_state_set(i_su,
SA_AMF_READINESS_OUT_OF_SERVICE);
-
- /* Check if there was any admin operations going on this SU. */
- if (i_su->pend_cbk.invocation != 0) {
- avd_saImmOiAdminOperationResult(cb->immOiHandle,
i_su->pend_cbk.invocation,
- SA_AIS_ERR_TIMEOUT);
- i_su->pend_cbk.invocation = 0;
- i_su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
-
- i_comp = i_su->list_of_comp;
- while (i_comp != NULL) {
- i_comp->curr_num_csi_actv = 0;
- i_comp->curr_num_csi_stdby = 0;
- avd_comp_oper_state_set(i_comp,
SA_AMF_OPERATIONAL_DISABLED);
- avd_comp_pres_state_set(i_comp,
SA_AMF_PRESENCE_UNINSTANTIATED);
- i_comp->saAmfCompRestartCount = 0;
- if (i_comp->admin_pend_cbk.invocation != 0) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-
i_comp->admin_pend_cbk.invocation, SA_AIS_ERR_TIMEOUT);
- i_comp->admin_pend_cbk.invocation = 0;
- i_comp->admin_pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
- m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_comp,
AVSV_CKPT_AVD_COMP_CONFIG);
- i_comp = i_comp->su_comp_next;
- }
+ avd_su_complete_admin_op(i_su, SA_AIS_ERR_TIMEOUT);
+ avd_su_disable_comps(i_su, SA_AIS_ERR_TIMEOUT);
/* Now analyze the service group for the new HA state
* assignments and send the SU SI assign messages
@@ -1394,21 +1377,8 @@ void avd_node_down_mw_susi_failover(AVD_
*/
i_su->sg_of_su->node_fail(cb, i_su);
- /* Free all the SU SI assignments for all the SIs on the
- * the SU if there are any.
- */
-
- while (i_su->list_of_susi != AVD_SU_SI_REL_NULL) {
-
- /* free all the CSI assignments */
- avd_compcsi_delete(cb, i_su->list_of_susi, false);
- /* Unassign the SUSI */
- m_AVD_SU_SI_TRG_DEL(cb, i_su->list_of_susi);
- }
-
- i_su->saAmfSUNumCurrActiveSIs = 0;
- i_su->saAmfSUNumCurrStandbySIs = 0;
- m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_su,
AVSV_CKPT_AVD_SU_CONFIG);
+ /* Free all the SU SI assignments*/
+ avd_sg_su_asgn_del_util(cb, i_su, true, false);
i_su = i_su->avnd_list_su_next;
@@ -1441,7 +1411,6 @@ void avd_node_down_mw_susi_failover(AVD_
void avd_node_down_appl_susi_failover(AVD_CL_CB *cb, AVD_AVND *avnd)
{
AVD_SU *i_su;
- AVD_COMP *i_comp;
TRACE_ENTER2("'%s'", avnd->name.value);
@@ -1454,29 +1423,8 @@ void avd_node_down_appl_susi_failover(AV
avd_su_readiness_state_set(i_su,
SA_AMF_READINESS_OUT_OF_SERVICE);
/* Check if there was any admin operations going on this SU. */
- if (i_su->pend_cbk.invocation != 0) {
- avd_saImmOiAdminOperationResult(cb->immOiHandle,
i_su->pend_cbk.invocation,
- SA_AIS_ERR_TIMEOUT);
- i_su->pend_cbk.invocation = 0;
- i_su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
-
- i_comp = i_su->list_of_comp;
- while (i_comp != NULL) {
- i_comp->curr_num_csi_actv = 0;
- i_comp->curr_num_csi_stdby = 0;
- avd_comp_oper_state_set(i_comp,
SA_AMF_OPERATIONAL_DISABLED);
- avd_comp_pres_state_set(i_comp,
SA_AMF_PRESENCE_UNINSTANTIATED);
- i_comp->saAmfCompRestartCount = 0;
- if (i_comp->admin_pend_cbk.invocation != 0) {
-
avd_saImmOiAdminOperationResult(cb->immOiHandle,
i_comp->admin_pend_cbk.invocation,
- SA_AIS_ERR_TIMEOUT);
- i_comp->admin_pend_cbk.invocation = 0;
- i_comp->admin_pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
- }
- m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_comp,
AVSV_CKPT_AVD_COMP_CONFIG);
- i_comp = i_comp->su_comp_next;
- }
+ avd_su_complete_admin_op(i_su, SA_AIS_ERR_TIMEOUT);
+ avd_su_disable_comps(i_su, SA_AIS_ERR_TIMEOUT);
i_su = i_su->avnd_list_su_next;
} /* while (i_su != AVD_SU_NULL) */
@@ -1494,21 +1442,8 @@ void avd_node_down_appl_susi_failover(AV
*/
i_su->sg_of_su->node_fail(cb, i_su);
- /* Free all the SU SI assignments for all the SIs on the
- * the SU if there are any.
- */
-
- while (i_su->list_of_susi != AVD_SU_SI_REL_NULL) {
-
- /* free all the CSI assignments */
- avd_compcsi_delete(cb, i_su->list_of_susi,
false);
- /* Unassign the SUSI */
- m_AVD_SU_SI_TRG_DEL(cb, i_su->list_of_susi);
- }
-
- i_su->saAmfSUNumCurrActiveSIs = 0;
- i_su->saAmfSUNumCurrStandbySIs = 0;
- m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_su,
AVSV_CKPT_AVD_SU_CONFIG);
+ /* Free all the SU SI assignments*/
+ avd_sg_su_asgn_del_util(cb, i_su, true, false);
/* Since a SU has gone out of service relook at the SG
to
* re instatiate and terminate SUs if needed.
@@ -2042,4 +1977,158 @@ void avd_su_role_failover(AVD_SU *su, AV
TRACE_LEAVE();
}
+/**
+ * @brief Performs sufailover or component failover
+ * At present sufailover is supported only for 2N and NoRed model.
+ *
+ * @param[in] su
+ *
+ * @return NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS
+ **/
+static uint32_t su_recover_from_fault(AVD_SU *su)
+{
+ uint32_t rc = NCSCC_RC_SUCCESS;
+ if (((su->sg_of_su->sg_redundancy_model == SA_AMF_NO_REDUNDANCY_MODEL)
||
+ (su->sg_of_su->sg_redundancy_model ==
SA_AMF_2N_REDUNDANCY_MODEL)) &&
+ (su->saAmfSUFailover) && (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_DISABLED)) {
+ rc = sg_su_failover_func(su);
+ } else {
+ rc = su->sg_of_su->su_fault(avd_cb, su);
+ }
+ return rc;
+}
+
+/**
+ * @brief Sends repair operation message to avnd to perform repiar of the
faulted SU.
+ * This function is used to perform repiar after sufailover
recovery.
+ * Autorepair will be performed only for 2N and NoRed model.
+ *
+ * @param[in] su
+ *
+ **/
+static void su_try_repair(const AVD_SU *su)
+{
+ TRACE_ENTER2("Repair for SU:'%s'", su->name.value);
+
+ if (((su->sg_of_su->sg_redundancy_model == SA_AMF_NO_REDUNDANCY_MODEL)
||
+ (su->sg_of_su->sg_redundancy_model ==
SA_AMF_2N_REDUNDANCY_MODEL)) &&
+ (su->sg_of_su->saAmfSGAutoRepair) &&
(su->saAmfSUFailover) &&
+ (su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) &&
+ (su->saAmfSUPresenceState !=
SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
+ (su->saAmfSUPresenceState !=
SA_AMF_PRESENCE_TERMINATION_FAILED)) {
+
+ saflog(LOG_NOTICE, amfSvcUsrName, "Ordering Auto repair of '%s'
as sufailover repair action",
+ su->sg_of_su->name.value);
+ avd_admin_op_msg_snd(&su->name, AVSV_SA_AMF_SU,
+
static_cast<SaAmfAdminOperationIdT>(SA_AMF_ADMIN_REPAIRED), su->su_on_node);
+ } else {
+ saflog(LOG_NOTICE, amfSvcUsrName, "Autorepair not done for
'%s'", su->sg_of_su->name.value);
+ }
+
+ TRACE_LEAVE();
+}
+
+/**
+ * @brief This function is called when AMFD gets oper_state_evh for
disabled SU and
+ * with recovery as saAmfSUFailover. SU failover will be performed
honoring SI dependency
+ * if configured.
+ * @param su
+ *
+ * @return SaAisErrorT
+ */
+static uint32_t sg_su_failover_func(AVD_SU *su)
+{
+ uint32_t rc = NCSCC_RC_FAILURE;
+
+ TRACE_ENTER2("'%s', %u", su->name.value, su->sg_of_su->sg_fsm_state);
+
+ if (su->list_of_susi == AVD_SU_SI_REL_NULL) {
+ LOG_NO("'%s' has no assignments", su->name.value);
+ rc = NCSCC_RC_SUCCESS;
+ goto done;
+ }
+
+ /* In case of other than 2N and NoRed model perform component failover.
*/
+ if ((su->sg_of_su->sg_redundancy_model != SA_AMF_NO_REDUNDANCY_MODEL)
&&
+ (su->sg_of_su->sg_redundancy_model !=
SA_AMF_2N_REDUNDANCY_MODEL)) {
+ rc = su->sg_of_su->su_fault(avd_cb, su);
+ goto done;
+ }
+
+ avd_su_oper_state_set(su, SA_AMF_OPERATIONAL_DISABLED);
+ avd_su_readiness_state_set(su, SA_AMF_READINESS_OUT_OF_SERVICE);
+ avd_su_complete_admin_op(su, SA_AIS_ERR_TIMEOUT);
+ avd_su_disable_comps(su, SA_AIS_ERR_TIMEOUT);
+
+ /*If the AvD is in AVD_APP_STATE then reassign all the SUSI assignments
for this SU */
+ if (avd_cb->init_state == AVD_APP_STATE) {
+ /* Now analyze the service group for the new HA state
+ assignments and send the SU SI assign messages
+ accordingly.
+ */
+ su->sg_of_su->node_fail(avd_cb, su);
+
+ /* Free all the SU SI assignments*/
+ avd_sg_su_asgn_del_util(avd_cb, su, true, false);
+ }
+
+ rc = NCSCC_RC_SUCCESS;
+
+done:
+ TRACE_LEAVE();
+ return rc;
+}
+
+/**
+ * @brief This function completes admin operation on SU.
+ * It responds IMM with the result of admin operation on SU.
+ * @param ptr to su
+ * @param result
+ *
+ */
+void avd_su_complete_admin_op(AVD_SU *su, SaAisErrorT result)
+{
+ if (su->pend_cbk.invocation != 0) {
+ avd_saImmOiAdminOperationResult(avd_cb->immOiHandle,
su->pend_cbk.invocation, result);
+ su->pend_cbk.invocation = 0;
+ su->pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ }
+}
+
+
+/**
+ * @brief This function completes admin operation on component.
+ * It responds IMM with the result of admin operation on
component.
+ * @param ptr to comp
+ * @param result
+ *
+ */
+void avd_comp_complete_admin_op(AVD_COMP *comp, SaAisErrorT result)
+{
+ if (comp->admin_pend_cbk.invocation != 0) {
+ avd_saImmOiAdminOperationResult(avd_cb->immOiHandle,
comp->admin_pend_cbk.invocation, result);
+ comp->admin_pend_cbk.invocation = 0;
+ comp->admin_pend_cbk.admin_oper =
static_cast<SaAmfAdminOperationIdT>(0);
+ }
+}
+/**
+ * @brief Disable all components since SU is disabled and out of service.
+ * It takes care of response to IMM for any admin operation
pending on components.
+ * @param ptr to su
+ * @param result
+ *
+ */
+void avd_su_disable_comps(AVD_SU *su, SaAisErrorT result)
+{
+ AVD_COMP *comp;
+ for (comp = su->list_of_comp; comp; comp = comp->su_comp_next) {
+ comp->curr_num_csi_actv = 0;
+ comp->curr_num_csi_stdby = 0;
+ avd_comp_oper_state_set(comp, SA_AMF_OPERATIONAL_DISABLED);
+ avd_comp_pres_state_set(comp, SA_AMF_PRESENCE_UNINSTANTIATED);
+ comp->saAmfCompRestartCount = 0;
+ avd_comp_complete_admin_op(comp, result);
+ m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, comp,
AVSV_CKPT_AVD_COMP_CONFIG);
+ }
+}
diff --git a/osaf/services/saf/avsv/avd/avd_su.cc
b/osaf/services/saf/avsv/avd/avd_su.cc
--- a/osaf/services/saf/avsv/avd/avd_su.cc
+++ b/osaf/services/saf/avsv/avd/avd_su.cc
@@ -1117,6 +1117,7 @@ static void su_admin_op_cb(SaImmOiHandle
if ((node->node_state == AVD_AVND_STATE_PRESENT) &&
((node->saAmfNodeAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
(su->sg_of_su->saAmfSGAdminState !=
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) &&
+ (su->saAmfSUOperState ==
SA_AMF_OPERATIONAL_ENABLED) &&
(su->sg_of_su->saAmfSGNumPrefInserviceSUs >
sg_instantiated_su_count(su->sg_of_su))) {
/* When the SU will instantiate then prescence state
change message will come
and so store the callback parameters to send
response later on. */
diff --git a/osaf/services/saf/avsv/avd/include/avd_proc.h
b/osaf/services/saf/avsv/avd/include/avd_proc.h
--- a/osaf/services/saf/avsv/avd/include/avd_proc.h
+++ b/osaf/services/saf/avsv/avd/include/avd_proc.h
@@ -160,5 +160,8 @@ extern void avd_node_mark_absent(AVD_AVN
extern void avd_tmr_snd_hb_evh(AVD_CL_CB *cb, AVD_EVT *evt);
extern void avd_node_failover(AVD_AVND *node);
extern AVD_SU *get_other_su_from_oper_list(AVD_SU *su);
+extern void avd_su_complete_admin_op(AVD_SU *su, SaAisErrorT result);
+extern void avd_comp_complete_admin_op(AVD_COMP *comp, SaAisErrorT result);
+extern void avd_su_disable_comps(AVD_SU *su, SaAisErrorT result);
#endif
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel