osaf/services/saf/avsv/avnd/avnd_clc.c | 82 +++++++++++---------
osaf/services/saf/avsv/avnd/avnd_comp.c | 2 +-
osaf/services/saf/avsv/avnd/avnd_su.c | 1 +
osaf/services/saf/avsv/avnd/avnd_susm.c | 127 ++++++++++++++++++++++++-------
4 files changed, 146 insertions(+), 66 deletions(-)
Refloating the patch after incorporating comments.
diff --git a/osaf/services/saf/avsv/avnd/avnd_clc.c
b/osaf/services/saf/avsv/avnd/avnd_clc.c
--- a/osaf/services/saf/avsv/avnd/avnd_clc.c
+++ b/osaf/services/saf/avsv/avnd/avnd_clc.c
@@ -1065,8 +1065,8 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
if (m_AVND_COMP_IS_FAILED(comp) &&
!comp->csi_list.n_nodes &&
!m_AVND_SU_IS_ADMN_TERM(comp->su) &&
(cb->oper_state == SA_AMF_OPERATIONAL_ENABLED)) {
- /* No need to restart component during shutdown
*/
- if (!m_AVND_IS_SHUTTING_DOWN(cb))
+ /* No need to restart component during shutdown
and during sufailover*/
+ if (!m_AVND_IS_SHUTTING_DOWN(cb) &&
!avnd_sufailover_in_progress(comp->su))
rc = avnd_comp_clc_fsm_trigger(cb,
comp, AVND_COMP_CLC_PRES_FSM_EV_INST);
} else if (m_AVND_COMP_IS_FAILED(comp) &&
!comp->csi_list.n_nodes) {
m_AVND_COMP_FAILED_RESET(comp); /*if we moved
from restart -> term
@@ -1099,33 +1099,38 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
goto done;
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_OPER_STATE);
- if (!m_AVND_COMP_IS_FAILED(comp)) {
- /* csi-set / csi-rem succeeded.. generate
csi-done indication */
- csi =
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list));
- osafassert(csi);
- if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
- rc = avnd_comp_csi_assign_done(cb, comp,
-
m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
- else if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
- rc = avnd_comp_csi_remove_done(cb, comp,
-
m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
- if (NCSCC_RC_SUCCESS != rc)
- goto done;
- } else {
- /* failed su is ready to take on si
assignment.. inform avd */
- if (!comp->csi_list.n_nodes) {
- m_AVND_SU_IS_ENABLED(comp->su, is_en);
- if (true == is_en) {
-
m_AVND_SU_OPER_STATE_SET(comp->su,SA_AMF_OPERATIONAL_ENABLED);
-
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su, AVND_CKPT_SU_OPER_STATE);
- rc = avnd_di_oper_send(cb,
comp->su, 0);
- if (NCSCC_RC_SUCCESS != rc)
- goto done;
+ if (avnd_sufailover_in_progress(comp->su)) {
+ /*Do not reset any flag, this will be done as a
part of repair.*/
+ }
+ else {
+ if (!m_AVND_COMP_IS_FAILED(comp)) {
+ /* csi-set / csi-rem succeeded..
generate csi-done indication */
+ csi =
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list));
+ osafassert(csi);
+ if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
+ rc =
avnd_comp_csi_assign_done(cb, comp,
+
m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
+ else if
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
+ rc =
avnd_comp_csi_remove_done(cb, comp,
+
m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ } else {
+ /* failed su is ready to take on si
assignment.. inform avd */
+ if (!comp->csi_list.n_nodes) {
+ m_AVND_SU_IS_ENABLED(comp->su,
is_en);
+ if (true == is_en) {
+
m_AVND_SU_OPER_STATE_SET(comp->su,SA_AMF_OPERATIONAL_ENABLED);
+
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su, AVND_CKPT_SU_OPER_STATE);
+ rc =
avnd_di_oper_send(cb, comp->su, 0);
+ if (NCSCC_RC_SUCCESS !=
rc)
+ goto done;
+ }
+ m_AVND_COMP_FAILED_RESET(comp);
+
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, AVND_CKPT_COMP_FLAG_CHANGE);
}
- m_AVND_COMP_FAILED_RESET(comp);
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
comp, AVND_CKPT_COMP_FLAG_CHANGE);
+
}
-
}
}
@@ -1190,12 +1195,17 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
/* terminating -> uninstantiated */
if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
(SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
- /* npi comps are enabled in uninstantiated state */
- m_AVND_COMP_OPER_STATE_SET(comp,
SA_AMF_OPERATIONAL_ENABLED);
- m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc);
- if (NCSCC_RC_SUCCESS != rc)
- goto done;
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_OPER_STATE);
+ if (avnd_sufailover_in_progress(comp->su)) {
+ /*Do not reset any flag, this will be done as a
part of repair.*/
+ }
+ else {
+ /* npi comps are enabled in uninstantiated
state */
+ m_AVND_COMP_OPER_STATE_SET(comp,
SA_AMF_OPERATIONAL_ENABLED);
+ m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc);
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
AVND_CKPT_COMP_OPER_STATE);
+ }
}
/* Instantiating -> Instantiationfailed */
@@ -2763,7 +2773,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
uint32_t avnd_instfail_su_failover(AVND_CB *cb, AVND_SU *su, AVND_COMP
*failed_comp)
{
uint32_t rc = NCSCC_RC_SUCCESS;
- TRACE_ENTER2("Executing SU Failover: Instantiation failed SU: '%s' :
Failed component: '%s'",
+ TRACE_ENTER2("Executing Component Failover: Instantiation failed SU:
'%s' : Failed component: '%s'",
su->name.value,
failed_comp->name.value);
/* mark the comp failed */
@@ -2812,12 +2822,12 @@ uint32_t avnd_instfail_su_failover(AVND_
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
/* inform AvD */
- rc = avnd_di_oper_send(cb, su, AVSV_ERR_RCVR_SU_FAILOVER);
+ rc = avnd_di_oper_send(cb, su, SA_AMF_COMPONENT_FAILOVER);
}
done:
if (rc == NCSCC_RC_SUCCESS)
- LOG_NO("SU Failover trigerred for '%s': Failed component: '%s'",
+ LOG_NO("Component Failover trigerred for '%s': Failed
component: '%s'",
su->name.value, failed_comp->name.value);
TRACE_LEAVE2("%u", rc);
return rc;
diff --git a/osaf/services/saf/avsv/avnd/avnd_comp.c
b/osaf/services/saf/avsv/avnd/avnd_comp.c
--- a/osaf/services/saf/avsv/avnd/avnd_comp.c
+++ b/osaf/services/saf/avsv/avnd/avnd_comp.c
@@ -872,7 +872,7 @@ uint32_t avnd_comp_unreg_prc(AVND_CB *cb
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su,
AVND_CKPT_SU_OPER_STATE);
/* inform AvD */
- rc = avnd_di_oper_send(cb, comp->su, 0);
+ rc = avnd_di_oper_send(cb, comp->su,
SA_AMF_COMPONENT_FAILOVER);
}
}
diff --git a/osaf/services/saf/avsv/avnd/avnd_su.c
b/osaf/services/saf/avsv/avnd/avnd_su.c
--- a/osaf/services/saf/avsv/avnd/avnd_su.c
+++ b/osaf/services/saf/avsv/avnd/avnd_su.c
@@ -494,6 +494,7 @@ uint32_t avnd_evt_su_admin_op_req(AVND_C
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(su, SA_AMF_PRESENCE_UNINSTANTIATED);
+ rc = avnd_di_oper_send(cb, su, 0);
if (!comp_in_term_failed_state())
avnd_failed_state_file_delete();
diff --git a/osaf/services/saf/avsv/avnd/avnd_susm.c
b/osaf/services/saf/avsv/avnd/avnd_susm.c
--- a/osaf/services/saf/avsv/avnd/avnd_susm.c
+++ b/osaf/services/saf/avsv/avnd/avnd_susm.c
@@ -56,7 +56,6 @@ static uint32_t avnd_su_pres_inst_compin
static uint32_t avnd_su_pres_instfailed_compuninst(AVND_CB *, AVND_SU *,
AVND_COMP *);
static uint32_t avnd_su_pres_st_chng_prc(AVND_CB *, AVND_SU *,
SaAmfPresenceStateT, SaAmfPresenceStateT);
-
/****************************************************************************
* S E R V I C E U N I T P R E S F S M M A T R I X D E F I N I T I O N *
****************************************************************************/
@@ -1262,6 +1261,32 @@ done:
return rc;
}
+
+/**
+ * Check if all components have been terminated in the su.
+ * @param su
+ * @return bool
+ */
+static bool all_comps_terminated_in_su(AVND_SU *su)
+{
+ AVND_COMP *comp;
+
+ for (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))) {
+
+ if ((comp->pres != SA_AMF_PRESENCE_UNINSTANTIATED) &&
+ (comp->pres !=
SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
+ (comp->pres !=
SA_AMF_PRESENCE_TERMINATION_FAILED)) {
+
+ TRACE("'%s' not terminated, pres.st=%u",
comp->name.value, comp->pres);
+ return false;
+ }
+ }
+
+ return true;
+}
+
/****************************************************************************
Name : avnd_su_pres_fsm_run
@@ -1300,6 +1325,21 @@ uint32_t avnd_su_pres_fsm_run(AVND_CB *c
TRACE_1("Exited SU presence state FSM: New State = %u",final_st);
+ /*Complete su failover at amfnd*/
+ if (avnd_sufailover_in_progress(su) &&
(all_comps_terminated_in_su(su))) {
+ TRACE("SU_FAILOVER for '%s'", su->name.value);
+ /* Since all components got successfully terminated, finish
sufailover at amfnd
+ by deleting SUSIs at amfnd and informing amfd about
sufailover.*/
+ LOG_NO("Terminated all components in '%s'", su->name.value);
+ LOG_NO("Informing director of sufailover");
+ rc = avnd_di_oper_send(avnd_cb, su, AVSV_ERR_RCVR_SU_FAILOVER);
+ osafassert(NCSCC_RC_SUCCESS == rc);
+ avnd_su_si_del(avnd_cb, &su->name);
+ if (!m_AVND_SU_IS_PREINSTANTIABLE(su))
+ avnd_su_pres_state_set(su,
SA_AMF_PRESENCE_UNINSTANTIATED);
+ goto done;
+ }
+
/* process state change */
if (prv_st != final_st)
rc = avnd_su_pres_st_chng_prc(cb, su, prv_st, final_st);
@@ -1411,17 +1451,24 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
/* terminating -> uninstantiated */
if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
(SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
TRACE("SU Terminating -> Uninstantiated");
- /* reset the su failed flag */
- if (m_AVND_SU_IS_FAILED(su)) {
- m_AVND_SU_FAILED_RESET(su);
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_FLAG_CHANGE);
+ if (avnd_sufailover_in_progress(su)) {
+ /*Do not reset any flag, this will be done as a
part of repair.*/
}
+ else
+ {
+ /* reset the su failed flag */
+ if (m_AVND_SU_IS_FAILED(su)) {
+ m_AVND_SU_FAILED_RESET(su);
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
su, AVND_CKPT_SU_FLAG_CHANGE);
+ }
- /* reset the su restart falg */
- if (m_AVND_SU_IS_RESTART(su)) {
- m_AVND_SU_RESTART_RESET(su);
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_FLAG_CHANGE);
+ /* reset the su restart flag */
+ if (m_AVND_SU_IS_RESTART(su)) {
+ m_AVND_SU_RESTART_RESET(su);
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
su, AVND_CKPT_SU_FLAG_CHANGE);
+ }
}
+ goto done;
}
/* instantiating -> inst-failed */
@@ -1430,7 +1477,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
/* send the su-oper state msg (to indicate that
instantiation failed) */
m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_DISABLED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
- rc = avnd_di_oper_send(cb, su,
AVSV_ERR_RCVR_SU_FAILOVER);
+ rc = avnd_di_oper_send(cb, su,
SA_AMF_COMPONENT_FAILOVER);
if (NCSCC_RC_SUCCESS != rc)
goto done;
}
@@ -1457,7 +1504,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
TRACE("SU oper state is enabled");
m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_DISABLED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
- rc = avnd_di_oper_send(cb, su,
AVSV_ERR_RCVR_SU_FAILOVER);
+ rc = avnd_di_oper_send(cb, su,
SA_AMF_COMPONENT_FAILOVER);
if (NCSCC_RC_SUCCESS != rc)
goto done;
}
@@ -1471,7 +1518,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_DISABLED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
/* inform AvD about oper state change */
- rc = avnd_di_oper_send(cb, su, 0);
+ rc = avnd_di_oper_send(cb, su,
SA_AMF_COMPONENT_FAILOVER);
if (NCSCC_RC_SUCCESS != rc)
goto done;
@@ -1515,7 +1562,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_DISABLED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
- rc = avnd_di_oper_send(cb, su,
AVSV_ERR_RCVR_SU_FAILOVER);
+ rc = avnd_di_oper_send(cb, su,
SA_AMF_COMPONENT_FAILOVER);
}
@@ -1531,15 +1578,21 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
/* terminating -> uninstantiated */
if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
(SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
TRACE("Terminating -> UnInstantiated");
- /* si assignment/removal success.. generate si-oper
done indication */
- rc = avnd_su_si_oper_done(cb, su,
m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
- m_AVND_SU_ALL_SI_RESET(su);
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_FLAG_CHANGE);
+ if (avnd_sufailover_in_progress(su)) {
+ /*Do not reset any flag, this will be done as a
part of repair.*/
+ }
+ else
+ {
+ /* si assignment/removal success.. generate
si-oper done indication */
+ rc = avnd_su_si_oper_done(cb, su,
m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
+ m_AVND_SU_ALL_SI_RESET(su);
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_FLAG_CHANGE);
- /* npi su is enabled in uninstantiated state */
- m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_ENABLED);
- m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
- rc = avnd_di_oper_send(cb, su, 0);
+ /* npi su is enabled in uninstantiated state */
+ m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_ENABLED);
+ m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
+ rc = avnd_di_oper_send(cb, su, 0);
+ }
}
/* terminating/instantiated/restarting -> term-failed */
@@ -1550,7 +1603,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
m_AVND_SU_OPER_STATE_SET(su,
SA_AMF_OPERATIONAL_DISABLED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
AVND_CKPT_SU_OPER_STATE);
/* inform AvD about oper state change */
- rc = avnd_di_oper_send(cb, su, 0);
+ rc = avnd_di_oper_send(cb, su,
SA_AMF_COMPONENT_FAILOVER);
/* si assignment/removal failed.. inform AvD */
rc = avnd_di_susi_resp_send(cb, su,
m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
@@ -2085,11 +2138,9 @@ uint32_t avnd_su_pres_inst_compterming_h
TRACE_ENTER2("CompTerminating event in the Instantiated state:'%s' :
'%s'",
su->name.value, compname);
- if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
- if (m_AVND_SU_IS_FAILED(su)) {
- /* transition to terminating state */
- avnd_su_pres_state_set(su, SA_AMF_PRESENCE_TERMINATING);
- }
+ if (m_AVND_SU_IS_FAILED(su)) {
+ /* transition to terminating state */
+ avnd_su_pres_state_set(su, SA_AMF_PRESENCE_TERMINATING);
}
TRACE_LEAVE2("%u", rc);
@@ -2258,7 +2309,9 @@ uint32_t avnd_su_pres_terming_compuninst
su->name.value, compname);
/* This case is for handling the case of admn su term while su is
restarting */
- if (m_AVND_SU_IS_PREINSTANTIABLE(su) && m_AVND_SU_IS_FAILED(su) &&
m_AVND_SU_IS_ADMN_TERM(su)) {
+ if (m_AVND_SU_IS_PREINSTANTIABLE(su) && m_AVND_SU_IS_FAILED(su) &&
+ (m_AVND_SU_IS_ADMN_TERM(su) ||
avnd_sufailover_in_progress(su)))
+ {
TRACE("PI SU");
for (curr_comp =
m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
curr_comp;
@@ -2274,6 +2327,7 @@ uint32_t avnd_su_pres_terming_compuninst
}
}
+
/*
* If pi su, pick the prv pi comp & trigger it's FSM with TermEv.
*/
@@ -2304,7 +2358,7 @@ uint32_t avnd_su_pres_terming_compuninst
/*
* If npi su, pick the prv csi & trigger it's comp fsm with TermEv.
*/
- if (!m_AVND_SU_IS_PREINSTANTIABLE(su)) {
+ if (!m_AVND_SU_IS_PREINSTANTIABLE(su) && !m_AVND_SU_IS_FAILED(su)) {
TRACE("NPI SU");
/* get the only csi rec */
curr_csi =
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list));
@@ -2730,3 +2784,18 @@ uint32_t avnd_su_pres_instfailed_compuni
return rc;
}
+/**
+ * This function checks if the sufailover is going on.
+ * @param su: ptr to the SU .
+ *
+ * @return true/false.
+ */
+bool avnd_sufailover_in_progress(AVND_SU *su)
+{
+ if (m_AVND_SU_IS_FAILED(su) && (su->sufailover) &&
+ ((su->sg_redundancy_model ==
SA_AMF_2N_REDUNDANCY_MODEL) ||
+ (su->sg_redundancy_model ==
SA_AMF_NO_REDUNDANCY_MODEL)) &&
+ (avnd_cb->oper_state != SA_AMF_OPERATIONAL_DISABLED)
&& (!su->is_ncs))
+ return true;
+ return false;
+}
------------------------------------------------------------------------------
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