Hi Quyen,
Thanks for the review and testing.
I have published V2.The problem was during restart admin on comp, comp
FSM was triggering SU FSM uneccesarily. V2 corrects it.As of now I have
tested only NPI. Will test for PI and Mix SU tomorrow.
Thanks,
Praveen
On 21-Oct-15 1:58 PM, Quyen Dao wrote:
> Hi Praveen,
>
> I applied 2 patches on top of changeset: 7019:f378a750ff34. The presence
> state transition works correctly during admin SU restart.
>
> BUT the new code change causes the amfnd crash when restarting the NPI comp.
>
> Here are the backtrace and syslog.
>
> Backtrace
> ========
> (gdb) bt full
> #0 0x00007fc47f0f1cc9 in __GI_raise (sig=sig@entry=6) at
> ../nptl/sysdeps/unix/sysv/linux/raise.c:56
> resultvar = 0
> pid = 420
> selftid = 420
> #1 0x00007fc47f0f50d8 in __GI_abort () at abort.c:89
> save_stage = 2
> act = {__sigaction_handler = {sa_handler = 0x13d1ea0, sa_sigaction =
> 0x13d1ea0}, sa_mask = {__val = {20782752, 6697632, 140481942730071, 5, 0,
> 6697632, 140481921817896, 1, 6697632, 20773058,
> 140481942758677, 0, 0, 140481925715856, 4294967295, 0}},
> sa_flags = 0, sa_restorer = 0x13d8050}
> sigs = {__val = {32, 0 <repeats 15 times>}}
> #2 0x00007fc48024ca4e in __osafassert_fail (__file=<optimized out>,
> __line=<optimized out>, __func=<optimized out>, __assertion=<optimized out>)
> at sysf_def.c:281
> No locals.
> #3 0x0000000000437f50 in avnd_su_si_oper_done (cb=0x6632a0 <_avnd_cb>,
> su=su@entry=0x13cf8a0, si=0x13d1ea0) at susm.cc:1067
> curr_si = 0x13d1ea0
> curr_csi = <optimized out>
> opr_done = true
> __FUNCTION__ = "avnd_su_si_oper_done"
> t_csi = 0x0
> rc = 1
> #4 0x0000000000439119 in npi_su_instantiating_to_instantiated
> (su=su@entry=0x13cf8a0) at susm.cc:1585
> si = 0x13d1ea0
> rc = 1
> __FUNCTION__ = "npi_su_instantiating_to_instantiated"
> #5 0x00000000004395b0 in avnd_su_pres_inst_compinst_hdler
> (cb=cb@entry=0x6632a0 <_avnd_cb>, su=su@entry=0x13cf8a0,
> comp=comp@entry=0x13d6200) at susm.cc:3738
> curr_csi = 0x0
> compname = 0x13d623a
> "safComp=AmfDemo,safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1"
> __FUNCTION__ = "avnd_su_pres_inst_compinst_hdler"
> curr_comp = <optimized out>
> rc = 1
> #6 0x0000000000436734 in avnd_su_pres_fsm_run (cb=cb@entry=0x6632a0
> <_avnd_cb>, su=0x13cf8a0, comp=comp@entry=0x13d6200,
> ev=ev@entry=AVND_SU_PRES_FSM_EV_COMP_INSTANTIATED) at susm.cc:1517
> prv_st = SA_AMF_PRESENCE_INSTANTIATED
> final_st = 21
> rc = 1
> __FUNCTION__ = "avnd_su_pres_fsm_run"
> #7 0x0000000000413f90 in avnd_comp_clc_st_chng_prc (cb=cb@entry=0x6632a0
> <_avnd_cb>, comp=comp@entry=0x13d6200,
> prv_st=prv_st@entry=SA_AMF_PRESENCE_RESTARTING,
> final_st=final_st@entry=SA_AMF_PRESENCE_INSTANTIATED) at clc.cc:1357
> csi = <optimized out>
> __FUNCTION__ = "avnd_comp_clc_st_chng_prc"
> ev = AVND_SU_PRES_FSM_EV_COMP_INSTANTIATED
> is_en = <optimized out>
> rc = <optimized out>
> #8 0x000000000041584f in avnd_comp_clc_fsm_run (cb=cb@entry=0x6632a0
> <_avnd_cb>, comp=comp@entry=0x13d6200,
> ev=AVND_COMP_CLC_PRES_FSM_EV_INST_SUCC) at clc.cc:894
> prv_st = SA_AMF_PRESENCE_RESTARTING
> final_st = <optimized out>
> rc = 1
> __FUNCTION__ = "avnd_comp_clc_fsm_run"
> #9 0x0000000000415e39 in avnd_evt_clc_resp_evh (cb=0x6632a0 <_avnd_cb>,
> evt=0x7fc4740008c0) at clc.cc:417
> __FUNCTION__ = "avnd_evt_clc_resp_evh"
> ev = <optimized out>
> clc_evt = 0x7fc4740008e0
> comp = 0x13d6200
> rc = 1
> #10 0x0000000000429282 in avnd_evt_process (evt=0x7fc4740008c0) at
> main.cc:660
> cb = 0x6632a0 <_avnd_cb>
> rc = 1
> #11 avnd_main_process () at main.cc:604
> ret = <optimized out>
> fds = {{fd = 11, events = 1, revents = 1}, {fd = 15, events = 1,
> revents = 0}, {fd = 13, events = 1, revents = 0}, {fd = 0, events = 0,
> revents = 0}}
> evt = 0x7fc4740008c0
> __FUNCTION__ = "avnd_main_process"
> #12 0x000000000040469c in main (argc=2, argv=0x7ffc927dd938) at main.cc:178
> error = 0
> (gdb)
>
> syslog
> =====
> Oct 21 14:43:22 PL-3 osafimmnd[394]: NO Ccb 2 COMMITTED (immcfg_SC-1_1107)
> Oct 21 14:44:01 PL-3 osafamfnd[420]: NO Assigning
> 'safSi=AmfDemo,safApp=AmfDemo1' ACTIVE to
> 'safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1'
> Oct 21 14:44:01 PL-3 osafamfnd[420]: NO
> 'safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1' Presence State UNINSTANTIATED =>
> INSTANTIATING
> Oct 21 14:44:01 PL-3 osafamfnd[420]: NO
> 'safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1' Presence State INSTANTIATING =>
> INSTANTIATED
> Oct 21 14:44:01 PL-3 osafamfnd[420]: NO Assigned
> 'safSi=AmfDemo,safApp=AmfDemo1' ACTIVE to
> 'safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1'
> Oct 21 14:45:30 PL-3 osafamfnd[420]: NO Admin restart requested for
> 'safComp=AmfDemo,safSu=SU1,safSg=AmfDemo,safApp=AmfDemo1'
> Oct 21 14:45:30 PL-3 osafamfnd[420]: CR current si name
> ='safSi=AmfDemo,safApp=AmfDemo1'
> Oct 21 14:45:30 PL-3 osafamfnd[420]: CR SI: curr_assign_state = 3,
> prv_assign_state = 0, curr_state = 1, prv_state = 0
> Oct 21 14:45:30 PL-3 osafamfnd[420]: susm.cc:1067: avnd_su_si_oper_done:
> Assertion '0' failed.
> Oct 21 14:45:30 PL-3 osafclmna[412]: AL AMF Node Director is down, terminate
> this process
> Oct 21 14:45:30 PL-3 osafamfwd[463]: Rebooting OpenSAF NodeId = 0 EE Name =
> No EE Mapped, Reason: AMF unexpectedly crashed, OwnNodeId = 131855,
> SupervisionTime = 60
>
> Thanks,
> Quyen
>
>
>
> -----Original Message-----
> From: [email protected] [mailto:[email protected]]
> Sent: Tuesday, October 20, 2015 4:31 PM
> To: [email protected]; [email protected];
> [email protected]
> Cc: [email protected]
> Subject: [PATCH 1 of 2] amfd: fix SU presence state transition during
> restart admin op [#1518]
>
> osaf/services/saf/amf/amfd/comp.cc | 10 +
> osaf/services/saf/amf/amfd/include/comp.h | 1 +
> osaf/services/saf/amf/amfd/include/su.h | 4 +-
> osaf/services/saf/amf/amfd/ndproc.cc | 24 ++-
> osaf/services/saf/amf/amfd/su.cc | 18 ++
> osaf/services/saf/amf/amfnd/include/avnd_su.h | 2 +
> osaf/services/saf/amf/amfnd/su.cc | 11 +
> osaf/services/saf/amf/amfnd/susm.cc | 164
> +++++++++++++++++++------
> 8 files changed, 181 insertions(+), 53 deletions(-)
>
>
> Note:Issue is valid for a restartable SU only.
>
> When RESTART operation is invoked on a restartable SU, its presence state
> transtions:
> INSTANTIATED => RESTARTING => INSTANTIATING => INSTANTIATED.
> which is incorrect as per AIS-AMF-B.04.01-Table 5 Page 74.
>
> At present, when all the components are in RESTARTING state, SU is marked as
> RESTARTING.
> As soon as AMF starts instantiating first comp by keeping it in RESTARTING
> state,
> AMF is marking SU INSTANTIATING. Here AMF must wait for the instantiation of
> component
> and should not mark SU INSTANTIATING. When first comp gets successfully
> instantiated,
> AMF imust mark first comp INSTANTIATED and SU will also be marked
> INSTANTIATED as per
> AIS-AMF-B.04.01-Table 5 Page 74.
>
> Patch fixes the problem by marking the SU INSTANTIATED as soons as first
> component
> enters into INSTANTIATED state. During the instantiation of other
> components, SU will
> remain in INSTANTIATED state. AMF will reply to IMM for the operation when
> all the components
> enters into INSTATANTIATED state.
>
> diff --git a/osaf/services/saf/amf/amfd/comp.cc
> b/osaf/services/saf/amf/amfd/comp.cc
> --- a/osaf/services/saf/amf/amfd/comp.cc
> +++ b/osaf/services/saf/amf/amfd/comp.cc
> @@ -1711,3 +1711,13 @@ SaAisErrorT check_comp_stability(const A
> }
> return SA_AIS_OK;
> }
> +/**
> + * @brief CHeck if component is SA_AWARE.
> + * @Return true/false.
> + */
> +bool AVD_COMP::saaware()
> +{
> + AVD_COMP_TYPE *comptype =
> comptype_db->find(Amf::to_string(&saAmfCompType));
> + return (IS_COMP_SAAWARE(comptype->saAmfCtCompCategory));
> +}
> +
> diff --git a/osaf/services/saf/amf/amfd/include/comp.h
> b/osaf/services/saf/amf/amfd/include/comp.h
> --- a/osaf/services/saf/amf/amfd/include/comp.h
> +++ b/osaf/services/saf/amf/amfd/include/comp.h
> @@ -125,6 +125,7 @@ class AVD_COMP {
>
> void set_assigned(bool assigned) {assign_flag = assigned;}
> bool assigned() const {return assign_flag;}
> + bool saaware();
> private:
> void initialize();
> // disallow copy and assign
> diff --git a/osaf/services/saf/amf/amfd/include/su.h
> b/osaf/services/saf/amf/amfd/include/su.h
> --- a/osaf/services/saf/amf/amfd/include/su.h
> +++ b/osaf/services/saf/amf/amfd/include/su.h
> @@ -145,7 +145,9 @@ class AVD_SU {
> bool is_any_non_restartable_comp_assigned();
> bool all_pi_comps_restartable();
> bool all_pi_comps_nonrestartable();
> -
> + SaAmfAdminOperationIdT get_admin_op_id();
> + bool all_comps_in_presence_state(SaAmfPresenceStateT pres);
> +
> private:
> void initialize();
> void send_attribute_update(AVSV_AMF_SU_ATTR_ID attrib_id);
> diff --git a/osaf/services/saf/amf/amfd/ndproc.cc
> b/osaf/services/saf/amf/amfd/ndproc.cc
> --- a/osaf/services/saf/amf/amfd/ndproc.cc
> +++ b/osaf/services/saf/amf/amfd/ndproc.cc
> @@ -369,20 +369,18 @@ static void surestart_admin_op_report_to
> if ((su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_INSTANTIATED) &&
> (pres != SA_AMF_PRESENCE_RESTARTING))
> rc = SA_AIS_ERR_BAD_OPERATION;
> - else if ((su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_RESTARTING) &&
> - (pres != SA_AMF_PRESENCE_INSTANTIATING))
> - rc = SA_AIS_ERR_BAD_OPERATION;
> - else if (su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_INSTANTIATING) {
> - if (pres == SA_AMF_PRESENCE_INSTANTIATED)
> - rc = SA_AIS_OK;
> + else if ((su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_RESTARTING) &&
> + (pres != SA_AMF_PRESENCE_INSTANTIATED))
> + rc = SA_AIS_ERR_REPAIR_PENDING;
> + else if (pres == SA_AMF_PRESENCE_INSTANTIATED) {
> + if
> (su->all_comps_in_presence_state(SA_AMF_PRESENCE_INSTANTIATED) == true)
> + rc = SA_AIS_OK;
> else
> - rc = SA_AIS_ERR_REPAIR_PENDING;
> - } else if ((pres == SA_AMF_PRESENCE_RESTARTING) ||
> - (pres == SA_AMF_PRESENCE_INSTANTIATING)) {
> + goto done;
> + } else if (pres == SA_AMF_PRESENCE_RESTARTING) {
> TRACE("Valid state transition, wait for final
> transition.");
> goto done;
> }
> -
> } else {
> if ((su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_INSTANTIATED) &&
> (pres != SA_AMF_PRESENCE_TERMINATING))
> @@ -795,6 +793,12 @@ void avd_data_update_req_evh(AVD_CL_CB *
> if (comp->admin_pend_cbk.invocation
> != 0)
>
> comp_admin_op_report_to_imm(comp, static_cast<SaAmfPresenceStateT>(l_val));
> avd_comp_pres_state_set(comp,
> static_cast<SaAmfPresenceStateT>(l_val));
> +
> + if ((comp->su->get_admin_op_id() ==
> SA_AMF_ADMIN_RESTART) &&
> + (comp->saAmfCompPresenceState ==
> SA_AMF_PRESENCE_INSTANTIATED) &&
> + (comp->su->saAmfSUPresenceState ==
> SA_AMF_PRESENCE_INSTANTIATED) &&
> +
> (comp->su->all_comps_in_presence_state(SA_AMF_PRESENCE_INSTANTIATED) ==
> true))
> +
> comp->su->complete_admin_op(SA_AIS_OK);
> } else {
> /* log error that a the value len
> is invalid */
> LOG_ER("%s:%u: %u", __FILE__,
> __LINE__, n2d_msg->msg_info.n2d_data_req.param_info.
> diff --git a/osaf/services/saf/amf/amfd/su.cc
> b/osaf/services/saf/amf/amfd/su.cc
> --- a/osaf/services/saf/amf/amfd/su.cc
> +++ b/osaf/services/saf/amf/amfd/su.cc
> @@ -2363,4 +2363,22 @@ bool AVD_SU::all_pi_comps_nonrestartable
> }
> return true;
> }
> +/**
> + * @brief Returns Operation Id of the admin operation on SU.
> + */
> +SaAmfAdminOperationIdT AVD_SU::get_admin_op_id()
> +{ return pend_cbk.admin_oper; }
>
> +/**
> + * @brief Checks if all comps of SU are in a given presnece state.
> + * @return true/false
> + */
> +bool AVD_SU::all_comps_in_presence_state(SaAmfPresenceStateT pres)
> +{
> + auto iter = std::find_if (list_of_comp.begin(), list_of_comp.end(),
> + [&](AVD_COMP *comp) -> bool { return
> comp->saAmfCompPresenceState != pres;});
> + if (iter == list_of_comp.end())
> + return true;
> + return false;
> +}
> +
> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_su.h
> b/osaf/services/saf/amf/amfnd/include/avnd_su.h
> --- a/osaf/services/saf/amf/amfnd/include/avnd_su.h
> +++ b/osaf/services/saf/amf/amfnd/include/avnd_su.h
> @@ -418,4 +418,6 @@ bool su_all_comps_restartable(const AVND
> void su_send_suRestart_recovery_msg(AVND_SU *su);
> bool pi_su_all_comps_uninstantiated (const AVND_SU& su);
> bool is_any_non_restartable_comp_assigned(const AVND_SU& su);
> +bool su_all_pi_comps_instantiated(const AVND_SU *su);
> +bool all_csis_in_assigned_state(const AVND_SU *su);
> #endif
> diff --git a/osaf/services/saf/amf/amfnd/su.cc
> b/osaf/services/saf/amf/amfnd/su.cc
> --- a/osaf/services/saf/amf/amfnd/su.cc
> +++ b/osaf/services/saf/amf/amfnd/su.cc
> @@ -838,3 +838,14 @@ bool is_any_non_restartable_comp_assigne
> return false;
> }
>
> +/**
> + * @brief Checks if all PI comps of SU are in INSTANTIATED state.
> + * @return true/false
> + */
> +bool su_all_pi_comps_instantiated(const AVND_SU *su)
> +{
> + bool su_is_instantiated;
> + m_AVND_SU_IS_INSTANTIATED(su, su_is_instantiated);
> + TRACE("All PI comps instantiated :'%u'",su_is_instantiated);
> + return su_is_instantiated;
> +}
> diff --git a/osaf/services/saf/amf/amfnd/susm.cc
> b/osaf/services/saf/amf/amfnd/susm.cc
> --- a/osaf/services/saf/amf/amfnd/susm.cc
> +++ b/osaf/services/saf/amf/amfnd/susm.cc
> @@ -45,6 +45,7 @@ static uint32_t avnd_su_pres_inst_suterm
> static uint32_t avnd_su_pres_inst_surestart_hdler(AVND_CB *, AVND_SU *,
> AVND_COMP *);
> static uint32_t avnd_su_pres_inst_comprestart_hdler(AVND_CB *, AVND_SU *,
> AVND_COMP *);
> static uint32_t avnd_su_pres_inst_compterming_hdler(AVND_CB *, AVND_SU *,
> AVND_COMP *);
> +static uint32_t avnd_su_pres_inst_compinst_hdler(AVND_CB *cb, AVND_SU *su,
> AVND_COMP *comp);
> static uint32_t avnd_su_pres_terming_compinst_hdler(AVND_CB *, AVND_SU *,
> AVND_COMP *);
> static uint32_t avnd_su_pres_terming_comptermfail_hdler(AVND_CB *, AVND_SU
> *, AVND_COMP *);
> static uint32_t avnd_su_pres_terming_compuninst_hdler(AVND_CB *, AVND_SU *,
> AVND_COMP *);
> @@ -96,7 +97,7 @@ static AVND_SU_PRES_FSM_FN avnd_su_pres_
> 0, /* SU INST */
> avnd_su_pres_inst_suterm_hdler, /* SU TERM */
> avnd_su_pres_inst_surestart_hdler, /* SU RESTART */
> - 0, /* COMP INSTANTIATED */
> + avnd_su_pres_inst_compinst_hdler, /* COMP INSTANTIATED */
> avnd_su_pres_inst_compinstfail_hdler, /* COMP INST_FAIL */
> avnd_su_pres_inst_comprestart_hdler, /* COMP RESTARTING */
> avnd_su_pres_terming_comptermfail_hdler, /* COMP TERM_FAIL */
> @@ -1562,7 +1563,8 @@ uint32_t avnd_su_pres_fsm_run(AVND_CB *c
>
>
> /**
> - * @brief Reset flags when a NPI SU moves from INSTANTIATING to
> INSTANTIATED state.
> + * @brief Reset flags when a NPI SU moves from INSTANTIATING/RESTARTING
> + * to INSTANTIATED state.
> * @param su
> * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> */
> @@ -1591,7 +1593,8 @@ static uint32_t npi_su_instantiating_to_
>
>
> /**
> - * @brief Reset flags when a PI SU moves from Instantiating to
> INSTANTIATED state.
> + * @brief Reset flags when a PI SU moves from INSTANTIATING/RESTARTING
> + * to INSTANTIATED state.
> * @param su
> * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
> */
> @@ -1670,7 +1673,8 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> TRACE("PI SU :'%s'",su->name.value);
> /* instantiating/restarting -> instantiated */
> if (((SA_AMF_PRESENCE_INSTANTIATING == prv_st) ||
> (SA_AMF_PRESENCE_RESTARTING == prv_st))
> - && (SA_AMF_PRESENCE_INSTANTIATED ==
> final_st)) {
> + && (SA_AMF_PRESENCE_INSTANTIATED ==
> final_st) &&
> + (su_all_pi_comps_instantiated(su) == true))
> {
> rc = pi_su_instantiating_to_instantiated(su);
> if (NCSCC_RC_SUCCESS != rc)
> goto done;
> @@ -1800,7 +1804,8 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>
> /* instantiating/restarting -> instantiated */
> if (((SA_AMF_PRESENCE_INSTANTIATING == prv_st) ||
> (SA_AMF_PRESENCE_RESTARTING == prv_st))
> - && (SA_AMF_PRESENCE_INSTANTIATED ==
> final_st)) {
> + && (SA_AMF_PRESENCE_INSTANTIATED ==
> final_st) &&
> + (all_csis_in_assigned_state(su) == true)) {
> rc = npi_su_instantiating_to_instantiated(su);
> }
> /* instantiating/instantiated/restarting -> inst-failed */
> @@ -2749,25 +2754,26 @@ uint32_t avnd_su_pres_terming_comptermfa
> *
> * @returns true/false
> **/
> -static bool all_csis_in_assigned_state(const AVND_SU *su)
> +bool all_csis_in_assigned_state(const AVND_SU *su)
> {
> + TRACE_ENTER2("'%s'",su->name.value);
> AVND_COMP_CSI_REC *curr_csi;
> AVND_SU_SI_REC *curr_si;
> - bool all_csi_removed = true;
> + bool all_csi_assigned = true;
>
> for (curr_si = (AVND_SU_SI_REC
> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
> - curr_si && all_csi_removed;
> + curr_si && all_csi_assigned;
> curr_si = (AVND_SU_SI_REC
> *)m_NCS_DBLIST_FIND_NEXT(&curr_si->su_dll_node)) {
> for (curr_csi = (AVND_COMP_CSI_REC
> *)m_NCS_DBLIST_FIND_FIRST(&curr_si->csi_list);
> curr_csi; curr_csi = (AVND_COMP_CSI_REC
> *)m_NCS_DBLIST_FIND_NEXT(&curr_csi->si_dll_node)) {
> if
> (!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi)) {
> - all_csi_removed= false;
> + all_csi_assigned = false;
> break;
> }
> }
> }
> -
> - return all_csi_removed;
> + TRACE_LEAVE2("all_csi_assigned:%u",all_csi_assigned);
> + return all_csi_assigned;
> }
>
>
> /***************************************************************************
> *
> @@ -3071,7 +3077,6 @@ uint32_t avnd_su_pres_restart_comprestar
> goto done;
> }
> }
> - avnd_su_pres_state_set(su, SA_AMF_PRESENCE_INSTANTIATING);
> done:
> TRACE_LEAVE();
> return rc;
> @@ -3094,43 +3099,43 @@ uint32_t avnd_su_pres_restart_compinst_h
> {
> AVND_COMP *curr_comp = 0;
> AVND_COMP_CSI_REC *curr_csi = 0;
> - bool all_inst = true;
> uint32_t rc = NCSCC_RC_SUCCESS;
> const char *compname = comp ? (char*)comp->name.value : "none";
> TRACE_ENTER2("ComponentInstantiated event in the Restarting
> state:'%s' : '%s'",
> su->name.value, compname);
> -
> + SaAmfPresenceStateT pres_init = su->pres;
> /*
> - * If pi su, pick the next pi comp & trigger it's FSM with
> RestartEv.
> + * If pi su, pick the next pi comp & trigger it's FSM with Inst
> Event.
> */
> if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
> + TRACE("PI SU:'%s'", su->name.value);
> + /* Mark SU instantiated if atleast one PI comp is in
> instantiated state.*/
> + for (curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
> + curr_comp && (su->pres !=
> SA_AMF_PRESENCE_INSTANTIATED);
> + curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_n
> ode))) {
> + if ((curr_comp->pres ==
> SA_AMF_PRESENCE_INSTANTIATED) &&
> +
> (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)))
> + avnd_su_pres_state_set(su,
> SA_AMF_PRESENCE_INSTANTIATED);
> + }
> for (curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&comp->su_dll_node))
> ;
> - curr_comp;
> - curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_n
> ode))) {
> - TRACE("PI SU:'%s'", su->name.value);
> - /* restart the pi comp */
> + curr_comp;
> + curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_n
> ode))) {
> + if (curr_comp->pres == SA_AMF_PRESENCE_INSTANTIATED)
> + continue;
> if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)
> &&
> + (curr_comp->pres ==
> SA_AMF_PRESENCE_RESTARTING) &&
> (m_AVND_SU_IS_RESTART(su))) {
> - rc = avnd_comp_clc_fsm_run(cb, curr_comp,
> AVND_COMP_CLC_PRES_FSM_EV_RESTART);
> + rc = avnd_comp_clc_fsm_run(cb, curr_comp,
> AVND_COMP_CLC_PRES_FSM_EV_INST);
> if (NCSCC_RC_SUCCESS != rc)
> goto done;
> break;
> }
> } /* for */
>
> - /* check whether all comp's are instantiated */
> - for (curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list));
> - curr_comp;
> - curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_n
> ode))) {
> - if ((curr_comp->pres !=
> SA_AMF_PRESENCE_INSTANTIATED) &&
> -
> (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)))
> - all_inst = false;
> - }
> -
> - /* OK, all are instantiated */
> - if (all_inst == true) {
> - avnd_su_pres_state_set(su,
> SA_AMF_PRESENCE_INSTANTIATED);
> - }
> + /*If all comps are instantiated then reassign the SU execpt
> in a single comp case.*/
> + if ((pres_init == SA_AMF_PRESENCE_INSTANTIATED) &&
> + (su_all_pi_comps_instantiated(su) == true))
> + rc = pi_su_instantiating_to_instantiated(su);
> }
>
> /*
> @@ -3145,28 +3150,28 @@ uint32_t avnd_su_pres_restart_compinst_h
> /* mark the csi state assigned */
> m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
> m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi,
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
> + if (su->pres != SA_AMF_PRESENCE_INSTANTIATED)
> + avnd_su_pres_state_set(su,
> SA_AMF_PRESENCE_INSTANTIATED);
>
> /* get the next csi */
> curr_csi = (AVND_COMP_CSI_REC
> *)m_NCS_DBLIST_FIND_NEXT(&curr_csi->si_dll_node);
>
> /* Restart next component associated with unassigned CSI and
> if the component
> is not already in RESTARTING state.
> - TODO: SU FSM in restarting state should also not restart
> a component which
> - is in INSTANTIATING state.
> */
> if ((curr_csi != NULL) &&
> -
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(curr_csi) == true) &&
> - (curr_csi->comp->pres != SA_AMF_PRESENCE_RESTARTING)
> &&
> +
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_RESTARTING(curr_csi) == true) &&
> (m_AVND_SU_IS_RESTART(su))) {
> - /* we have another csi. trigger the comp fsm with
> RestartEv */
> + /* we have another csi. trigger the comp fsm with
> Inst event*/
> rc = avnd_comp_clc_fsm_trigger(cb, curr_csi->comp,
> -
> AVND_COMP_CLC_PRES_FSM_EV_RESTART);
> +
> AVND_COMP_CLC_PRES_FSM_EV_INST);
> if (NCSCC_RC_SUCCESS != rc)
> goto done;
> - } else if (all_csis_in_assigned_state(su) == true) {
> - /* => si assignment done */
> - avnd_su_pres_state_set(su,
> SA_AMF_PRESENCE_INSTANTIATED);
> }
> + /*If all comps are instantiated then reset SU params.*/
> + if ((pres_init == SA_AMF_PRESENCE_INSTANTIATED) &&
> + (all_csis_in_assigned_state(su) == true))
> + rc = npi_su_instantiating_to_instantiated(su);
> }
>
> done:
> @@ -3662,3 +3667,78 @@ uint32_t avnd_su_pres_terming_suinst_hdl
> TRACE_LEAVE2("%u", rc);
> return rc;
> }
> +
> +/**
> + * @brief During restart admin op on SU, a SU enters into INSTANTIATED
> state
> + * as soon as the first component is succesfully instantiated. For
> all other
> + * components in SU, this handler will take care of their
> instantiation honoring
> + * instantiation-level.
> + * @param ptr to avnd_cb.
> + * @param ptr to su.
> + * @param ptr to comp.
> + * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
> + */
> +uint32_t avnd_su_pres_inst_compinst_hdler(AVND_CB *cb, AVND_SU *su,
> AVND_COMP *comp)
> +{
> + AVND_COMP *curr_comp = 0;
> + AVND_COMP_CSI_REC *curr_csi = 0;
> + uint32_t rc = NCSCC_RC_SUCCESS;
> + const char *compname = comp ? (char*)comp->name.value : "none";
> + TRACE_ENTER2("Component Instantiated event in the Instantiated
> state:'%s' : '%s'",
> + su->name.value, compname);
> +
> + if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
> + TRACE("PI SU");
> + for (curr_comp =
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&comp->su_dll_node))
> ;
> + curr_comp;
> + curr_comp =
> +
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_n
> ode))) {
> + if (curr_comp->pres == SA_AMF_PRESENCE_INSTANTIATED)
> + continue;
> + if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)
> &&
> + (curr_comp->pres ==
> SA_AMF_PRESENCE_RESTARTING) &&
> + (m_AVND_SU_IS_RESTART(su))) {
> + TRACE("Running the component clc FSM for
> '%s'", curr_comp->name.value);
> + rc = avnd_comp_clc_fsm_run(cb, curr_comp,
> AVND_COMP_CLC_PRES_FSM_EV_INST);
> + if (NCSCC_RC_SUCCESS != rc)
> + goto done;
> + break;
> + }
> + }
> + if (su_all_pi_comps_instantiated(su) == true)
> + rc = pi_su_instantiating_to_instantiated(su);
> + }
> +
> + if (!m_AVND_SU_IS_PREINSTANTIABLE(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_lis
> t));
> + osafassert(curr_csi);
> +
> + m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
> + m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi,
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
> +
> + if (su->pres != SA_AMF_PRESENCE_INSTANTIATED)
> + avnd_su_pres_state_set(su,
> SA_AMF_PRESENCE_INSTANTIATED);
> +
> + /* get the next csi */
> + curr_csi = (AVND_COMP_CSI_REC
> *)m_NCS_DBLIST_FIND_NEXT(&curr_csi->si_dll_node);
> + if ((curr_csi != NULL) &&
> +
> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_RESTARTING(curr_csi) == true) &&
> + (m_AVND_SU_IS_RESTART(su))) {
> + /* we have another csi. trigger the comp fsm with
> InstEv */
> + TRACE("There's another CSI:'%s', Running the
> component clc FSM for comp:'%s'",
> +
> curr_csi->name.value,curr_csi->comp->name.value);
> + rc = avnd_comp_clc_fsm_trigger(cb, curr_csi->comp,
> AVND_COMP_CLC_PRES_FSM_EV_INST);
> + if (NCSCC_RC_SUCCESS != rc)
> + goto done;
> + }
> + /*If all comps are instantiated then reset SU params.*/
> + if (all_csis_in_assigned_state(su) == true) {
> + rc = npi_su_instantiating_to_instantiated(su);
> + }
> + }
> +done:
> + TRACE_LEAVE2("%u", rc);
> + return rc;
> +}
>
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel