osaf/services/saf/amf/amfnd/clc.cc | 38 +++++++++++++++++++++++++++++-------
osaf/services/saf/amf/amfnd/susm.cc | 24 ++++++++++++++++++++++-
2 files changed, 53 insertions(+), 9 deletions(-)
When proxy and proxied are in the same SU and if proxy
fails and SU restart is escalated, then proxied are not being
cleaned up.
Added cleanup commands for proxied component if their proxy are not
in healthy state.
Also, during opensafd stop, opensafd is not able to terminate the proxy.
Added fix for this also.
diff --git a/osaf/services/saf/amf/amfnd/clc.cc
b/osaf/services/saf/amf/amfnd/clc.cc
--- a/osaf/services/saf/amf/amfnd/clc.cc
+++ b/osaf/services/saf/amf/amfnd/clc.cc
@@ -2020,26 +2020,48 @@ uint32_t avnd_comp_clc_inst_clean_hdler(
if (m_AVND_COMP_TYPE_IS_PROXIED(comp)) {
avnd_comp_cbq_del(cb, comp, true);
- /* call the cleanup callback */
- rc = avnd_comp_cbk_send(cb, comp, AVSV_AMF_PXIED_COMP_CLEAN, 0,
0);
+ /* Check whether
+ 1. it is a case of SU restart escalation.
+ 2. it is a case of proxy-proxied residing in the same SU.
+ 3. the proxy of this component is in good state to accept
the callback.*/
+
+ /* Check if the proxy and proxied components are in the same
SUs. */
+ if ((m_AVND_SU_IS_RESTART(comp->su) &&
m_AVND_SU_IS_FAILED(comp->su)) && /* #1. */
+ ((comp->pxy_comp) && (comp->su ==
comp->pxy_comp->su)) && /* #2 */
+ (m_AVND_COMP_IS_FAILED(comp->pxy_comp))) { /*
#3 */
+ /* If proxy is not in good shape, we can't issue
callback, so issue cleanup
+ (assume it is local component). */
+ rc = avnd_comp_clc_cmd_execute(cb, comp,
AVND_COMP_CLC_CMD_TYPE_CLEANUP);
+ } else {
+ /* call the cleanup callback */
+ rc = avnd_comp_cbk_send(cb, comp,
AVSV_AMF_PXIED_COMP_CLEAN, 0, 0);
+ }
} else if (m_AVND_COMP_TYPE_IS_PROXY(comp) && comp->pxied_list.n_nodes)
{
/* if there are still outstanding proxied components we can't
terminate right now */
/* Check if the proxy and proxied components are in the same
SUs. */
TRACE("Proxy has proxied components: %u",
comp->pxied_list.n_nodes);
AVND_COMP_PXIED_REC *rec;
rec = (AVND_COMP_PXIED_REC
*)m_NCS_DBLIST_FIND_FIRST(&comp->pxied_list);
- while (rec) {
- if (comp->su == rec->pxied_comp->su)
+ while (rec) {
+ if (comp->su == rec->pxied_comp->su)
break;
- rec = (AVND_COMP_PXIED_REC
*)m_NCS_DBLIST_FIND_NEXT(&rec->comp_dll_node);
- }
+ rec = (AVND_COMP_PXIED_REC
*)m_NCS_DBLIST_FIND_NEXT(&rec->comp_dll_node);
+ }
if (rec == nullptr) {
TRACE("Proxy and proxied are not in the same SU.");
/* This means that proxy and proxied components are not
in the same SU.
That means that we can cleanup the component. */
rc = avnd_comp_clc_cmd_execute(cb, comp,
AVND_COMP_CLC_CMD_TYPE_CLEANUP);
- } else
- return rc;
+ } else {
+ TRACE("Proxy and proxied are in the same SU.");
+ if (((m_AVND_SU_IS_RESTART(comp->su) &&
m_AVND_SU_IS_FAILED(comp->su)) &&
+ (m_AVND_COMP_IS_FAILED(comp)))
||
+ (cb->term_state ==
AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED)) {
+ /* If proxy is not in good shape, so issue
cleanup. */
+ rc = avnd_comp_clc_cmd_execute(cb, comp,
AVND_COMP_CLC_CMD_TYPE_CLEANUP);
+ } else
+ goto done;
+ }
} else {
if (m_AVND_SU_IS_RESTART(comp->su) &&
m_AVND_COMP_IS_RESTART_DIS(comp) &&
(comp->csi_list.n_nodes > 0) &&
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
@@ -2601,8 +2601,30 @@ uint32_t avnd_su_pres_inst_comprestart_h
if (NCSCC_RC_SUCCESS != rc)
goto done;
break;
+ } else {
+ /*
+ For a NPI comp in SU, component FSM is
always triggered
+ at the time of assignments. If this
component is
+ non-restartable then start reassginment from
the
+ whole SU now.
+ */
+ if (m_AVND_COMP_IS_RESTART_DIS(curr_comp) &&
+ (curr_comp->csi_list.n_nodes >
0)) {
+ TRACE("Start reassignment to different
SU as '%s' is"
+ " not restartable",
curr_comp->name.c_str());
+ su_send_suRestart_recovery_msg(su);
+ goto done;
+ } else {
+ if (m_AVND_SU_IS_RESTART(su) &&
m_AVND_SU_IS_FAILED(su))
+ rc = avnd_comp_clc_fsm_run(cb,
curr_comp, AVND_COMP_CLC_PRES_FSM_EV_CLEANUP);
+ else
+ rc = avnd_comp_clc_fsm_run(cb,
curr_comp, AVND_COMP_CLC_PRES_FSM_EV_RESTART);
+ if (curr_comp->pres ==
SA_AMF_PRESENCE_TERMINATING)
+ avnd_su_pres_state_set(cb, su,
SA_AMF_PRESENCE_TERMINATING);
+ break;
+ }
}
- }
+ }
if (su_evaluate_restarting_state(su) == true)
avnd_su_pres_state_set(cb, su,
SA_AMF_PRESENCE_RESTARTING);
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel