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