osaf/services/saf/amf/amfnd/cbq.cc | 31 +++++++++++++++++++++--- osaf/services/saf/amf/amfnd/comp.cc | 14 ++++++++++- osaf/services/saf/amf/amfnd/err.cc | 12 +++++++++ osaf/services/saf/amf/amfnd/include/avnd_comp.h | 1 + 4 files changed, 53 insertions(+), 5 deletions(-)
During appl termination, amf issues instantiate cmd immediately after it receives appl termination resp. There is possibility that application may not have exited before Amf issues instantiate cmd and instantiate command may hang. So, Amf need to wait till appl exit after Amf receives termination response. If appl doesnot exit within termination cbk timeout, then Amf sends cleanup command. If there is some fault(like error report) happened after appl sends term resp and before application exits, Amf will take actions accordingly. diff --git a/osaf/services/saf/amf/amfnd/cbq.cc b/osaf/services/saf/amf/amfnd/cbq.cc --- a/osaf/services/saf/amf/amfnd/cbq.cc +++ b/osaf/services/saf/amf/amfnd/cbq.cc @@ -376,10 +376,22 @@ uint32_t avnd_evt_ava_resp_evh(AVND_CB * m_AVND_COMP_TERM_FAIL_SET(comp); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, AVND_CKPT_COMP_FLAG_CHANGE); } - - rc = avnd_comp_clc_fsm_run(cb, comp, (SA_AIS_OK == resp->err) ? - AVND_COMP_CLC_PRES_FSM_EV_TERM_SUCC : AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); - avnd_comp_cbq_rec_pop_and_del(cb, comp, cbk_rec, false); + /* For successful response from (1.) Sa-Aware PI component, wait + for down event to come, don't run clc here, run clc when down + event comes. (2.) proxied PI, no down event + expected, so run clc here. In case of failure response from + any body, follow the clc. No need to check for PI along with + proxied, because in case of PI only, term response will come + back from component. */ + if((SA_AIS_OK == resp->err) && (!m_AVND_COMP_TYPE_IS_PROXIED(comp))) { + /* Save invocation value to delete cbq record when + down event comes. */ + comp->term_cbq_inv_value = resp->inv; + } else { + rc = avnd_comp_clc_fsm_run(cb, comp, (SA_AIS_OK == resp->err) ? + AVND_COMP_CLC_PRES_FSM_EV_TERM_SUCC : AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); + avnd_comp_cbq_rec_pop_and_del(cb, comp, cbk_rec, false); + } // if all OK send a response to the client if ((rc == NCSCC_RC_SUCCESS) && (resp->err == SA_AIS_OK)) { @@ -563,6 +575,17 @@ uint32_t avnd_evt_tmr_cbk_resp_evh(AVND_ } else if (AVSV_AMF_COMP_TERM == rec->cbk_info->type) { m_AVND_COMP_TERM_FAIL_SET(rec->comp); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, rec->comp, AVND_CKPT_COMP_FLAG_CHANGE); + if (rec->comp->term_cbq_inv_value != 0) { + AVND_COMP_CBK *cbk_rec; + /* Since, the cbq timer has expired and no down event + came, get the matching entry from the cbk list and + delete the cbq. */ + m_AVND_COMP_CBQ_INV_GET(rec->comp, rec->comp->term_cbq_inv_value, cbk_rec); + rec->comp->term_cbq_inv_value = 0; + if (cbk_rec) { + avnd_comp_cbq_rec_pop_and_del(cb, rec->comp, cbk_rec, false); + } + } rc = avnd_comp_clc_fsm_run(cb, rec->comp, AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); } else { switch (rec->cbk_info->type) { diff --git a/osaf/services/saf/amf/amfnd/comp.cc b/osaf/services/saf/amf/amfnd/comp.cc --- a/osaf/services/saf/amf/amfnd/comp.cc +++ b/osaf/services/saf/amf/amfnd/comp.cc @@ -381,12 +381,24 @@ uint32_t avnd_evt_mds_ava_dn_evh(AVND_CB } /* for */ if (comp) { + if (comp->term_cbq_inv_value != 0) { + AVND_COMP_CBK *cbk_rec; + /* Amf was waiting for this down event. Get the matching + entry from the cbk list and delete the cbq */ + m_AVND_COMP_CBQ_INV_GET(comp, comp->term_cbq_inv_value, cbk_rec); + comp->term_cbq_inv_value = 0; + rc = avnd_comp_clc_fsm_run(cb, comp, AVND_COMP_CLC_PRES_FSM_EV_TERM_SUCC); + if (cbk_rec) + avnd_comp_cbq_rec_pop_and_del(cb, comp, cbk_rec, false); + goto done; + } /* found the matching comp; trigger error processing */ err_info.src = AVND_ERR_SRC_AVA_DN; err_info.rec_rcvr.avsv_ext = static_cast<AVSV_ERR_RCVR>(comp->err_info.def_rec); rc = avnd_err_process(cb, comp, &err_info); } +done: /* pg tracking may be started by this ava... delete those traces */ avnd_pg_finalize(cb, 0, &mds_evt->mds_dest); @@ -673,7 +685,7 @@ uint32_t avnd_comp_reg_prc(AVND_CB *cb, bool su_is_enabled; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("comp: '%s'", comp->name.value); - + if (pxy_comp) TRACE("proxy comp = '%s'", pxy_comp->name.value); diff --git a/osaf/services/saf/amf/amfnd/err.cc b/osaf/services/saf/amf/amfnd/err.cc --- a/osaf/services/saf/amf/amfnd/err.cc +++ b/osaf/services/saf/amf/amfnd/err.cc @@ -320,6 +320,18 @@ uint32_t avnd_err_process(AVND_CB *cb, A const uint32_t previous_esc_rcvr = esc_rcvr; + /* If Amf was waiting for down event to come regarding term cbq, but + error has occurred, so reset the variable (irrespective of Sa-Aware + PI or Proxied PI)*/ + if (comp->term_cbq_inv_value != 0) { + AVND_COMP_CBK *cbk_rec; + /* get the matching entry from the cbk list */ + m_AVND_COMP_CBQ_INV_GET(comp, comp->term_cbq_inv_value, cbk_rec); + comp->term_cbq_inv_value = 0; + if (cbk_rec) + avnd_comp_cbq_rec_pop_and_del(cb, comp, cbk_rec, false); + } + // Handle errors differently when shutdown has started if (AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED == cb->term_state) { LOG_NO("'%s' faulted due to '%s'", comp->name.value, g_comp_err[err_info->src]); diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h b/osaf/services/saf/amf/amfnd/include/avnd_comp.h --- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h @@ -390,6 +390,7 @@ typedef struct avnd_comp_tag { saAmfComponentErrorReport() or saAmfComponentErrorReport_4()*/ std::bitset<NumAttrs> *use_comptype_attr; + SaInvocationT term_cbq_inv_value; /* invocation value for termination callback. */ } AVND_COMP; ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel