Thanks for the explanation. My query was independent of the mail thread and Was generic to understand what 'delayed failover' terminology meant during the fault scenarios! I probably wanted to state that a solution that does not isolates the faulty resource once a fault is detected, would be against the general requirements of the fault management cycle!
Cheers, Mathi. >-----Original Message----- >From: Gary Lee [mailto:gary....@dektech.com.au] >Sent: Wednesday, March 02, 2016 4:30 PM >To: Mathivanan Naickan Palanivelu >Cc: minh.c...@dektech.com.au; opensaf-devel@lists.sourceforge.net; >Nagendra Kumar; Praveen Malviya; hans.nordeb...@ericsson.com >Subject: Re: [devel] [PATCH 04 of 15] amfnd: Add support for cloud resilience >at node director [#1620] > >Hi Mathi > >I think Minh has previously said "delayed failover" isn't the best >description of what patch 6 is doing. >Minh has previously described it better as "adjust HA assignment"; >moving transient states to states that >realign() can work with. The transient states aren't necessarily >caused by a component error. The SCs could have just disappeared in >the middle of an operation. An alternative is to reboot payloads >associated with the transient states which seems unnecessary given the >payload is otherwise healthy. > >Thanks >Gary > > >Quoting Mathivanan Naickan Palanivelu <mathi.naic...@oracle.com>: > >> Hi All, >> >> What is 'delayed failover'? That sounds against the principles of >> 'software fault isolation'!? >> >> Thanks, >> Mathi. >> >> ----- minh.c...@dektech.com.au wrote: >> >>> Hi Praveen, >>> >>> Please see comments in line [Minh] >>> >>> Thanks, >>> Minh >>> >>> On 02/03/16 18:12, praveen malviya wrote: >>> > >>> > >>> > On 02-Mar-16 12:26 PM, minh chau wrote: >>> >> Hi Praveen, >>> >> >>> >> If node_up of amfnd comes after node sync timer expires, amfd will >>> send >>> >> reboot message to that amfnd, regardless of susi states. >>> >> Sending reboot message in avd_comp_pres_state_set() if comp is >>> >> inst/term-failed has already been in code base of #1620. >>> >> The change in #1620 that marks *node->reboot = true* in >>> >> avd_comp_pres_state_set(), which should be called when amfd >>> recreate >>> >> compcsi(s) from all amfnd after headless >>> >> Then in avd_node_up_evh(), the node that is marked "reboot" as >>> true, >>> >> will be rebooted. >>> >> In other words, if any comps are dropped into inst/term-failed >>> state >>> >> during headless subjected to node-failfast, the node hosting >>> >> inst/term-failed su will be rebooted after headless. >>> >> >>> >> I guess one of your questions on V3 has related to this. >>> >> >>> > I did not mean the case of inst and term failed of su. >>> > The SUSI may be in transition state because of admin operations and >>> >>> > system becomes headless. So when first controller comes up, realign >>> >>> > logic will not be helpful and will not correct the state. >>> [Minh] You are right, and that's the reason we need the patch 06 - >>> Support delayed failover, that will help to move the SUSI to the >>> correct >>> state. >>> >>> Thanks, >>> Minh >>> > >>> > Thanks, >>> > Praveen >>> >> Thanks, >>> >> Minh >>> >> >>> >> On 02/03/16 17:17, praveen malviya wrote: >>> >>> Hi Minh, >>> >>> >>> >>> One query on patch 03. >>> >>> From headless state when first controller joins, in >>> >>> avd_cluster_tmr_init_evh(), SG is being realigned. During >>> realignment >>> >>> AMF will take care of new assignments but not of those SUSIs >>> whose >>> >>> FSMs are in transition state. >>> >>> Is AMF rebooting the node which hosts SUs of these SUSIs after >>> node >>> >>> sync timer expires? I am seeing reboot message being sent from >>> >>> avd_comp_pres_state_set() but I think that is not for this >>> purpose. >>> >>> >>> >>> >>> >>> Thanks, >>> >>> Praveen >>> >>> >>> >>> On 25-Feb-16 2:14 PM, Minh Hon Chau wrote: >>> >>>> osaf/services/saf/amf/amfnd/clc.cc | 100 +++-- >>> >>>> osaf/services/saf/amf/amfnd/clm.cc | 11 +- >>> >>>> osaf/services/saf/amf/amfnd/comp.cc | 42 ++- >>> >>>> osaf/services/saf/amf/amfnd/compdb.cc | 45 ++- >>> >>>> osaf/services/saf/amf/amfnd/di.cc | 419 >>> >>>> +++++++++++++++++++++++- >>> >>>> osaf/services/saf/amf/amfnd/err.cc | 112 +++++- >>> >>>> osaf/services/saf/amf/amfnd/evt.cc | 2 + >>> >>>> osaf/services/saf/amf/amfnd/hcdb.cc | 8 +- >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_cb.h | 13 +- >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_comp.h | 17 +- >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_di.h | 4 + >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_evt.h | 2 + >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_mds.h | 4 +- >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_proc.h | 1 + >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_su.h | 4 +- >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_tmr.h | 1 + >>> >>>> osaf/services/saf/amf/amfnd/include/avnd_util.h | 4 + >>> >>>> osaf/services/saf/amf/amfnd/main.cc | 103 +++++- >>> >>>> osaf/services/saf/amf/amfnd/mds.cc | 19 +- >>> >>>> osaf/services/saf/amf/amfnd/sidb.cc | 9 +- >>> >>>> osaf/services/saf/amf/amfnd/su.cc | 39 +- >>> >>>> osaf/services/saf/amf/amfnd/susm.cc | 103 +++-- >>> >>>> osaf/services/saf/amf/amfnd/tmr.cc | 1 + >>> >>>> osaf/services/saf/amf/amfnd/util.cc | 153 >>> ++++++++- >>> >>>> 24 files changed, 1059 insertions(+), 157 deletions(-) >>> >>>> >>> >>>> >>> >>>> Outline changes: >>> >>>> . amfnd does not reboot if amfd is down >>> >>>> . componentRestart and suRestart is supported, the node reboot >>> if >>> >>>> any escalation to component/su failover >>> >>>> . SC absence timer is introduced, node will reboot if timeout >>> >>>> . amfnd sends sync information if amfd is up after headless >>> >>>> >>> >>>> 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 >>> >>>> @@ -454,7 +454,7 @@ uint32_t >avnd_evt_comp_pres_fsm_evh(AVND >>> >>>> >>> >>>> if ((is_uninst == true) && >>> >>>> (comp->pres == SA_AMF_PRESENCE_INSTANTIATING)) >>> >>>> - avnd_su_pres_state_set(comp->su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, comp->su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> >>> >>>> done: >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -767,7 +767,7 @@ uint32_t avnd_comp_clc_fsm_run(AVND_CB >* >>> >>>> TRACE("Term state is NODE_FAILOVER, event '%s'", >>> >>>> pres_state_evt[ev]); >>> >>>> switch (ev) { >>> >>>> case AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_SUCC: >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> if (all_app_comps_terminated()) { >>> >>>> AVND_SU *tmp_su; >>> >>>> cb->term_state = >>> >>>> AVND_TERM_STATE_NODE_FAILOVER_TERMINATED; >>> >>>> @@ -924,8 +924,10 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> >>> >>>> TRACE_1("Component restart not through admin >>> operation"); >>> >>>> /* inform avd of the change in restart count */ >>> >>>> - avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompRestartCount_ID, >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompRestartCount_ID, >>> >>>> &comp->name, comp->err_info.restart_cnt); >>> >>>> + } >>> >>>> } >>> >>>> /* reset the admin-oper flag to false */ >>> >>>> if ((comp->admin_oper == true) && (final_st == >>> >>>> SA_AMF_PRESENCE_INSTANTIATED)) { >>> >>>> @@ -981,7 +983,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> (final_st == >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED))) { >>> >>>> /* instantiation failed.. log it */ >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_DISABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + } >>> >>>> m_AVND_COMP_FAILED_SET(comp); >>> >>>> } >>> >>>> >>> >>>> @@ -996,7 +1000,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> if (m_AVND_COMP_IS_FAILED(comp)) { >>> >>>> m_AVND_COMP_FAILED_RESET(comp); >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_ENABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, >>> rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> clear_error_report_alarm(comp); >>> >>>> @@ -1082,7 +1088,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> 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 (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> >>> >>>> @@ -1133,7 +1141,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> if (m_AVND_COMP_IS_FAILED(comp)) { >>> >>>> m_AVND_COMP_FAILED_RESET(comp); >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_ENABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, >>> rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> clear_error_report_alarm(comp); >>> >>>> @@ -1156,7 +1166,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> >>> >>>> /* update comp oper state */ >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_DISABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + } >>> >>>> >>> >>>> m_AVND_SU_FAILED_SET(comp->su); >>> >>>> /* csi-set Failed.. Respond failure for Su-Si */ >>> >>>> @@ -1175,7 +1187,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> if ((SA_AMF_PRESENCE_RESTARTING == prv_st) && >>> >>>> (SA_AMF_PRESENCE_INSTANTIATED == final_st)) { >>> >>>> m_AVND_COMP_FAILED_RESET(comp); >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_ENABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> clear_error_report_alarm(comp); >>> >>>> @@ -1189,7 +1203,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> 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 (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, >>> rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> } >>> >>>> @@ -1201,7 +1217,9 @@ uint32_t >avnd_comp_clc_st_chng_prc(AVND_ >>> >>>> (final_st == >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED))) { >>> >>>> m_AVND_COMP_FAILED_SET(comp); >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_DISABLED); >>> >>>> - m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc); >>> >>>> + } >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> } >>> >>>> @@ -1407,7 +1425,7 @@ uint32_t avnd_comp_clc_uninst_inst_hdler >>> >>>> } >>> >>>> >>> >>>> /* transition to 'instantiating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> >>> >>>> goto done; >>> >>>> } >>> >>>> @@ -1423,7 +1441,7 @@ uint32_t avnd_comp_clc_uninst_inst_hdler >>> >>>> comp->clc_info.inst_retry_cnt++; >>> >>>> >>> >>>> /* transition to 'instantiating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> @@ -1495,7 +1513,7 @@ uint32_t avnd_comp_clc_insting_instsucc_ >>> >>>> comp->clc_info.inst_retry_cnt = 0; >>> >>>> >>> >>>> /* transition to 'instantiated' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> @@ -1581,7 +1599,7 @@ uint32_t >avnd_comp_clc_insting_term_hdle >>> >>>> avnd_comp_pm_rec_del_all(cb, comp); /*if at all >>> anythnig >>> >>>> is left behind */ >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -1616,7 +1634,7 @@ uint32_t avnd_comp_clc_insting_clean_hdl >>> >>>> m_AVND_COMP_TERM_FAIL_RESET(comp); >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -1650,7 +1668,7 @@ static bool is_failed_comp_eligible_for_ >>> >>>> component was cleaned up in the context of >>> >>>> comp-restart recovery. >>> >>>> Since further escalation has reached to >>> surestart, >>> >>>> same cleanup can be used >>> >>>> and thus comp can be marked uninstantiated.*/ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(avnd_cb, comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> return false; >>> >>>> } >>> >>>> } else { //Case of RESTART admin op or assignment phase >>> of >>> >>>> surestart recovery. >>> >>>> @@ -1750,7 +1768,7 @@ uint32_t >avnd_comp_clc_xxxing_cleansucc_ >>> >>>> m_AVND_TMR_PXIED_COMP_INST_STOP(cb, *comp); >>> >>>> } >>> >>>> /* => retries over... transition to inst-failed state >>> */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> } >>> >>>> done: >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -1776,7 +1794,7 @@ uint32_t avnd_comp_clc_insting_cleanfail >>> >>>> TRACE_ENTER2("'%s': Cleanup Fail event in the >>> instantiating >>> >>>> state", comp->name.value); >>> >>>> >>> >>>> /* nothing can be done now.. just transition to >>> term-failed >>> >>>> state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> @@ -1808,7 +1826,7 @@ uint32_t avnd_comp_clc_insting_restart_h >>> >>>> m_AVND_COMP_CLC_INST_PARAM_RESET(comp); >>> >>>> >>> >>>> /* transition to 'restarting' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -1864,7 +1882,7 @@ uint32_t >avnd_comp_clc_inst_term_hdler(A >>> >>>> m_AVND_COMP_CLC_INST_PARAM_RESET(comp); >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -1925,7 +1943,7 @@ uint32_t avnd_comp_clc_inst_clean_hdler( >>> >>>> >>> >>>> m_AVND_COMP_TERM_FAIL_RESET(comp); >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> @@ -2008,9 +2026,9 @@ uint32_t avnd_comp_clc_inst_restart_hdle >>> >>>> /* If DisableRestart=0 then transition to 'restarting' >>> >>>> state and >>> >>>> DisableRestart=1 then transition to 'terminating' >>> >>>> state */ >>> >>>> if (!m_AVND_COMP_IS_RESTART_DIS(comp)) >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> else >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> done: >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -2041,7 +2059,7 @@ uint32_t >avnd_comp_clc_inst_orph_hdler(A >>> >>>> m_AVND_TMR_PXIED_COMP_REG_START(cb, *comp, rc); >>> >>>> >>> >>>> if (NCSCC_RC_SUCCESS == rc) { >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> >static_cast<SaAmfPresenceStateT>(SA_AMF_PRESENCE_ORPHANED)); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> >static_cast<SaAmfPresenceStateT>(SA_AMF_PRESENCE_ORPHANED)); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -2067,7 +2085,7 @@ uint32_t >avnd_comp_clc_terming_termsucc_ >>> >>>> TRACE_ENTER2("'%s': Terminate success event in the >>> terminating >>> >>>> state", comp->name.value); >>> >>>> >>> >>>> /* just transition to 'uninstantiated' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> >>> >>>> /* reset the comp-reg & instantiate params */ >>> >>>> if (!m_AVND_COMP_TYPE_IS_PROXIED(comp)) { >>> >>>> @@ -2137,7 +2155,7 @@ uint32_t >avnd_comp_clc_terming_cleansucc >>> >>>> TRACE_ENTER2("'%s': Cleanup success event in the >>> terminating >>> >>>> state", comp->name.value); >>> >>>> >>> >>>> /* just transition to 'uninstantiated' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> >>> >>>> if (AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED == >>> >>>> cb->term_state) { >>> >>>> /* >>> >>>> @@ -2238,7 +2256,7 @@ uint32_t avnd_comp_clc_terming_cleanfail >>> >>>> TRACE_ENTER2("'%s': Cleanup fail event in the terminating >>> >>>> state", comp->name.value); >>> >>>> >>> >>>> /* just transition to 'term-failed' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> avnd_comp_curr_info_del(cb, comp); >>> >>>> if ((cb->term_state == >>> >>>> AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED) && >>> >>>> all_comps_terminated()) { >>> >>>> @@ -2328,7 +2346,7 @@ uint32_t avnd_comp_clc_restart_instsucc_ >>> >>>> } >>> >>>> >>> >>>> /* just transition back to 'instantiated' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> @@ -2373,7 +2391,7 @@ uint32_t >avnd_comp_clc_restart_term_hdle >>> >>>> m_AVND_COMP_CLC_INST_PARAM_RESET(comp); >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -2468,7 +2486,7 @@ uint32_t avnd_comp_clc_restart_termfail_ >>> >>>> >>> >>>> /* transition to 'term-failed' state */ >>> >>>> if (NCSCC_RC_SUCCESS == rc) { >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -2514,7 +2532,7 @@ uint32_t avnd_comp_clc_restart_clean_hdl >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> if (!m_AVND_COMP_IS_TERM_FAIL(comp)) >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> else >>> >>>> m_AVND_COMP_TERM_FAIL_RESET(comp); >>> >>>> } >>> >>>> @@ -2542,7 +2560,7 @@ uint32_t avnd_comp_clc_restart_cleanfail >>> >>>> TRACE_ENTER2("'%s': Cleanup fail event in the restarting >>> >>>> state", comp->name.value); >>> >>>> >>> >>>> /* transition to 'term-failed' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> @@ -2572,7 +2590,7 @@ uint32_t >avnd_comp_clc_orph_instsucc_hdl >>> >>>> } >>> >>>> >>> >>>> /* just transition to 'instantiated' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> @@ -2636,7 +2654,7 @@ uint32_t >avnd_comp_clc_orph_clean_hdler( >>> >>>> m_AVND_COMP_CLC_INST_PARAM_RESET(comp); >>> >>>> >>> >>>> /* transition to 'terminating' state */ >>> >>>> - avnd_comp_pres_state_set(comp, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE(); >>> >>>> @@ -3012,12 +3030,22 @@ uint32_t >avnd_instfail_su_failover(AVND_ >>> >>>> >>> >>>> /* inform AvD */ >>> >>>> rc = avnd_di_oper_send(cb, su, >>> SA_AMF_COMPONENT_FAILOVER); >>> >>>> + >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + // remove assignment if instantiation fails and >>> leads >>> >>>> + // to comp failover in headless mode for PI SU >>> >>>> + if (m_AVND_SU_IS_PREINSTANTIABLE(su)) { >>> >>>> + LOG_WA("Director is down. Remove all SIs from >>> '%s'", >>> >>>> su->name.value); >>> >>>> + avnd_su_si_del(avnd_cb, &su->name); >>> >>>> + } >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> - if (rc == NCSCC_RC_SUCCESS) >>> >>>> + if (rc == NCSCC_RC_SUCCESS) { >>> >>>> 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/amf/amfnd/clm.cc >>> >>>> b/osaf/services/saf/amf/amfnd/clm.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/clm.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/clm.cc >>> >>>> @@ -37,6 +37,7 @@ >>> >>>> #include "avnd.h" >>> >>>> #include "mds_pvt.h" >>> >>>> #include "nid_api.h" >>> >>>> +#include "amf_si_assign.h" >>> >>>> >>> >>>> static void clm_node_left(SaClmNodeIdT node_id) >>> >>>> { >>> >>>> @@ -118,7 +119,12 @@ static void clm_to_amf_node(void) >>> >>>> searchParam.searchOneAttr.attrValueType = >>> SA_IMM_ATTR_SASTRINGT; >>> >>>> searchParam.searchOneAttr.attrValue = &className; >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (SA_AIS_OK != error) { >>> >>>> + LOG_CR("saImmOmInitialize failed. Use previous value of >>> >>>> nodeName."); >>> >>>> + osafassert(avnd_cb->amf_nodeName.length != 0); >>> >>>> + goto done1; >>> >>>> + } >>> >>>> >>> >>>> error = immutil_saImmOmSearchInitialize_2(immOmHandle, >>> nullptr, >>> >>>> SA_IMM_SUBTREE, >>> >>>> SA_IMM_SEARCH_ONE_ATTR | >>> >>>> SA_IMM_SEARCH_GET_ALL_ATTR, >>> >>>> @@ -140,6 +146,7 @@ static void clm_to_amf_node(void) >>> >>>> done: >>> >>>> immutil_saImmOmSearchFinalize(searchHandle); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> +done1: >>> >>>> TRACE_LEAVE2("%u", error); >>> >>>> } >>> >>>> >>> >>>> @@ -170,6 +177,8 @@ uint32_t >avnd_evt_avd_node_up_evh(AVND_C >>> >>>> cb->su_failover_max = info->su_failover_max; >>> >>>> cb->su_failover_prob = info->su_failover_prob; >>> >>>> >>> >>>> + cb->amfd_sync_required = false; >>> >>>> + >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> } >>> >>>> 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 >>> >>>> @@ -72,6 +72,11 @@ uint32_t avnd_evt_ava_finalize_evh(AVND_ >>> >>>> >>> >>>> TRACE_ENTER(); >>> >>>> >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + LOG_ER("AVD is down. Component finalization not >>> available."); >>> >>>> + goto done; >>> >>>> + } >>> >>>> + >>> >>>> /* >>> >>>> * See appendix B. Non registered processes can use parts >>> of >>> >>>> the API. >>> >>>> * For such processes finalize is OK, AMF has no allocated >>> >>>> resources. >>> >>>> @@ -244,6 +249,12 @@ uint32_t >avnd_evt_ava_comp_unreg_evh(AVN >>> >>>> >>> >>>> TRACE_ENTER(); >>> >>>> >>> >>>> + /* return error if amfd is down */ >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + LOG_ER("AVD is down. Component unregistration not >>> >>>> available."); >>> >>>> + goto done; >>> >>>> + } >>> >>>> + >>> >>>> if (AVND_EVT_AVND_AVND_MSG == evt->type) { >>> >>>> /* This means that the message has come from proxy AvND >>> to >>> >>>> this AvND. */ >>> >>>> msg_from_avnd = true; >>> >>>> @@ -2749,7 +2760,7 @@ static SaAisErrorT avnd_validate_comp_an >>> >>>> * @param comp >>> >>>> * @param newstate >>> >>>> */ >>> >>>> -void avnd_comp_pres_state_set(AVND_COMP *comp, >>> SaAmfPresenceStateT >>> >>>> newstate) >>> >>>> +void avnd_comp_pres_state_set(const AVND_CB *cb, >AVND_COMP >>> *comp, >>> >>>> SaAmfPresenceStateT newstate) >>> >>>> { >>> >>>> SaAmfPresenceStateT prv_st = comp->pres; >>> >>>> >>> >>>> @@ -2769,7 +2780,9 @@ void >avnd_comp_pres_state_set(AVND_COMP >>> >>>> if ((SA_AMF_PRESENCE_ORPHANED != newstate) && >>> >>>> (!((SA_AMF_PRESENCE_INSTANTIATED == newstate) && >>> >>>> (SA_AMF_PRESENCE_ORPHANED == prv_st)))) { >>> >>>> >>> >>>> - avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompPresenceState_ID, &comp->name, comp->pres); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompPresenceState_ID, &comp->name, comp->pres); >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> /* create failed state file meaning system restart/cleanup >>> >>>> needed */ >>> >>>> @@ -2807,12 +2820,14 @@ bool >comp_has_quiesced_assignment(const >>> >>>> * @brief Resets component restart count. >>> >>>> * @param comp >>> >>>> */ >>> >>>> -void comp_reset_restart_count(AVND_COMP *comp) >>> >>>> +void comp_reset_restart_count(const AVND_CB *cb, AVND_COMP >>> *comp) >>> >>>> { >>> >>>> if (comp->err_info.restart_cnt != 0) { >>> >>>> comp->err_info.restart_cnt = 0; >>> >>>> - avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompRestartCount_ID, >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompRestartCount_ID, >>> >>>> &comp->name, comp->err_info.restart_cnt); >>> >>>> + } >>> >>>> } >>> >>>> } >>> >>>> /** >>> >>>> @@ -2832,6 +2847,25 @@ void >clear_error_report_alarm(AVND_COMP >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> +void m_AVND_COMP_OPER_STATE_AVD_SYNC(struct >avnd_cb_tag *cb, >>> const >>> >>>> AVND_COMP *comp, uint32_t& o_rc) >>> >>>> +{ >>> >>>> + AVSV_PARAM_INFO param; >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + // pretend it's successful >>> >>>> + o_rc = NCSCC_RC_SUCCESS; >>> >>>> + return; >>> >>>> + } >>> >>>> + memset(¶m, 0, sizeof(AVSV_PARAM_INFO)); >>> >>>> + param.class_id = AVSV_SA_AMF_COMP; >>> >>>> + param.attr_id = saAmfCompOperState_ID; >>> >>>> + param.name = (comp)->name; >>> >>>> + param.act = AVSV_OBJ_OPR_MOD; >>> >>>> + *((uint32_t *)param.value) = m_NCS_OS_HTONL((comp)->oper); >>> >>>> + param.value_len = sizeof(uint32_t); >>> >>>> + (o_rc) = avnd_di_object_upd_send((cb), ¶m); >>> >>>> +} >>> >>>> + >>> >>>> + >>> >>>> /** >>> >>>> * @brief Checks if comp is nonrestartable >>> (DisableRestart=1). >>> >>>> * @param comp >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/compdb.cc >>> >>>> b/osaf/services/saf/amf/amfnd/compdb.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/compdb.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/compdb.cc >>> >>>> @@ -186,10 +186,16 @@ uint32_t avnd_compdb_init(AVND_CB *cb) >>> >>>> uint32_t rc; >>> >>>> SaImmHandleT immOmHandle; >>> >>>> SaVersionT immVersion = { 'A', 2, 1 }; >>> >>>> + SaAisErrorT error; >>> >>>> >>> >>>> TRACE_ENTER(); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + rc = NCSCC_RC_FAILURE; >>> >>>> + goto done1; >>> >>>> + } >>> >>>> >>> >>>> if (avnd_compglobalattrs_config_get(immOmHandle) != >>> SA_AIS_OK) { >>> >>>> rc = NCSCC_RC_FAILURE; >>> >>>> @@ -205,6 +211,7 @@ uint32_t avnd_compdb_init(AVND_CB *cb) >>> >>>> >>> >>>> done: >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> +done1: >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -1518,10 +1525,15 @@ static int comp_init(AVND_COMP *comp, >co >>> >>>> SaStringT env; >>> >>>> SaImmHandleT immOmHandle; >>> >>>> SaVersionT immVersion = { 'A', 2, 1 }; >>> >>>> + SaAisErrorT error; >>> >>>> >>> >>>> TRACE_ENTER2("%s", comp->name.value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done1; >>> >>>> + } >>> >>>> >>> >>>> if ((comptype = avnd_comptype_create(immOmHandle, >>> >>>> &comp->saAmfCompType)) == nullptr) { >>> >>>> LOG_ER("%s: avnd_comptype_create FAILED for '%s'", >>> >>>> __FUNCTION__, >>> >>>> @@ -1658,6 +1670,7 @@ done: >>> >>>> delete [] path_prefix; >>> >>>> avnd_comptype_delete(comptype); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> +done1: >>> >>>> TRACE_LEAVE(); >>> >>>> return res; >>> >>>> } >>> >>>> @@ -1698,7 +1711,7 @@ void avnd_comp_delete(AVND_COMP >*comp) >>> >>>> */ >>> >>>> static AVND_COMP *avnd_comp_create(const SaNameT >*comp_name, >>> const >>> >>>> SaImmAttrValuesT_2 **attributes, AVND_SU *su) >>> >>>> { >>> >>>> - int rc = -1; >>> >>>> + uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> AVND_COMP *comp; >>> >>>> SaAisErrorT error; >>> >>>> >>> >>>> @@ -1812,7 +1825,11 @@ unsigned int >avnd_comp_config_get_su(AVN >>> >>>> >>> >>>> TRACE_ENTER2("SU'%s'", su->name.value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done; >>> >>>> + } >>> >>>> searchParam.searchOneAttr.attrName = >>> >>>> const_cast<SaImmAttrNameT>("SaImmAttrClassName"); >>> >>>> searchParam.searchOneAttr.attrValueType = >>> SA_IMM_ATTR_SASTRINGT; >>> >>>> searchParam.searchOneAttr.attrValue = &className; >>> >>>> @@ -1843,6 +1860,7 @@ unsigned int >avnd_comp_config_get_su(AVN >>> >>>> (void)immutil_saImmOmSearchFinalize(searchHandle); >>> >>>> done1: >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> + done: >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -1861,6 +1879,7 @@ int avnd_comp_config_reinit(AVND_COMP >*c >>> >>>> const SaImmAttrValuesT_2 **attributes; >>> >>>> SaImmHandleT immOmHandle; >>> >>>> SaVersionT immVersion = { 'A', 2, 1 }; >>> >>>> + SaAisErrorT error; >>> >>>> >>> >>>> TRACE_ENTER2("'%s'", comp->name.value); >>> >>>> >>> >>>> @@ -1877,14 +1896,21 @@ int >avnd_comp_config_reinit(AVND_COMP *c >>> >>>> >>> >>>> TRACE_1("%s", comp->name.value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> - immutil_saImmOmAccessorInitialize(immOmHandle, >>> &accessorHandle); >>> >>>> - >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("saImmOmInitialize FAILED for '%s'", >>> >>>> comp->name.value); >>> >>>> + goto done1; >>> >>>> + } >>> >>>> + error = immutil_saImmOmAccessorInitialize(immOmHandle, >>> >>>> &accessorHandle); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("immutil_saImmOmAccessorInitialize FAILED for >>> '%s'", >>> >>>> comp->name.value); >>> >>>> + goto done2; >>> >>>> + } >>> >>>> if (immutil_saImmOmAccessorGet_2(accessorHandle, >>> &comp->name, >>> >>>> nullptr, >>> >>>> (SaImmAttrValuesT_2 ***)&attributes) != SA_AIS_OK) { >>> >>>> >>> >>>> LOG_ER("saImmOmAccessorGet_2 FAILED for '%s'", >>> >>>> comp->name.value); >>> >>>> - goto done2; >>> >>>> + goto done3; >>> >>>> } >>> >>>> >>> >>>> res = comp_init(comp, attributes); >>> >>>> @@ -1894,8 +1920,9 @@ int avnd_comp_config_reinit(AVND_COMP >*c >>> >>>> /* need to get HC type configuration also if that has been >>> >>>> recently created */ >>> >>>> avnd_hctype_config_get(immOmHandle, &comp- >>saAmfCompType); >>> >>>> >>> >>>> +done3: >>> >>>> + immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> done2: >>> >>>> - immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> done1: >>> >>>> TRACE_LEAVE2("%u", res); >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/di.cc >>> >>>> b/osaf/services/saf/amf/amfnd/di.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/di.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/di.cc >>> >>>> @@ -266,6 +266,110 @@ done: >>> >>>> } >>> >>>> >>> >>>> >>> >/********************************************************** >****************** >>> >>> >>>> >>> >>>> >>> >>>> + Name : add_sisu_state_info >>> >>>> + >>> >>>> + Description : This routine adds susi assignment to sisu >>> state >>> >>>> info message >>> >>>> + >>> >>>> + Arguments : msg - ptr to message >>> >>>> + si_assign - ptr to sisu assignment >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void add_sisu_state_info(AVND_MSG *msg, SaAmfSIAssignment >>> *si_assign) >>> >>>> +{ >>> >>>> + AVSV_SISU_STATE_MSG *sisu_state = new >>> AVSV_SISU_STATE_MSG(); >>> >>>> + >>> >>>> + sisu_state->safSU = si_assign->su; >>> >>>> + sisu_state->safSI = si_assign->si; >>> >>>> + sisu_state->saAmfSISUHAState = si_assign->saAmfSISUHAState; >>> >>>> + >>> >>>> + sisu_state->next = >>> >>>> msg->info.avd->msg_info.n2d_nd_sisu_state_info.sisu_list; >>> >>>> + msg->info.avd->msg_info.n2d_nd_sisu_state_info.sisu_list = >>> >>>> sisu_state; >>> >>>> + msg->info.avd->msg_info.n2d_nd_sisu_state_info.num_sisu++; >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : add_su_state_info >>> >>>> + >>> >>>> + Description : This routine adds su info to sisu state info >>> >>>> message >>> >>>> + >>> >>>> + Arguments : msg - ptr to message >>> >>>> + su - ptr to su >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void add_su_state_info(AVND_MSG *msg, const AVND_SU* su) >>> >>>> +{ >>> >>>> + AVSV_SU_STATE_MSG *su_state = new >AVSV_SU_STATE_MSG(); >>> >>>> + >>> >>>> + su_state->safSU = su->name; >>> >>>> + su_state->su_restart_cnt = su->su_restart_cnt; >>> >>>> + su_state->su_oper_state = su->oper; >>> >>>> + su_state->su_pres_state = su->pres; >>> >>>> + >>> >>>> + su_state->next = >>> >>>> msg->info.avd->msg_info.n2d_nd_sisu_state_info.su_list; >>> >>>> + msg->info.avd->msg_info.n2d_nd_sisu_state_info.su_list = >>> su_state; >>> >>>> + msg->info.avd->msg_info.n2d_nd_sisu_state_info.num_su++; >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : add_csicomp_state_info >>> >>>> + >>> >>>> + Description : This routine adds csi assignment info to csi >>> comp >>> >>>> state info >>> >>>> + message >>> >>>> + >>> >>>> + Arguments : msg - ptr to message >>> >>>> + csi_assign - ptr to csi assignment >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void add_csicomp_state_info(AVND_MSG *msg, >SaAmfCSIAssignment >>> >>>> *csi_assign) >>> >>>> +{ >>> >>>> + AVSV_CSICOMP_STATE_MSG *csicomp_state = new >>> >>>> AVSV_CSICOMP_STATE_MSG(); >>> >>>> + >>> >>>> + csicomp_state->safCSI = csi_assign->csi; >>> >>>> + csicomp_state->safComp = csi_assign->comp; >>> >>>> + csicomp_state->saAmfCSICompHAState = >>> >>>> csi_assign->saAmfCSICompHAState; >>> >>>> + >>> >>>> + csicomp_state->next = >>> >>>> msg->info.avd->msg_info.n2d_nd_csicomp_state_info.csicomp_list; >>> >>>> + msg->info.avd- >>msg_info.n2d_nd_csicomp_state_info.csicomp_list >>> = >>> >>>> csicomp_state; >>> >>>> + >>> msg->info.avd->msg_info.n2d_nd_csicomp_state_info.num_csicomp++; >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : add_comp_state_info >>> >>>> + >>> >>>> + Description : This routine adds csi assignment info to comp >>> >>>> state info >>> >>>> + message >>> >>>> + >>> >>>> + Arguments : msg - ptr to message >>> >>>> + comp - ptr to comp >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void add_comp_state_info(AVND_MSG *msg, const AVND_COMP >*comp) >>> >>>> +{ >>> >>>> + AVSV_COMP_STATE_MSG *comp_state = new >>> AVSV_COMP_STATE_MSG(); >>> >>>> + >>> >>>> + comp_state->safComp = comp->name; >>> >>>> + comp_state->comp_restart_cnt = comp->err_info.restart_cnt; >>> >>>> + comp_state->comp_oper_state = comp->oper; >>> >>>> + comp_state->comp_pres_state = comp->pres; >>> >>>> + >>> >>>> + comp_state->next = >>> >>>> msg->info.avd->msg_info.n2d_nd_csicomp_state_info.comp_list; >>> >>>> + msg->info.avd->msg_info.n2d_nd_csicomp_state_info.comp_list = >>> >>>> comp_state; >>> >>>> + msg->info.avd- >>msg_info.n2d_nd_csicomp_state_info.num_comp++; >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> Name : avnd_evt_avd_ack_message >>> >>>> >>> >>>> Description : This routine processes Ack message >>> >>>> @@ -335,6 +439,7 @@ void avnd_send_node_up_msg(void) >>> >>>> { >>> >>>> AVND_CB *cb = avnd_cb; >>> >>>> AVND_MSG msg = {}; >>> >>>> + AVND_DND_MSG_LIST *pending_rec = 0; >>> >>>> uint32_t rc; >>> >>>> >>> >>>> TRACE_ENTER(); >>> >>>> @@ -349,10 +454,20 @@ void avnd_send_node_up_msg(void) >>> >>>> goto done; >>> >>>> } >>> >>>> >>> >>>> + // We don't send node_up if it has already been sent and >>> waiting >>> >>>> for ACK >>> >>>> + for (pending_rec = cb->dnd_list.head; pending_rec != >>> nullptr; >>> >>>> pending_rec = pending_rec->next) { >>> >>>> + if (pending_rec->msg.info.avd->msg_type == >>> >>>> AVSV_N2D_NODE_UP_MSG) { >>> >>>> + TRACE("Don't send another node_up since it has been >>> sent >>> >>>> and waiting for ack"); >>> >>>> + goto done; >>> >>>> + } >>> >>>> + } >>> >>>> + >>> >>>> msg.info.avd = new AVSV_DND_MSG(); >>> >>>> msg.type = AVND_MSG_AVD; >>> >>>> msg.info.avd->msg_type = AVSV_N2D_NODE_UP_MSG; >>> >>>> msg.info.avd->msg_info.n2d_node_up.msg_id = >>> ++(cb->snd_msg_id); >>> >>>> + msg.info.avd->msg_info.n2d_node_up.leds_set = cb->led_state >>> == >>> >>>> AVND_LED_STATE_GREEN ? true : false; >>> >>>> + msg.info.avd->msg_info.n2d_node_up.node_name = >>> cb->amf_nodeName; >>> >>>> msg.info.avd->msg_info.n2d_node_up.node_id = >>> >>>> cb->node_info.nodeId; >>> >>>> msg.info.avd->msg_info.n2d_node_up.adest_address = >>> >>>> cb->avnd_dest; >>> >>>> >>> >>>> @@ -419,9 +534,39 @@ uint32_t >avnd_evt_mds_avd_up_evh(AVND_CB >>> >>>> /* store the AVD MDS address */ >>> >>>> cb->avd_dest = evt->info.mds.mds_dest; >>> >>>> >>> >>>> - avnd_send_node_up_msg(); >>> >>>> + /* amfnd receives NCSMDS_UP in either cluster start up; >>> or >>> >>>> recovery from headless >>> >>>> + * after a long gap greater than no-active timer in MDS. >>> We >>> >>>> send node_up in both cases >>> >>>> + * but only sync info is sent for recovery >>> >>>> + */ >>> >>>> + if (evt->info.mds.i_change == NCSMDS_UP) { >>> >>>> + if (cb->amfd_sync_required && cb->led_state == >>> >>>> AVND_LED_STATE_GREEN) { >>> >>>> + avnd_sync_sisu(cb); >>> >>>> + avnd_sync_csicomp(cb); >>> >>>> + } >>> >>>> + >>> >>>> + LOG_NO("Sending node up due to NCSMDS_UP"); >>> >>>> + avnd_send_node_up_msg(); >>> >>>> + } >>> >>>> + /* amfnd receives NCSMDS_NEW_ACTIVE in either Failover; >>> or >>> >>>> recovery from headless >>> >>>> + * provided that the no-active timer in MDS has not >>> expired. >>> >>>> We only want to send >>> >>>> + * node_up/sync info in case of recovery. >>> >>>> + */ >>> >>>> + if (evt->info.mds.i_change == NCSMDS_NEW_ACTIVE && >>> >>>> cb->amfd_sync_required) { >>> >>>> + if (cb->led_state == AVND_LED_STATE_GREEN) { >>> >>>> + LOG_NO("Sending node up due to >>> NCSMDS_NEW_ACTIVE"); >>> >>>> + >>> >>>> + // node_up, sync sisu, compcsi info to AVND for >>> >>>> recovery >>> >>>> + avnd_sync_sisu(cb); >>> >>>> + avnd_sync_csicomp(cb); >>> >>>> + avnd_send_node_up_msg(); >>> >>>> + } >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> + cb->is_avd_down = false; >>> >>>> + if (m_AVND_TMR_IS_ACTIVE(cb->sc_absence_tmr)) >>> >>>> + avnd_stop_tmr(cb, &cb->sc_absence_tmr); >>> >>>> + >>> >>>> done: >>> >>>> TRACE_LEAVE(); >>> >>>> return NCSCC_RC_SUCCESS; >>> >>>> @@ -454,15 +599,94 @@ uint32_t >avnd_evt_mds_avd_dn_evh(AVND_CB >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> - LOG_ER("AMF director unexpectedly crashed"); >>> >>>> + m_AVND_CB_AVD_UP_RESET(cb); >>> >>>> + cb->active_avd_adest = 0; >>> >>>> >>> >>>> - /* Don't issue reboot if it has been already issued.*/ >>> >>>> - if (false == cb->reboot_in_progress) { >>> >>>> - cb->reboot_in_progress = true; >>> >>>> - opensaf_reboot(avnd_cb->node_info.nodeId, (char >>> >>>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + LOG_WA("AMF director unexpectedly crashed"); >>> >>>> + >>> >>>> + if (cb->scs_absence_max_duration == 0) { >>> >>>> + /* Don't issue reboot if it has been already issued.*/ >>> >>>> + if (false == cb->reboot_in_progress) { >>> >>>> + cb->reboot_in_progress = true; >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, (char *) >>> >>>> avnd_cb->node_info.executionEnvironment.value, >>> >>>> "local AVD down(Adest) or both AVD down(Vdest) >>> >>>> received"); >>> >>>> + } >>> >>>> + >>> >>>> + TRACE_LEAVE(); >>> >>>> + return rc; >>> >>>> } >>> >>>> >>> >>>> + /* >>> >>>> + * No contact with any controller >>> >>>> + * Reboot this node if: >>> >>>> + * 1) director is of an older version that does not support >>> >>> >>>> restart >>> >>>> + * 2) we have a pending message TO the director >>> >>>> + * 3) we have a pending message FROM the director >>> >>>> + */ >>> >>>> + >>> >>>> + if (cb->scs_absence_max_duration == 0) { >>> >>>> + // check for pending messages TO director >>> >>>> + if ((cb->dnd_list.head != nullptr)) { >>> >>>> + uint32_t no_pending_msg = 0; >>> >>>> + AVND_DND_MSG_LIST *rec = 0; >>> >>>> + for (rec = cb->dnd_list.head; rec != nullptr; rec = >>> >>>> rec->next, no_pending_msg++) { >>> >>>> + osafassert(rec->msg.type == AVND_MSG_AVD); >>> >>>> + } >>> >>>> + >>> >>>> + /* Don't issue reboot if it has been already >>> issued.*/ >>> >>>> + if (false == cb->reboot_in_progress) { >>> >>>> + LOG_ER("%d pending messages to director. >>> Rebooting >>> >>>> to re-sync.", no_pending_msg); >>> >>>> + >>> >>>> + cb->reboot_in_progress = true; >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char >>> >>>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "local AVD down(Adest) or both AVD >>> >>>> down(Vdest) received"); >>> >>>> + } >>> >>>> + } >>> >>>> + } else { >>> >>>> + TRACE("Delete all pending messages to be sent to >>> AMFD"); >>> >>>> + avnd_diq_del(cb); >>> >>>> + } >>> >>>> + >>> >>>> + // check for pending messages FROM director >>> >>>> + // scan all SUs "siq" message list, if anyone is not empty >>> reboot >>> >>>> + const AVND_SU *su = (AVND_SU >>> >>>> *)ncs_patricia_tree_getnext(&cb->sudb, (uint8_t *)0); >>> >>>> + while (su != 0) { >>> >>>> + LOG_NO("Checking '%s' for pending messages", >>> su->name.value); >>> >>>> + >>> >>>> + const AVND_SU_SIQ_REC *siq = >>> >>>> + (AVND_SU_SIQ_REC >>> *)m_NCS_DBLIST_FIND_LAST(&su->siq); >>> >>>> + >>> >>>> + if (siq != nullptr) { >>> >>>> + /* Don't issue reboot if it has been already >>> issued.*/ >>> >>>> + if (false == cb->reboot_in_progress) { >>> >>>> + LOG_ER("Pending messages from director. >>> Rebooting to >>> >>>> re-sync."); >>> >>>> + >>> >>>> + cb->reboot_in_progress = true; >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char >>> >>>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "local AVD down(Adest) or both AVD >>> down(Vdest) >>> >>>> received"); >>> >>>> + } >>> >>>> + } >>> >>>> + >>> >>>> + su = (AVND_SU *)ncs_patricia_tree_getnext( >>> >>>> + &cb->sudb, (uint8_t *)&su->name); >>> >>>> + } >>> >>>> + // record we are now 'headless' >>> >>>> + cb->is_avd_down = true; >>> >>>> + cb->amfd_sync_required = true; >>> >>>> + // start the sc absence timer if it hasn't started. >>> >>>> + // During headless, MDS reports avd_down 2 times, >>> >>>> + // the 2nd time is 3 mins later then the 1st time. >>> >>>> + // The absence timer should only start at the 1st time. >>> >>>> + if (!m_AVND_TMR_IS_ACTIVE(cb->sc_absence_tmr)) { >>> >>>> + avnd_start_tmr(cb, &cb->sc_absence_tmr, >>> AVND_TMR_SC_ABSENCE, >>> >>>> + cb->scs_absence_max_duration, 0); >>> >>>> + } >>> >>>> + >>> >>>> + // reset msg_id counter >>> >>>> + cb->rcv_msg_id = 0; >>> >>>> + cb->snd_msg_id = 0; >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -486,6 +710,13 @@ uint32_t avnd_di_oper_send(AVND_CB *cb, >>> >>>> AVND_MSG msg; >>> >>>> uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + LOG_NO("avnd_di_oper_send() deferred as AMF director is >>> >>>> offline"); >>> >>>> + >>> >>>> + // reconcile operational states later >>> >>>> + return rc; >>> >>>> + } >>> >>>> + >>> >>>> memset(&msg, 0, sizeof(AVND_MSG)); >>> >>>> TRACE_ENTER2("SU '%p', recv '%u'", su, rcvr); >>> >>>> >>> >>>> @@ -570,6 +801,11 @@ uint32_t avnd_di_susi_resp_send(AVND_CB >>> >>>> if (cb->term_state == >>> AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED) >>> >>>> return rc; >>> >>>> >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + m_AVND_SU_ALL_SI_RESET(su); >>> >>>> + return rc; >>> >>>> + } >>> >>>> + >>> >>>> // should be in assignment pending state to be here >>> >>>> osafassert(m_AVND_SU_IS_ASSIGN_PEND(su)); >>> >>>> >>> >>>> @@ -665,6 +901,11 @@ uint32_t >avnd_di_object_upd_send(AVND_CB >>> >>>> uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> TRACE_ENTER2("Comp '%s'", param->name.value); >>> >>>> >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + TRACE_LEAVE2("AVD is down. %u", rc); >>> >>>> + return rc; >>> >>>> + } >>> >>>> + >>> >>>> memset(&msg, 0, sizeof(AVND_MSG)); >>> >>>> >>> >>>> /* populate the msg */ >>> >>>> @@ -785,6 +1026,10 @@ uint32_t avnd_di_msg_send(AVND_CB >*cb, A >>> >>>> TRACE_1("%s, Active AVD Adest: %" PRIu64, >>> __FUNCTION__, >>> >>>> cb->active_avd_adest); >>> >>>> rc = avnd_mds_red_send(cb, msg, &cb->avd_dest, >>> >>>> &cb->active_avd_adest); >>> >>>> goto done; >>> >>>> + } else if ((msg->info.avd->msg_type == >>> >>>> AVSV_N2D_ND_SISU_STATE_INFO_MSG) || >>> >>>> + (msg->info.avd->msg_type == >>> >>>> AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG)) { >>> >>>> + rc = avnd_mds_send(cb, msg, &cb->avd_dest, 0); >>> >>>> + goto done; >>> >>>> } >>> >>>> >>> >>>> /* add the record to the AvD msg list */ >>> >>>> @@ -1005,8 +1250,17 @@ void avnd_diq_rec_del(AVND_CB *cb, >AVND_ >>> >>>> ncshm_destroy_hdl(NCS_SERVICE_ID_AVND, rec->opq_hdl); >>> >>>> >>> >>>> /* stop the AvD msg response timer */ >>> >>>> - if (m_AVND_TMR_IS_ACTIVE(rec->resp_tmr)) >>> >>>> + if (m_AVND_TMR_IS_ACTIVE(rec->resp_tmr)) { >>> >>>> m_AVND_TMR_MSG_RESP_STOP(cb, *rec); >>> >>>> + // Resend msgs from queue because amfd dropped during >>> sync >>> >>>> + if ((cb->dnd_list.head != nullptr)) { >>> >>>> + TRACE("retransmit message to amfd"); >>> >>>> + AVND_DND_MSG_LIST *pending_rec = 0; >>> >>>> + for (pending_rec = cb->dnd_list.head; pending_rec >>> != >>> >>>> nullptr; pending_rec = pending_rec->next) { >>> >>>> + avnd_diq_rec_send(cb, pending_rec); >>> >>>> + } >>> >>>> + } >>> >>>> + } >>> >>>> >>> >>>> /* free the avnd message contents */ >>> >>>> avnd_msg_content_free(cb, &rec->msg); >>> >>>> @@ -1204,3 +1458,154 @@ uint32_t >avnd_evt_avd_role_change_evh(AV >>> >>>> TRACE_LEAVE(); >>> >>>> return rc; >>> >>>> } >>> >>>> + >>> >>>> +/** >>> >>>> + * The SC absence timer expired. Reboot this node. >>> >>>> + * @param cb >>> >>>> + * @param evt >>> >>>> + * >>> >>>> + * @return uns32 >>> >>>> + */ >>> >>>> +uint32_t avnd_evt_tmr_sc_absence_evh(AVND_CB *cb, >AVND_EVT >>> *evt) >>> >>>> +{ >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + LOG_ER("AMF director absence timeout"); >>> >>>> + >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char >>> >>>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "AMF director absence timeout"); >>> >>>> + >>> >>>> + return NCSCC_RC_SUCCESS; >>> >>>> +} >>> >>>> + >>> >>>> +/** >>> >>>> + * Send csi comp state info to amfd when cluster comes back >>> from >>> >>>> headless >>> >>>> + * @param cb >>> >>>> + * >>> >>>> + * @return void >>> >>>> + */ >>> >>>> +void avnd_sync_csicomp(AVND_CB *cb) >>> >>>> +{ >>> >>>> + AVND_MSG msg; >>> >>>> + uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> + const AVND_COMP* comp; >>> >>>> + const AVND_COMP_CSI_REC* csi; >>> >>>> + SaAmfCSIAssignment csi_assignment; >>> >>>> + >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + /* Send the state info to avd. */ >>> >>>> + memset(&msg, 0, sizeof(AVND_MSG)); >>> >>>> + msg.info.avd = new AVSV_DND_MSG(); >>> >>>> + >>> >>>> + msg.type = AVND_MSG_AVD; >>> >>>> + msg.info.avd->msg_type = >>> AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG; >>> >>>> + msg.info.avd->msg_info.n2d_nd_csicomp_state_info.msg_id = >>> >>>> cb->snd_msg_id; >>> >>>> + msg.info.avd->msg_info.n2d_nd_csicomp_state_info.node_id = >>> >>>> cb->node_info.nodeId; >>> >>>> + msg.info.avd- >>msg_info.n2d_nd_csicomp_state_info.num_csicomp = >>> 0; >>> >>>> + msg.info.avd->msg_info.n2d_nd_csicomp_state_info.csicomp_list >>> = >>> >>>> nullptr; >>> >>>> + >>> >>>> + // add CSICOMP objects >>> >>>> + comp = (AVND_COMP *)ncs_patricia_tree_getnext(&cb- >>compdb, >>> >>>> (uint8_t *)0); >>> >>>> + while (comp != nullptr) { >>> >>>> + TRACE("syncing comp: %s", comp->name.value); >>> >>>> + for (csi = >>> >>>> >>> >m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI >RST(&comp->csi_list)); >>> >>> >>>> >>> >>>> >>> >>>> + csi != nullptr; >>> >>>> + csi = >>> >>>> >>> >m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NE >XT(&csi->comp_dll_node))) >>> >>> >>>> >>> >>>> { >>> >>>> + osafassert(csi != nullptr); >>> >>>> + >>> >>>> + csi_assignment.comp = comp->name; >>> >>>> + csi_assignment.csi = csi->name; >>> >>>> + >>> >>>> + if (csi->si != nullptr) { >>> >>>> + csi_assignment.saAmfCSICompHAState = >>> >>>> csi->si->curr_state; >>> >>>> + TRACE("si found. HA state is %d", >>> >>>> csi_assignment.saAmfCSICompHAState); >>> >>>> + } else { >>> >>>> + TRACE("csi->si is nullptr"); >>> >>>> + csi_assignment.saAmfCSICompHAState = >>> >>>> SA_AMF_HA_QUIESCED; >>> >>>> + } >>> >>>> + >>> >>>> + add_csicomp_state_info(&msg, &csi_assignment); >>> >>>> + } >>> >>>> + >>> >>>> + add_comp_state_info(&msg, comp); >>> >>>> + comp = (AVND_COMP >>> *)ncs_patricia_tree_getnext(&cb->compdb, >>> >>>> (uint8_t *)&comp->name); >>> >>>> + } >>> >>>> + >>> >>>> + LOG_NO("%d CSICOMP states synced", >>> >>>> msg.info.avd- >>msg_info.n2d_nd_csicomp_state_info.num_csicomp); >>> >>>> + LOG_NO("%d SU states sent", >>> >>>> msg.info.avd->msg_info.n2d_nd_csicomp_state_info.num_comp); >>> >>>> + >>> >>>> + rc = avnd_di_msg_send(cb, &msg); >>> >>>> + if (rc == NCSCC_RC_SUCCESS) >>> >>>> + msg.info.avd = 0; >>> >>>> + else >>> >>>> + LOG_ER("avnd_di_msg_send FAILED"); >>> >>>> + >>> >>>> + avnd_msg_content_free(cb, &msg); >>> >>>> + >>> >>>> + TRACE_LEAVE(); >>> >>>> +} >>> >>>> + >>> >>>> +/** >>> >>>> + * Send susi state info to amfd when cluster comes back from >>> headless >>> >>>> + * @param cb >>> >>>> + * >>> >>>> + * @return void >>> >>>> + */ >>> >>>> +void avnd_sync_sisu(AVND_CB *cb) >>> >>>> +{ >>> >>>> + AVND_MSG msg; >>> >>>> + uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> + SaAmfSIAssignment si_assignment; >>> >>>> + const AVND_SU* su; >>> >>>> + const AVND_SU_SI_REC* si; >>> >>>> + >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + /* Send the state info to avd. */ >>> >>>> + memset(&msg, 0, sizeof(AVND_MSG)); >>> >>>> + msg.info.avd = new AVSV_DND_MSG(); >>> >>>> + >>> >>>> + msg.type = AVND_MSG_AVD; >>> >>>> + msg.info.avd->msg_type = >AVSV_N2D_ND_SISU_STATE_INFO_MSG; >>> >>>> //AVSV_N2D_ND_ASSIGN_STATES_MSG >>> >>>> + msg.info.avd->msg_info.n2d_nd_sisu_state_info.msg_id = >>> >>>> cb->snd_msg_id; >>> >>>> + msg.info.avd->msg_info.n2d_nd_sisu_state_info.node_id = >>> >>>> cb->node_info.nodeId; >>> >>>> + msg.info.avd->msg_info.n2d_nd_sisu_state_info.num_sisu = 0; >>> >>>> + msg.info.avd->msg_info.n2d_nd_sisu_state_info.sisu_list = >>> nullptr; >>> >>>> + >>> >>>> + // gather SISU states >>> >>>> + su = (AVND_SU *)ncs_patricia_tree_getnext(&cb->sudb, >>> (uint8_t >>> >>>> *)0); >>> >>>> + while (su != nullptr) { >>> >>>> + TRACE("syncing su: %s", su->name.value); >>> >>>> + >>> >>>> + // attach SISUs >>> >>>> + for (si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list); >>> >>>> + si != nullptr; >>> >>>> + si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_NEXT(&si->su_dll_node)) { >>> >>>> + >>> >>>> + si_assignment.su = su->name; >>> >>>> + si_assignment.si = si->name; >>> >>>> + si_assignment.saAmfSISUHAState = si->curr_state; >>> >>>> + >>> >>>> + add_sisu_state_info(&msg, &si_assignment); >>> >>>> + } >>> >>>> + >>> >>>> + add_su_state_info(&msg, su); >>> >>>> + >>> >>>> + su = (AVND_SU *)ncs_patricia_tree_getnext(&cb->sudb, >>> >>>> (uint8_t *)&su->name); >>> >>>> + } >>> >>>> + >>> >>>> + LOG_NO("%d SISU states sent", >>> >>>> msg.info.avd->msg_info.n2d_nd_sisu_state_info.num_sisu); >>> >>>> + LOG_NO("%d SU states sent", >>> >>>> msg.info.avd->msg_info.n2d_nd_sisu_state_info.num_su); >>> >>>> + >>> >>>> + rc = avnd_di_msg_send(cb, &msg); >>> >>>> + if (rc == NCSCC_RC_SUCCESS) >>> >>>> + msg.info.avd = 0; >>> >>>> + else >>> >>>> + LOG_ER("avnd_di_msg_send FAILED"); >>> >>>> + >>> >>>> + avnd_msg_content_free(cb, &msg); >>> >>>> + >>> >>>> + TRACE_LEAVE(); >>> >>>> +} >>> >>>> 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 >>> >>>> @@ -77,6 +77,8 @@ static uint32_t avnd_err_restart_esc_lev >>> >>>> static uint32_t avnd_err_restart_esc_level_1(AVND_CB *, >AVND_SU >>> *, >>> >>>> AVND_ERR_ESC_LEVEL *, AVSV_ERR_RCVR *); >>> >>>> static uint32_t avnd_err_restart_esc_level_2(AVND_CB *, >AVND_SU >>> *, >>> >>>> AVND_ERR_ESC_LEVEL *, AVSV_ERR_RCVR *); >>> >>>> >>> >>>> +static void cleanup_all_comps_and_reboot(AVND_CB *cb); >>> >>>> + >>> >>>> /* LSB Changes. Strings to represent source of component Error >>> */ >>> >>>> >>> >>>> static const char *g_comp_err[] = { >>> >>>> @@ -414,6 +416,7 @@ uint32_t avnd_err_process(AVND_CB *cb, A >>> >>>> goto done; >>> >>>> >>> >>>> done: >>> >>>> + >>> >>>> TRACE_LEAVE2("Return value:'%u'", rc); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -474,8 +477,11 @@ uint32_t avnd_err_escalate(AVND_CB *cb, >>> >>>> >>> >>>> case SA_AMF_NODE_SWITCHOVER: >>> >>>> case SA_AMF_NODE_FAILOVER: >>> >>>> + case SA_AMF_CLUSTER_RESET: >>> >>>> + break; >>> >>>> + >>> >>>> case SA_AMF_NODE_FAILFAST: >>> >>>> - case SA_AMF_CLUSTER_RESET: >>> >>>> + // this is still supported in headless mode >>> >>>> break; >>> >>>> >>> >>>> case AVSV_ERR_RCVR_SU_RESTART: >>> >>>> @@ -765,11 +771,41 @@ uint32_t >avnd_err_rcvr_comp_failover(AVN >>> >>>> if (m_AVND_SU_IS_PREINSTANTIABLE(su)) { >>> >>>> /* clean the failed comp */ >>> >>>> rc = avnd_comp_clc_fsm_run(cb, failed_comp, >>> >>>> AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); >>> >>>> - if (NCSCC_RC_SUCCESS != rc) >>> >>>> + if (NCSCC_RC_SUCCESS != rc) { >>> >>>> + LOG_ER("cleanup of '%s' failed", >>> >>>> failed_comp->name.value); >>> >>>> goto done; >>> >>>> + } >>> >>>> + >>> >>>> + // if headless, remove all assignments from this SU >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + AVND_SU_SI_REC *si = 0; >>> >>>> + AVND_SU_SI_REC *next_si = 0; >>> >>>> + uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> + TRACE("Removing assignments from '%s'", >>> su->name.value); >>> >>>> + >>> >>>> + m_AVND_SU_ASSIGN_PEND_SET(su); >>> >>>> + >>> >>>> + /* scan the su-si list & remove the sis */ >>> >>>> + for (si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list); si;) { >>> >>>> + next_si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_NEXT(&si->su_dll_node); >>> >>>> + rc = avnd_su_si_remove(cb, su, si); >>> >>>> + if (NCSCC_RC_SUCCESS != rc) { >>> >>>> + LOG_ER("failed to remove SI assignment from >>> >>> >>>> '%s'", >>> >>>> + su->name.value); >>> >>>> + break; >>> >>>> + } >>> >>>> + si = next_si; >>> >>>> + } >>> >>>> + } >>> >>>> } else { >>> >>>> /* request director to orchestrate component failover >>> */ >>> >>>> rc = avnd_di_oper_send(cb, failed_comp->su, >>> >>>> AVSV_ERR_RCVR_SU_FAILOVER); >>> >>>> + >>> >>>> + // if headless, we have to perform the 'failover' >>> without >>> >>>> amfd >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + // SU failover results in a node failfast if >>> headless >>> >>>> (not nice) >>> >>>> + cleanup_all_comps_and_reboot(cb); >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> @@ -816,9 +852,13 @@ uint32_t avnd_err_rcvr_su_failover(AVND_ >>> >>>> LOG_ER("'%s' termination failed", >>> comp->name.value); >>> >>>> goto done; >>> >>>> } >>> >>>> - avnd_su_pres_state_set(comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> + >>> >>>> done: >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + cleanup_all_comps_and_reboot(cb); >>> >>>> + } >>> >>>> >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> return rc; >>> >>>> @@ -906,7 +946,7 @@ uint32_t avnd_err_rcvr_node_switchover(A >>> >>>> LOG_ER("'%s' termination failed", >>> comp->name.value); >>> >>>> goto done; >>> >>>> } >>> >>>> - avnd_su_pres_state_set(failed_comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, failed_comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> } >>> >>>> else { >>> >>>> @@ -918,7 +958,13 @@ uint32_t avnd_err_rcvr_node_switchover(A >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> - done: >>> >>>> +done: >>> >>>> + // TODO - try to see if we can avoid a reboot & terminate >>> >>>> components more gracefully >>> >>>> + // if headless, reboot as we can't perform a switchover >>> without >>> >>>> amfd >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + cleanup_all_comps_and_reboot(cb); >>> >>>> + } >>> >>>> + >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -980,7 +1026,17 @@ uint32_t >avnd_err_rcvr_node_failover(AVN >>> >>>> LOG_ER("Exiting (due to comp term failed) to aid >>> fast >>> >>>> node reboot"); >>> >>>> exit(1); >>> >>>> } >>> >>>> - avnd_su_pres_state_set(comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, comp->su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + } >>> >>>> + >>> >>>> + // TODO - try to see if we can avoid a reboot >>> >>>> + // if headless, reboot as we can't perform a failover >>> without >>> >>>> amfd >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char >>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "Can't perform node failover while controllers are >>> down. >>> >>>> Recovery is node failfast."); >>> >>>> + LOG_ER("Exiting to aid fast node reboot"); >>> >>>> + exit(1); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -1059,7 +1115,7 @@ uint32_t avnd_err_su_repair(AVND_CB >*cb, >>> >>>> is no such event handler and event in SU FSM. >>> >>>> */ >>> >>>> if ((is_uninst == true) && (is_comp_insting == true)) >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> done: >>> >>>> TRACE_LEAVE2("retval=%u", rc); >>> >>>> return rc; >>> >>>> @@ -1162,7 +1218,7 @@ uint32_t avnd_err_restart_esc_level_0(AV >>> >>>> /*stop the comp-err-esc-timer */ >>> >>>> tmr_comp_err_esc_stop(cb, su); >>> >>>> su->comp_restart_cnt = 0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> >>> >>>> /* go to the next possible level, is su restart >>> capable? */ >>> >>>> if (su->su_restart_max != 0 && >>> >>>> !m_AVND_SU_IS_SU_RESTART_DIS(su)) { >>> >>>> @@ -1250,7 +1306,7 @@ uint32_t avnd_err_restart_esc_level_1(AV >>> >>>> /* stop timer */ >>> >>>> tmr_su_err_esc_stop(cb, su); >>> >>>> su->su_restart_cnt = 0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> >>> >>>> /* go to the next possible level, get escalated >>> recovery >>> >>>> and modify count */ >>> >>>> if ((cb->su_failover_max != 0) || (true == >>> >>>> su->su_is_external)) { >>> >>>> @@ -1267,7 +1323,10 @@ uint32_t >avnd_err_restart_esc_level_1(AV >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> - avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> saAmfSURestartCount_ID, >>> >>>> &su->name, su->su_restart_cnt); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> >>>> saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); >>> >>>> + } >>> >>>> + >>> >>>> TRACE_LEAVE2("retval=%u", rc); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -1442,7 +1501,7 @@ uint32_t >avnd_evt_tmr_node_err_esc_evh(A >>> >>>> if (su->su_err_esc_level == AVND_ERR_ESC_LEVEL_2) { >>> >>>> su->comp_restart_cnt = 0; >>> >>>> su->su_restart_cnt = 0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> >>>> saAmfSURestartCount_ID, >>> >>>> &su->name, su->su_restart_cnt); >>> >>>> su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> @@ -1539,3 +1598,34 @@ bool >is_no_assignment_due_to_escalations >>> >>>> TRACE_LEAVE2("false"); >>> >>>> return false; >>> >>>> } >>> >>>> + >>> >>>> +void cleanup_all_comps_and_reboot(AVND_CB *cb) >>> >>>> +{ >>> >>>> + AVND_COMP *comp; >>> >>>> + uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> + >>> >>>> + /* Unordered cleanup of all local application components */ >>> >>>> + for (comp = (AVND_COMP >>> *)ncs_patricia_tree_getnext(&cb->compdb, >>> >>>> (uint8_t *)nullptr); >>> >>>> + comp != nullptr; >>> >>>> + comp = (AVND_COMP *) >>> >>>> ncs_patricia_tree_getnext(&cb->compdb, (uint8_t *)&comp- >>name)) >>> { >>> >>>> + >>> >>>> + if (comp->su->is_ncs || comp->su->su_is_external) >>> >>>> + continue; >>> >>>> + >>> >>>> + rc = avnd_comp_clc_fsm_run(cb, comp, >>> >>>> AVND_COMP_CLC_PRES_FSM_EV_CLEANUP); >>> >>>> + if (rc != NCSCC_RC_SUCCESS) { >>> >>>> + LOG_ER("'%s' termination failed", >>> comp->name.value); >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char >>> >>>> *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "Component termination failed at >>> node >>> >>>> switchover"); >>> >>>> + LOG_ER("Exiting (due to comp term failed) to aid >>> fast >>> >>>> node reboot"); >>> >>>> + exit(1); >>> >>>> + } >>> >>>> + } >>> >>>> + >>> >>>> + opensaf_reboot(avnd_cb->node_info.nodeId, >>> >>>> + (char *)avnd_cb->node_info.executionEnvironment.value, >>> >>>> + "Can't perform recovery while controllers are down. >>> Recovery >>> >>>> is node failfast."); >>> >>>> + LOG_ER("Exiting to aid fast node reboot"); >>> >>>> + exit(1); >>> >>>> +} >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/evt.cc >>> >>>> b/osaf/services/saf/amf/amfnd/evt.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/evt.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/evt.cc >>> >>>> @@ -124,6 +124,7 @@ AVND_EVT *avnd_evt_create(AVND_CB *cb, >>> >>>> case AVND_EVT_TMR_CLC_PXIED_COMP_INST: >>> >>>> case AVND_EVT_TMR_CLC_PXIED_COMP_REG: >>> >>>> case AVND_EVT_TMR_HB_DURATION: >>> >>>> + case AVND_EVT_TMR_SC_ABSENCE: >>> >>>> case AVND_EVT_TMR_QSCING_CMPL: >>> >>>> evt->priority = NCS_IPC_PRIORITY_HIGH; /* bump up >>> the >>> >>>> priority */ >>> >>>> evt->info.tmr.opq_hdl = *(uint32_t *)info; >>> >>>> @@ -263,6 +264,7 @@ void avnd_evt_destroy(AVND_EVT *evt) >>> >>>> case AVND_EVT_TMR_CLC_PXIED_COMP_INST: >>> >>>> case AVND_EVT_TMR_CLC_PXIED_COMP_REG: >>> >>>> case AVND_EVT_TMR_HB_DURATION: >>> >>>> + case AVND_EVT_TMR_SC_ABSENCE: >>> >>>> case AVND_EVT_TMR_QSCING_CMPL: >>> >>>> break; >>> >>>> >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/hcdb.cc >>> >>>> b/osaf/services/saf/amf/amfnd/hcdb.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/hcdb.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/hcdb.cc >>> >>>> @@ -232,7 +232,11 @@ SaAisErrorT >avnd_hc_config_get(AVND_COMP >>> >>>> SaImmHandleT immOmHandle; >>> >>>> SaVersionT immVersion = { 'A', 2, 1 }; >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done; >>> >>>> + } >>> >>>> >>> >>>> avnd_hctype_config_get(immOmHandle, &comp- >>saAmfCompType); >>> >>>> >>> >>>> @@ -263,7 +267,7 @@ SaAisErrorT >avnd_hc_config_get(AVND_COMP >>> >>>> (void)immutil_saImmOmSearchFinalize(searchHandle); >>> >>>> done1: >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> - >>> >>>> + done: >>> >>>> return error; >>> >>>> } >>> >>>> >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_cb.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_cb.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_cb.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_cb.h >>> >>>> @@ -42,6 +42,7 @@ typedef struct avnd_cb_tag { >>> >>>> MDS_DEST avnd_dest; /* AvND mds addr */ >>> >>>> MDS_DEST avd_dest; /* AvD mds addr */ >>> >>>> bool is_avd_down; /* Temp: Indicates if AvD went down >>> */ >>> >>>> + bool amfd_sync_required; >>> >>>> >>> >>>> /* cb related params */ >>> >>>> NCS_LOCK mon_lock; /* PID monitor lock */ >>> >>>> @@ -90,7 +91,12 @@ typedef struct avnd_cb_tag { >>> >>>> uint32_t rcv_msg_id; /* Message ID of the last message >>> >>>> received */ >>> >>>> /* AvD messaging params (retransmit list etc.) */ >>> >>>> uint32_t snd_msg_id; /* send msg id */ >>> >>>> - AVND_DND_LIST dnd_list; /* list of messages sent to AvD >>> */ >>> >>>> + >>> >>>> + /** List of messages sent to director but not yet acked. >>> >>>> + * Messages are removed when acked with the ACK message. >>> >>>> + * At director failover the list is scanned handling the >>> >>>> + * VERIFY message from the director and possibly resent >>> again */ >>> >>>> + AVND_DND_LIST dnd_list; >>> >>>> >>> >>>> AVND_TERM_STATE term_state; >>> >>>> AVND_LED_STATE led_state; >>> >>>> @@ -109,6 +115,11 @@ typedef struct avnd_cb_tag { >>> >>>> bool reboot_in_progress; >>> >>>> AVND_SU *failed_su; >>> >>>> bool cont_reboot_in_progress; >>> >>>> + >>> >>>> + /* the duration that amfnd should tolerate absence of any SC >>> */ >>> >>>> + SaTimeT scs_absence_max_duration; >>> >>>> + /* the timer for supervision of the absence of SC */ >>> >>>> + AVND_TMR sc_absence_tmr; >>> >>>> } AVND_CB; >>> >>>> >>> >>>> #define AVND_CB_NULL ((AVND_CB *)0) >>> >>>> 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 >>> >>>> @@ -650,18 +650,7 @@ typedef struct avnd_comp_tag { >>> >>>> (o_rec) = (o_rec)->next); \ >>> >>>> } >>> >>>> >>> >>>> -#define m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, o_rc) >\ >>> >>>> -{ \ >>> >>>> - AVSV_PARAM_INFO param; \ >>> >>>> - memset(¶m, 0, sizeof(AVSV_PARAM_INFO)); \ >>> >>>> - param.class_id = AVSV_SA_AMF_COMP; \ >>> >>>> - param.attr_id = saAmfCompOperState_ID; \ >>> >>>> - param.name = (comp)->name; \ >>> >>>> - param.act = AVSV_OBJ_OPR_MOD; \ >>> >>>> - *((uint32_t *)param.value) = m_NCS_OS_HTONL((comp)->oper); >\ >>> >>>> - param.value_len = sizeof(uint32_t); \ >>> >>>> - (o_rc) = avnd_di_object_upd_send((cb), ¶m); \ >>> >>>> -}; >>> >>>> +void m_AVND_COMP_OPER_STATE_AVD_SYNC(struct >avnd_cb_tag *cb, >>> const >>> >>>> AVND_COMP *comp, uint32_t& o_rc); >>> >>>> >>> >>>> /* macro to parse the clc cmd string */ >>> >>>> #define m_AVND_COMP_CLC_STR_PARSE(st, sc, ac, av, tav) \ >>> >>>> @@ -918,7 +907,7 @@ extern uint32_t avnd_comptype_oper_req(s >>> >>>> extern unsigned int avnd_comp_config_get_su(struct avnd_su_tag >>> *su); >>> >>>> extern int avnd_comp_config_reinit(AVND_COMP *comp); >>> >>>> extern void avnd_comp_delete(AVND_COMP *comp); >>> >>>> -extern void avnd_comp_pres_state_set(AVND_COMP *comp, >>> >>>> SaAmfPresenceStateT newstate); >>> >>>> +extern void avnd_comp_pres_state_set(const struct avnd_cb_tag >>> *cb, >>> >>>> AVND_COMP *comp, SaAmfPresenceStateT newstate); >>> >>>> bool comp_has_quiesced_assignment(const AVND_COMP *comp); >>> >>>> bool IsCompQualifiedAssignment(const AVND_COMP *comp); >>> >>>> /** >>> >>>> @@ -929,7 +918,7 @@ bool IsCompQualifiedAssignment(const AVN >>> >>>> * * Faulty NPI/PI components: launch the cleanup CLC CLI >>> script >>> >>>> */ >>> >>>> extern uint32_t comp_restart_initiate(AVND_COMP *comp); >>> >>>> -extern void comp_reset_restart_count(AVND_COMP *comp); >>> >>>> +extern void comp_reset_restart_count(const struct avnd_cb_tag >>> *cb, >>> >>>> AVND_COMP *comp); >>> >>>> extern void clear_error_report_alarm(AVND_COMP *comp); >>> >>>> bool nonrestartable(const AVND_COMP *comp); >>> >>>> uint32_t csi_count(const AVND_COMP *comp); >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_di.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_di.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_di.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_di.h >>> >>>> @@ -30,6 +30,8 @@ >>> >>>> #ifndef AVND_DI_H >>> >>>> #define AVND_DI_H >>> >>>> >>> >>>> +#include "amf_si_assign.h" >>> >>>> + >>> >>>> /* macro to find the matching record (based on the msg-id) */ >>> >>>> /* >>> >>>> * Caution!!! It is assumed that the msg-id is the 1st element >>> in >>> >>>> the message >>> >>>> @@ -81,5 +83,7 @@ uint32_t avnd_diq_rec_send(struct avnd_c >>> >>>> uint32_t avnd_di_reg_su_rsp_snd(struct avnd_cb_tag *cb, >>> SaNameT >>> >>>> *su_name, uint32_t ret_code); >>> >>>> uint32_t avnd_di_ack_nack_msg_send(struct avnd_cb_tag *cb, >>> uint32_t >>> >>>> rcv_id, uint32_t view_num); >>> >>>> extern void avnd_di_uns32_upd_send(int class_id, int attr_id, >>> const >>> >>>> SaNameT *dn, uint32_t value); >>> >>>> +void avnd_sync_sisu(struct avnd_cb_tag *cb); >>> >>>> +void avnd_sync_csicomp(struct avnd_cb_tag *cb); >>> >>>> >>> >>>> #endif /* !AVND_OPER_H */ >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_evt.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_evt.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_evt.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_evt.h >>> >>>> @@ -82,6 +82,7 @@ typedef enum avnd_evt_type { >>> >>>> AVND_EVT_TMR_CLC_PXIED_COMP_INST, >>> >>>> AVND_EVT_TMR_CLC_PXIED_COMP_REG, >>> >>>> AVND_EVT_TMR_HB_DURATION, >>> >>>> + AVND_EVT_TMR_SC_ABSENCE, >>> >>>> AVND_EVT_TMR_MAX, >>> >>>> >>> >>>> /* mds event types */ >>> >>>> @@ -128,6 +129,7 @@ typedef struct avnd_tmr_evt { >>> >>>> typedef struct avnd_mds_evt { >>> >>>> MDS_DEST mds_dest; /* mds address */ >>> >>>> NODE_ID node_id; >>> >>>> + NCSMDS_CHG i_change; >>> >>>> } AVND_MDS_EVT; >>> >>>> >>> >>>> /* HA STATE change event definition */ >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_mds.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_mds.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_mds.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_mds.h >>> >>>> @@ -31,10 +31,10 @@ >>> >>>> #define AVND_MDS_H >>> >>>> >>> >>>> /* In Service upgrade support */ >>> >>>> -#define AVND_MDS_SUB_PART_VERSION 5 >>> >>>> +#define AVND_MDS_SUB_PART_VERSION 6 >>> >>>> >>> >>>> #define AVND_AVD_SUBPART_VER_MIN 1 >>> >>>> -#define AVND_AVD_SUBPART_VER_MAX 5 >>> >>>> +#define AVND_AVD_SUBPART_VER_MAX 6 >>> >>>> >>> >>>> #define AVND_AVND_SUBPART_VER_MIN 1 >>> >>>> #define AVND_AVND_SUBPART_VER_MAX 1 >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_proc.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_proc.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_proc.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_proc.h >>> >>>> @@ -115,6 +115,7 @@ uint32_t avnd_evt_comp_admin_op_req (str >>> >>>> uint32_t avnd_evt_avd_admin_op_req_evh(struct avnd_cb_tag >*cb, >>> >>>> struct avnd_evt_tag *evt); >>> >>>> uint32_t avnd_evt_avd_hb_evh(struct avnd_cb_tag *, struct >>> >>>> avnd_evt_tag *); >>> >>>> uint32_t avnd_evt_tmr_avd_hb_duration_evh(struct avnd_cb_tag >>> *, >>> >>>> struct avnd_evt_tag *); >>> >>>> +uint32_t avnd_evt_tmr_sc_absence_evh(struct avnd_cb_tag *, >>> struct >>> >>>> avnd_evt_tag *); >>> >>>> uint32_t avnd_evt_avd_reboot_evh(struct avnd_cb_tag *, struct >>> >>>> avnd_evt_tag *); >>> >>>> >>> >>>> #endif >>> >>>> 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 >>> >>>> @@ -396,7 +396,7 @@ uint32_t avnd_su_oper_req(struct avnd_cb >>> >>>> extern uint32_t avnd_evt_su_admin_op_req(struct avnd_cb_tag >>> *cb, >>> >>>> struct avnd_evt_tag *evt); >>> >>>> extern struct avnd_comp_csi_rec *avnd_su_si_csi_rec_add(struct >>> >>>> avnd_cb_tag *, AVND_SU *, >>> >>>> struct >>> >>>> avnd_su_si_rec *, struct avsv_susi_asgn *, uint32_t *); >>> >>>> -extern void avnd_su_pres_state_set(AVND_SU *su, >>> SaAmfPresenceStateT >>> >>>> newstate); >>> >>>> +extern void avnd_su_pres_state_set(const struct avnd_cb_tag >>> *cb, >>> >>>> AVND_SU *su, SaAmfPresenceStateT newstate); >>> >>>> >>> >>>> extern void avnd_silist_init(struct avnd_cb_tag *cb); >>> >>>> extern struct avnd_su_si_rec *avnd_silist_getfirst(void); >>> >>>> @@ -406,7 +406,7 @@ extern struct avnd_su_si_rec *avnd_silis >>> >>>> extern bool sufailover_in_progress(const AVND_SU *su); >>> >>>> extern bool sufailover_during_nodeswitchover(const AVND_SU >>> *su); >>> >>>> extern bool all_csis_in_removed_state(const AVND_SU *su); >>> >>>> -extern void su_reset_restart_count_in_comps(const AVND_SU >*su); >>> >>>> +extern void su_reset_restart_count_in_comps(const struct >>> avnd_cb_tag >>> >>>> *cb, const AVND_SU *su); >>> >>>> extern bool all_comps_terminated_in_su(const AVND_SU *su); >>> >>>> >>> >>>> void su_increment_su_restart_count(AVND_SU& su); >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_tmr.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_tmr.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_tmr.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_tmr.h >>> >>>> @@ -46,6 +46,7 @@ typedef enum avnd_tmr_type { >>> >>>> AVND_TMR_CLC_PXIED_COMP_INST, /* proxied inst timer */ >>> >>>> AVND_TMR_CLC_PXIED_COMP_REG, /* proxied orphan timer >*/ >>> >>>> AVND_TMR_HB_DURATION, >>> >>>> + AVND_TMR_SC_ABSENCE, /* SC absence timer */ >>> >>>> AVND_TMR_QSCING_CMPL_RESP, /* Qscing complete timer */ >>> >>>> AVND_TMR_MAX >>> >>>> } AVND_TMR_TYPE; >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_util.h >>> >>>> b/osaf/services/saf/amf/amfnd/include/avnd_util.h >>> >>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_util.h >>> >>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_util.h >>> >>>> @@ -57,4 +57,8 @@ uint32_t amf_cbk_copy(AVSV_AMF_CBK_INFO >>> >>>> void amf_cbk_free(AVSV_AMF_CBK_INFO* cbk_info); >>> >>>> void nd2nd_avnd_msg_free(AVSV_ND2ND_AVND_MSG *msg); >>> >>>> >>> >>>> +void free_n2d_nd_csicomp_state_info(AVSV_DND_MSG *msg); >>> >>>> +void free_n2d_nd_sisu_state_info(AVSV_DND_MSG *msg); >>> >>>> +SaAisErrorT saImmOmInitialize_cond(SaImmHandleT *immHandle, >>> >>>> + const SaImmCallbacksT *immCallbacks, SaVersionT *version); >>> >>>> #endif /* !AVND_UTIL_H */ >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/main.cc >>> >>>> b/osaf/services/saf/amf/amfnd/main.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/main.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/main.cc >>> >>>> @@ -95,6 +95,7 @@ extern const AVND_EVT_HDLR g_avnd_func_l >>> >>>> avnd_evt_tmr_clc_pxied_comp_inst_evh, /* >>> >>>> AVND_EVT_TMR_CLC_PXIED_COMP_INST */ >>> >>>> avnd_evt_tmr_clc_pxied_comp_reg_evh, /* >>> >>>> AVND_EVT_TMR_CLC_PXIED_COMP_REG */ >>> >>>> avnd_evt_tmr_avd_hb_duration_evh, >>> >>>> + avnd_evt_tmr_sc_absence_evh, /* >AVND_EVT_TMR_SC_ABSENCE >>> */ >>> >>>> >>> >>>> /* mds event types */ >>> >>>> avnd_evt_mds_avd_up_evh, /* AVND_EVT_MDS_AVD_UP */ >>> >>>> @@ -119,6 +120,8 @@ extern const AVND_EVT_HDLR >g_avnd_func_l >>> >>>> avnd_evt_tmr_qscing_cmpl_evh /* >AVND_EVT_TMR_QSCING_CMPL >>> */ >>> >>>> }; >>> >>>> >>> >>>> +extern struct ImmutilWrapperProfile immutilWrapperProfile; >>> >>>> + >>> >>>> /* global task handle */ >>> >>>> NCSCONTEXT gl_avnd_task_hdl = 0; >>> >>>> >>> >>>> @@ -134,6 +137,8 @@ static uint32_t avnd_mbx_create(AVND_CB >>> >>>> >>> >>>> static uint32_t avnd_ext_intf_create(AVND_CB *); >>> >>>> >>> >>>> +static void hydra_config_get(AVND_CB *); >>> >>>> + >>> >>>> >>> >>>> static int __init_avnd(void) >>> >>>> { >>> >>>> @@ -173,6 +178,10 @@ int main(int argc, char *argv[]) >>> >>>> goto done; >>> >>>> } >>> >>>> >>> >>>> + immutilWrapperProfile.retryInterval = 400; >>> >>>> + immutilWrapperProfile.nTries = 25; >>> >>>> + immutilWrapperProfile.errorsAreFatal = 0; >>> >>>> + >>> >>>> /* should never return */ >>> >>>> avnd_main_process(); >>> >>>> >>> >>>> @@ -328,6 +337,16 @@ AVND_CB *avnd_cb_create() >>> >>>> /* iniialize the error escaltion paramaets */ >>> >>>> cb->node_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> >>> >>>> + cb->is_avd_down = true; >>> >>>> + cb->amfd_sync_required = false; >>> >>>> + >>> >>>> + // retrieve hydra configuration from IMM >>> >>>> + hydra_config_get(cb); >>> >>>> + cb->sc_absence_tmr.is_active = false; >>> >>>> + cb->sc_absence_tmr.type = AVND_TMR_SC_ABSENCE; >>> >>>> + >>> >>>> + memset(&cb->amf_nodeName, 0, sizeof(cb->amf_nodeName)); >>> >>>> + >>> >>>> /*** initialize avnd dbs ***/ >>> >>>> >>> >>>> avnd_silist_init(cb); >>> >>>> @@ -536,6 +555,8 @@ void avnd_main_process(void) >>> >>>> struct pollfd fds[4]; >>> >>>> nfds_t nfds = 3; >>> >>>> AVND_EVT *evt; >>> >>>> + SaAisErrorT result = SA_AIS_OK; >>> >>>> + SaAisErrorT rc = SA_AIS_OK; >>> >>>> >>> >>>> TRACE_ENTER(); >>> >>>> >>> >>>> @@ -578,7 +599,18 @@ void avnd_main_process(void) >>> >>>> >>> >>>> if (fds[FD_CLM].revents & POLLIN) { >>> >>>> TRACE("CLM event recieved"); >>> >>>> - saClmDispatch(avnd_cb->clmHandle, SA_DISPATCH_ALL); >>> >>>> + result = saClmDispatch(avnd_cb->clmHandle, >>> >>>> SA_DISPATCH_ALL); >>> >>>> + switch (result) { >>> >>>> + case SA_AIS_OK: >>> >>>> + break; >>> >>>> + case SA_AIS_ERR_BAD_HANDLE: >>> >>>> + usleep(100000); >>> >>>> + rc = avnd_clm_init(); >>> >>>> + osafassert(rc == SA_AIS_OK); >>> >>>> + break; >>> >>>> + default: >>> >>>> + goto done; >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> if (fds[FD_MBX].revents & POLLIN) { >>> >>>> @@ -621,9 +653,11 @@ void avnd_evt_process(AVND_EVT *evt) >>> >>>> } >>> >>>> >>> >>>> /* Temp: AvD Down Handling */ >>> >>>> - if (true == cb->is_avd_down){ >>> >>>> - LOG_IN("%s: AvD is down, dropping event >>> >>>> %u",__FUNCTION__,evt->type); >>> >>>> - goto done; >>> >>>> + if (cb->scs_absence_max_duration == 0) { >>> >>>> + if (true == cb->is_avd_down){ >>> >>>> + LOG_IN("%s: AvD is down, dropping event >>> >>>> %u",__FUNCTION__,evt->type); >>> >>>> + goto done; >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> /* log the event reception */ >>> >>>> @@ -660,3 +694,64 @@ static uint32_t avnd_evt_invalid_evh(AVN >>> >>>> LOG_NO("avnd_evt_invalid_func: %u", evt->type); >>> >>>> return NCSCC_RC_SUCCESS; >>> >>>> } >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************** >>> >>> >>>> >>> >>>> >>> >>>> + * Function: hydra_config_get >>> >>>> + * >>> >>>> + * Purpose: This function checks if Hydra configuration is >>> enabled >>> >>>> in IMM >>> >>>> + * then set the corresponding value to >>> >>>> scs_absence_max_duration >>> >>>> + * variable in avnd_cb. >>> >>>> + * >>> >>>> + * Input: None. >>> >>>> + * >>> >>>> + * Returns: None. >>> >>>> + * >>> >>>> + * NOTES: If IMM attribute fetching fails that means Hydra >>> >>>> configuration >>> >>>> + * is disabled thus sc_absence_max_duration is set to 0 >>> >>>> + * >>> >>>> + >>> >>>> >>> >*********************************************************** >***************/ >>> >>> >>>> >>> >>>> >>> >>>> +static void hydra_config_get(AVND_CB *cb) >>> >>>> +{ >>> >>>> + SaAisErrorT rc = SA_AIS_OK; >>> >>>> + SaImmHandleT immOmHandle; >>> >>>> + SaVersionT immVersion = { 'A', 2, 1 }; >>> >>>> + const SaImmAttrValuesT_2 **attributes; >>> >>>> + SaImmAccessorHandleT accessorHandle; >>> >>>> + SaNameT dn = {0, >>> "opensafImm=opensafImm,safApp=safImmService"}; >>> >>>> + SaImmAttrNameT attrName = >>> >>>> const_cast<SaImmAttrNameT>("scAbsenceAllowed"); >>> >>>> + SaImmAttrNameT attributeNames[] = {attrName, nullptr}; >>> >>>> + const SaUint32T *value = nullptr; >>> >>>> + >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + /* Set to default value */ >>> >>>> + cb->scs_absence_max_duration = 0; >>> >>>> + >>> >>>> + dn.length = strlen((char *)dn.value); >>> >>>> + >>> >>>> + immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + immutil_saImmOmAccessorInitialize(immOmHandle, >>> &accessorHandle); >>> >>>> + rc = immutil_saImmOmAccessorGet_2(accessorHandle, &dn, >>> >>>> attributeNames, >>> >>>> + (SaImmAttrValuesT_2 ***)&attributes); >>> >>>> + >>> >>>> + if (rc != SA_AIS_OK) { >>> >>>> + LOG_WA("saImmOmAccessorGet_2 FAILED %u for %s", rc, >>> >>>> dn.value); >>> >>>> + goto done; >>> >>>> + } >>> >>>> + >>> >>>> + value = immutil_getUint32Attr(attributes, attrName, 0); >>> >>>> + if (value == nullptr) { >>> >>>> + LOG_WA("immutil_getUint32Attr FAILED for %s", >>> dn.value); >>> >>>> + goto done; >>> >>>> + } >>> >>>> + >>> >>>> + avnd_cb->scs_absence_max_duration = *value * >>> SA_TIME_ONE_SECOND; >>> >>>> + >>> >>>> +done: >>> >>>> + immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> + immutil_saImmOmFinalize(immOmHandle); >>> >>>> + LOG_IN("scs_absence_max_duration: %llu", >>> >>>> avnd_cb->scs_absence_max_duration); >>> >>>> + >>> >>>> + TRACE_LEAVE(); >>> >>>> + return; >>> >>>> +} >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/mds.cc >>> >>>> b/osaf/services/saf/amf/amfnd/mds.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/mds.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/mds.cc >>> >>>> @@ -41,14 +41,14 @@ >>> >>>> const MDS_CLIENT_MSG_FORMAT_VER >avnd_avd_msg_fmt_map_table[] = >>> { >>> >>>> AVSV_AVD_AVND_MSG_FMT_VER_1, >AVSV_AVD_AVND_MSG_FMT_VER_2, >>> >>>> AVSV_AVD_AVND_MSG_FMT_VER_3, >AVSV_AVD_AVND_MSG_FMT_VER_4, >>> >>>> - AVSV_AVD_AVND_MSG_FMT_VER_4 >>> >>>> + AVSV_AVD_AVND_MSG_FMT_VER_4, >AVSV_AVD_AVND_MSG_FMT_VER_6 >>> >>>> }; >>> >>>> >>> >>>> /* messages from director */ >>> >>>> const MDS_CLIENT_MSG_FORMAT_VER >avd_avnd_msg_fmt_map_table[] = >>> { >>> >>>> AVSV_AVD_AVND_MSG_FMT_VER_1, >AVSV_AVD_AVND_MSG_FMT_VER_2, >>> >>>> AVSV_AVD_AVND_MSG_FMT_VER_3, >AVSV_AVD_AVND_MSG_FMT_VER_4, >>> >>>> - AVSV_AVD_AVND_MSG_FMT_VER_5 >>> >>>> + AVSV_AVD_AVND_MSG_FMT_VER_5, >AVSV_AVD_AVND_MSG_FMT_VER_6 >>> >>>> }; >>> >>>> >>> >>>> const MDS_CLIENT_MSG_FORMAT_VER >avnd_avnd_msg_fmt_map_table[] = >>> { >>> >>>> @@ -513,11 +513,26 @@ uint32_t avnd_mds_svc_evt(AVND_CB >*cb, M >>> >>>> >>> >>>> /* assign mds-dest for AVD, AVND & AVA as per the MDS event >>> */ >>> >>>> switch (evt_info->i_change) { >>> >>>> + case NCSMDS_NEW_ACTIVE: >>> >>>> + if (evt_info->i_svc_id == NCSMDS_SVC_ID_AVD) { >>> >>>> + LOG_NO("AVD NEW_ACTIVE, adest:%" PRIu64, >>> >>>> evt_info->i_dest); >>> >>>> + >>> >>>> + // sometimes NEW_ACTIVE director is received before >>> >>>> + // DOWN is received for the old director .. >>> >>>> + if (m_AVND_CB_IS_AVD_UP(cb)) { >>> >>>> + m_AVND_CB_AVD_UP_RESET(cb); >>> >>>> + } >>> >>>> + >>> >>>> + evt = avnd_evt_create(cb, AVND_EVT_MDS_AVD_UP, 0, >>> >>>> &evt_info->i_dest, 0, 0, 0); >>> >>>> + evt->info.mds.i_change = evt_info->i_change; >>> >>>> + } >>> >>>> + break; >>> >>>> case NCSMDS_UP: >>> >>>> switch (evt_info->i_svc_id) { >>> >>>> case NCSMDS_SVC_ID_AVD: >>> >>>> /* create the mds event */ >>> >>>> evt = avnd_evt_create(cb, AVND_EVT_MDS_AVD_UP, 0, >>> >>>> &evt_info->i_dest, 0, 0, 0); >>> >>>> + evt->info.mds.i_change = evt_info->i_change; >>> >>>> break; >>> >>>> >>> >>>> case NCSMDS_SVC_ID_AVA: >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/sidb.cc >>> >>>> b/osaf/services/saf/amf/amfnd/sidb.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/sidb.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/sidb.cc >>> >>>> @@ -281,7 +281,12 @@ static SaAmfCompCapabilityModelT get_com >>> >>>> >>> >>>> TRACE_ENTER2("comptype = '%s' : csi = '%s'", >>> comp_type->value, >>> >>>> csi_name->value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK ) { >>> >>>> + // TODO - what should comp_cap be? >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done1; >>> >>>> + } >>> >>>> immutil_saImmOmAccessorInitialize(immOmHandle, >>> &accessorHandle); >>> >>>> >>> >>>> get_cstype(immOmHandle, accessorHandle, csi_name, >>> &cs_type); >>> >>>> @@ -300,7 +305,7 @@ static SaAmfCompCapabilityModelT get_com >>> >>>> done: >>> >>>> immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> - >>> >>>> +done1: >>> >>>> TRACE_LEAVE2("%u", comp_cap); >>> >>>> return comp_cap; >>> >>>> } >>> >>>> 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 >>> >>>> @@ -56,13 +56,18 @@ static bool get_su_failover(const SaName >>> >>>> const_cast<SaImmAttrNameT>("saAmfSUType"), >>> >>>> nullptr >>> >>>> }; >>> >>>> + SaAisErrorT error; >>> >>>> >>> >>>> TRACE_ENTER2("'%s'", name->value); >>> >>>> >>> >>>> // TODO remove, just for test >>> >>>> LOG_NO("get_su_failover '%s'", name->value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK ) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done1; >>> >>>> + } >>> >>>> immutil_saImmOmAccessorInitialize(immOmHandle, >>> &accessorHandle); >>> >>>> >>> >>>> /* Use an attribute name list to avoid reading runtime >>> >>>> attributes which >>> >>>> @@ -92,6 +97,7 @@ static bool get_su_failover(const SaName >>> >>>> done: >>> >>>> immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> +done1: >>> >>>> TRACE_LEAVE2(); >>> >>>> return (sufailover == SA_TRUE) ? true : false; >>> >>>> } >>> >>>> @@ -171,7 +177,7 @@ uint32_t >avnd_evt_avd_reg_su_evh(AVND_CB >>> >>>> >>> >>>> if ((su->pres == SA_AMF_PRESENCE_INSTANTIATED) && >>> >>>> (su_is_instantiated == false)) { >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> rc = avnd_su_pres_fsm_run(cb, su, 0, >>> >>>> AVND_SU_PRES_FSM_EV_INST); >>> >>>> } >>> >>>> } >>> >>>> @@ -321,7 +327,11 @@ static uint32_t get_sirank(const SaNameT >>> >>>> // TODO remove, just for test >>> >>>> LOG_NO("get_sirank %s", dn->value); >>> >>>> >>> >>>> - immutil_saImmOmInitialize(&immOmHandle, nullptr, >>> &immVersion); >>> >>>> + error = saImmOmInitialize_cond(&immOmHandle, nullptr, >>> >>>> &immVersion); >>> >>>> + if (error != SA_AIS_OK ) { >>> >>>> + LOG_CR("saImmOmInitialize failed: %u", error); >>> >>>> + goto done; >>> >>>> + } >>> >>>> immutil_saImmOmAccessorInitialize(immOmHandle, >>> &accessorHandle); >>> >>>> >>> >>>> osafassert((error = >>> >>>> immutil_saImmOmAccessorGet_2(accessorHandle, dn, >>> >>>> @@ -338,6 +348,7 @@ static uint32_t get_sirank(const SaNameT >>> >>>> immutil_saImmOmAccessorFinalize(accessorHandle); >>> >>>> immutil_saImmOmFinalize(immOmHandle); >>> >>>> >>> >>>> +done: >>> >>>> return rank; >>> >>>> } >>> >>>> >>> >>>> @@ -466,7 +477,7 @@ uint32_t >avnd_evt_tmr_su_err_esc_evh(AVN >>> >>>> >>> >>>> TRACE("'%s'", su->name.value); >>> >>>> >>> >>>> - LOG_NO("'%s' SU restart probation timer expired", >>> >>>> su->name.value); >>> >>>> + LOG_NO("'%s' Component or SU restart probation timer >>> expired", >>> >>>> su->name.value); >>> >>>> >>> >>>> if (NCSCC_RC_SUCCESS == >>> m_AVND_CHECK_FOR_STDBY_FOR_EXT_COMP(cb, >>> >>>> su->su_is_external)) >>> >>>> goto done; >>> >>>> @@ -475,13 +486,13 @@ uint32_t >avnd_evt_tmr_su_err_esc_evh(AVN >>> >>>> case AVND_ERR_ESC_LEVEL_0: >>> >>>> su->comp_restart_cnt = 0; >>> >>>> su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> break; >>> >>>> case AVND_ERR_ESC_LEVEL_1: >>> >>>> su->su_restart_cnt = 0; >>> >>>> su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> cb->node_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> >>>> saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); >>> >>>> break; >>> >>>> case AVND_ERR_ESC_LEVEL_2: >>> >>>> @@ -557,7 +568,7 @@ uint32_t avnd_su_curr_info_del(AVND_CB * >>> >>>> if (!m_AVND_SU_IS_FAILED(su)) { >>> >>>> su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; >>> >>>> su->comp_restart_cnt = 0; >>> >>>> - su_reset_restart_count_in_comps(su); >>> >>>> + su_reset_restart_count_in_comps(cb, su); >>> >>>> su->su_restart_cnt = 0; >>> >>>> avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> >>>> saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); >>> >>>> /* stop su_err_esc_tmr TBD Later */ >>> >>>> @@ -630,7 +641,7 @@ uint32_t >avnd_evt_su_admin_op_req(AVND_C >>> >>>> >>> >>>> comp->admin_oper = false; >>> >>>> m_AVND_COMP_STATE_RESET(comp); >>> >>>> - avnd_comp_pres_state_set(comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_comp_pres_state_set(cb, comp, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> >>> >>>> m_AVND_COMP_OPER_STATE_SET(comp, >>> >>>> SA_AMF_OPERATIONAL_ENABLED); >>> >>>> avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, >>> >>>> saAmfCompOperState_ID, &comp->name, comp->oper); >>> >>>> @@ -645,7 +656,7 @@ uint32_t >avnd_evt_su_admin_op_req(AVND_C >>> >>>> m_AVND_SU_STATE_RESET(su); >>> >>>> 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); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> rc = avnd_di_oper_send(cb, su, 0); >>> >>>> >>> >>>> break; >>> >>>> @@ -684,26 +695,28 @@ done: >>> >>>> * @param su >>> >>>> * @param newstate >>> >>>> */ >>> >>>> -void avnd_su_pres_state_set(AVND_SU *su, SaAmfPresenceStateT >>> >>>> newstate) >>> >>>> +void avnd_su_pres_state_set(const AVND_CB *cb, AVND_SU *su, >>> >>>> SaAmfPresenceStateT newstate) >>> >>>> { >>> >>>> osafassert(newstate <= >>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> LOG_NO("'%s' Presence State %s => %s", su->name.value, >>> >>>> presence_state[su->pres], presence_state[newstate]); >>> >>>> su->pres = newstate; >>> >>>> - avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> saAmfSUPresenceState_ID, >>> >>>> &su->name, su->pres); >>> >>>> + if (cb->is_avd_down == false) { >>> >>>> + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, >>> >>>> saAmfSUPresenceState_ID, &su->name, su->pres); >>> >>>> + } >>> >>>> } >>> >>>> >>> >>>> /** >>> >>>> * @brief Resets component restart count for each component of >>> SU. >>> >>>> * @param su >>> >>>> */ >>> >>>> -void su_reset_restart_count_in_comps(const AVND_SU *su) >>> >>>> +void su_reset_restart_count_in_comps(const AVND_CB *cb, const >>> >>>> 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))) >>> >>> >>>> >>> >>>> { >>> >>>> - comp_reset_restart_count(comp); >>> >>>> + comp_reset_restart_count(cb, comp); >>> >>>> } >>> >>>> >>> >>>> } >>> >>>> 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 >>> >>>> @@ -447,7 +447,7 @@ static bool csi_of_same_si_in_assigning_ >>> >>>> * >>> >>>> * @return uns32 >>> >>>> */ >>> >>>> -static uint32_t assign_si_to_su(AVND_SU_SI_REC *si, AVND_SU >*su, >>> int >>> >>>> single_csi) >>> >>>> +static uint32_t assign_si_to_su(const AVND_CB *cb, >>> AVND_SU_SI_REC >>> >>>> *si, AVND_SU *su, int single_csi) >>> >>>> { >>> >>>> uint32_t rc = NCSCC_RC_SUCCESS; >>> >>>> AVND_COMP_CSI_REC *curr_csi; >>> >>>> @@ -553,7 +553,7 @@ static uint32_t assign_si_to_su(AVND_SU_ >>> >>>> osafassert(curr_csi); >>> >>>> >>> >>>> if (si->curr_state == SA_AMF_HA_ACTIVE) { >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> rc = avnd_comp_csi_assign(avnd_cb, >>> curr_csi->comp, >>> >>>> curr_csi); >>> >>>> } else { >>> >>>> curr_csi->single_csi_add_rem_in_si = >>> >>>> AVSV_SUSI_ACT_BASE; >>> >>>> @@ -657,7 +657,7 @@ uint32_t avnd_su_si_assign(AVND_CB *cb, >>> >>>> /* mark the si(s) assigning and assign to su */ >>> >>>> if (si) { >>> >>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_SET(si, >>> >>>> AVND_SU_SI_ASSIGN_STATE_ASSIGNING); >>> >>>> - rc = assign_si_to_su(si, su, true); >>> >>>> + rc = assign_si_to_su(cb, si, su, true); >>> >>>> } else { >>> >>>> for (curr_si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_FIRST(&su->si_list); >>> >>>> curr_si != nullptr; >>> >>>> @@ -685,7 +685,7 @@ uint32_t avnd_su_si_assign(AVND_CB *cb, >>> >>>> curr_si != nullptr; >>> >>>> curr_si = (AVND_SU_SI_REC >>> >>>> *)m_NCS_DBLIST_FIND_NEXT(&curr_si->su_dll_node)) { >>> >>>> >>> >>>> - rc = assign_si_to_su(curr_si, su, false); >>> >>>> + rc = assign_si_to_su(cb, curr_si, su, false); >>> >>>> if (NCSCC_RC_SUCCESS != rc) >>> >>>> goto done; >>> >>>> } >>> >>>> @@ -808,7 +808,7 @@ uint32_t avnd_su_si_remove(AVND_CB *cb, >>> >>>> osafassert(curr_csi != nullptr); >>> >>>> rc = avnd_comp_csi_remove(cb, curr_csi->comp, >>> >>>> curr_csi); >>> >>>> if (rc == NCSCC_RC_SUCCESS) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } else { >>> >>>> /* nothing to be done, termination already done in >>> >>>> quiescing/quiesced state */ >>> >>>> @@ -1357,11 +1357,17 @@ uint32_t >avnd_evt_avd_su_pres_evh(AVND_C >>> >>>> of openSAF SUs, so don't refresh config info if it >>> is >>> >>>> openSAF SU. */ >>> >>>> >>> >>>> if ((false == su->is_ncs) && >>> (avnd_comp_config_get_su(su) >>> >>>> != NCSCC_RC_SUCCESS)) { >>> >>>> - m_AVND_SU_REG_FAILED_SET(su); >>> >>>> - /* Will transition to instantiation-failed when >>> >>>> instantiated */ >>> >>>> - LOG_ER("'%s':FAILED", __FUNCTION__); >>> >>>> - rc = NCSCC_RC_FAILURE; >>> >>>> + if (cb->scs_absence_max_duration == 0) { >>> >>>> + m_AVND_SU_REG_FAILED_SET(su); >>> >>>> + /* Will transition to instantiation-failed when >>> >>>> instantiated */ >>> >>>> + LOG_ER("'%s':FAILED", __FUNCTION__); >>> >>>> + rc = NCSCC_RC_FAILURE; >>> >>>> goto done; >>> >>>> + } else { >>> >>>> + // @TODO(garylee) this is a temporary >>> workaround: >>> >>>> IMM is not accepting OM connections >>> >>>> + // and a component needs to be restarted. >>> >>>> + LOG_CR("'%s': failed to refresh components in >>> SU. >>> >>>> Attempt to reuse old config", __FUNCTION__); >>> >>>> + } >>> >>>> } >>> >>>> /* trigger su instantiation for pi su */ >>> >>>> if (m_AVND_SU_IS_PREINSTANTIABLE(su)) { >>> >>>> @@ -1372,7 +1378,7 @@ uint32_t >avnd_evt_avd_su_pres_evh(AVND_C >>> >>>> if (m_AVND_SU_IS_REG_FAILED(su)) { >>> >>>> /* The SU configuration is bad, we cannot do >>> much >>> >>>> other transition to failed state */ >>> >>>> TRACE_2("SU Configuration is bad"); >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> m_AVND_SU_ALL_TERM_RESET(su); >>> >>>> } else >>> >>>> osafassert(0); >>> >>>> @@ -1502,7 +1508,7 @@ uint32_t avnd_su_pres_fsm_run(AVND_CB >*c >>> >>>> 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); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> goto done; >>> >>>> } else if ((cb->term_state == >>> >>>> AVND_TERM_STATE_NODE_SWITCHOVER_STARTED) && >>> >>>> (cb->oper_state == SA_AMF_OPERATIONAL_DISABLED) && >>> >>>> @@ -1788,6 +1794,11 @@ uint32_t >avnd_su_pres_st_chng_prc(AVND_C >>> >>>> reset_suRestart_flag(su); >>> >>>> //Ask AMFD to remove assignments. >>> >>>> rc = avnd_di_oper_send(cb, su, >>> >>>> SA_AMF_COMPONENT_FAILOVER); >>> >>>> + if (cb->is_avd_down == true) { >>> >>>> + LOG_WA("Director is down. Remove all SIs from >>> '%s'", >>> >>>> su->name.value); >>> >>>> + avnd_su_si_del(avnd_cb, &su->name); >>> >>>> + } >>> >>>> + >>> >>>> } >>> >>>> if ((SA_AMF_PRESENCE_RESTARTING == prv_st) && >>> >>>> (SA_AMF_PRESENCE_INSTANTIATION_FAILED == final_st)) { >>> >>>> TRACE("Restarting -> Instantiation Failed"); >>> >>>> @@ -1960,11 +1971,11 @@ uint32_t >avnd_su_pres_uninst_suinst_hdle >>> >>>> } >>> >>>> >>> >>>> /* transition to instantiating state */ >>> >>>> - avnd_su_pres_state_set(su, >SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> >>> >>>> done: >>> >>>> if (rc == NCSCC_RC_FAILURE) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -2015,7 +2026,7 @@ uint32_t >avnd_su_pres_insting_suterm_hdl >>> >>>> } /* for */ >>> >>>> >>> >>>> /* transition to terminating state */ >>> >>>> - avnd_su_pres_state_set(su, >SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> >>> >>>> done: >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -2095,7 +2106,7 @@ uint32_t >avnd_su_pres_insting_compinst_h >>> >>>> /* determine su presence state */ >>> >>>> m_AVND_SU_IS_INSTANTIATED(su, is); >>> >>>> if (true == is) { >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> @@ -2114,7 +2125,7 @@ uint32_t >avnd_su_pres_insting_compinst_h >>> >>>> if (curr_csi->single_csi_add_rem_in_si == >>> >>>> AVSV_SUSI_ACT_ASGN) { >>> >>>> // we are adding a single CSI, the comp is >>> instantiated >>> >>>> so now we're done >>> >>>> curr_csi->single_csi_add_rem_in_si = >>> AVSV_SUSI_ACT_BASE; >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> goto done; >>> >>>> } >>> >>>> >>> >>>> @@ -2130,7 +2141,7 @@ uint32_t >avnd_su_pres_insting_compinst_h >>> >>>> } else { >>> >>>> /* => si assignment done */ >>> >>>> TRACE("SI Assignment done"); >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> @@ -2172,7 +2183,7 @@ uint32_t avnd_su_pres_insting_compinstfa >>> >>>> su->name.value, compname); >>> >>>> >>> >>>> /* transition to inst-failed state */ >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> m_AVND_SU_ALL_TERM_RESET(su); >>> >>>> >>> >>>> /* >>> >>>> @@ -2328,11 +2339,11 @@ uint32_t >avnd_su_pres_inst_suterm_hdler( >>> >>>> if ((csi->comp->pres == SA_AMF_PRESENCE_UNINSTANTIATED) >>> && >>> >>>> (cb->term_state == >>> >>>> AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED)) { >>> >>>> m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(csi, >>> >>>> AVND_COMP_CSI_ASSIGN_STATE_REMOVED); >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> AVND_COMP_CSI_REC *assigned_csi = >>> >>>> get_next_assigned_csi_from_end(si); >>> >>>> if (assigned_csi == nullptr) { >>> >>>> //Components of all the CSIs in SI are cleaned >>> up. >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> goto done; >>> >>>> } else { >>> >>>> //One CSI is still assigned. >>> >>>> @@ -2348,7 +2359,7 @@ uint32_t >avnd_su_pres_inst_suterm_hdler( >>> >>>> >>> >>>> /* transition to terminating state */ >>> >>>> if (su->pres != SA_AMF_PRESENCE_TERMINATING) >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> >>> >>>> done: >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -2457,14 +2468,14 @@ uint32_t >avnd_su_pres_inst_surestart_hdl >>> >>>> 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(su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> break; >>> >>>> } >>> >>>> } >>> >>>> } /* for */ >>> >>>> if ((su_evaluate_restarting_state(su) == true) && >>> >>>> (!m_AVND_SU_IS_FAILED(su))) { >>> >>>> TRACE("Mark su restarting"); >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> @@ -2498,7 +2509,7 @@ uint32_t avnd_su_pres_inst_surestart_hdl >>> >>>> } >>> >>>> if ((all_csis_in_restarting_state(su) == true) && >>> >>>> (!m_AVND_SU_IS_FAILED(su))) { >>> >>>> TRACE("All CSIs are in restarting state, so marking >>> SU >>> >>>> restarting"); >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> } >>> >>>> >>> >>>> @@ -2546,7 +2557,7 @@ uint32_t >avnd_su_pres_inst_comprestart_h >>> >>>> } >>> >>>> } >>> >>>> if (su_evaluate_restarting_state(su) == true) >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> >>> >>>> if (!m_AVND_SU_IS_PREINSTANTIABLE(su)) { >>> >>>> @@ -2569,7 +2580,7 @@ uint32_t >avnd_su_pres_inst_comprestart_h >>> >>>> } >>> >>>> if (all_csis_in_restarting_state(su) == true) >>> { >>> >>>> TRACE_2("All CSIs are in restarting >>> state, >>> >>>> so marking SU restarting"); >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> } >>> >>>> done: >>> >>>> @@ -2600,7 +2611,7 @@ uint32_t >avnd_su_pres_inst_compterming_h >>> >>>> //A SU enters in TERMINATING state when any component is >>> >>>> terminating. >>> >>>> if (((comp != nullptr) && (comp->admin_oper == true)) || >>> >>>> m_AVND_SU_IS_FAILED(su) || (su->admin_op_Id == >>> >>>> SA_AMF_ADMIN_RESTART)) { >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> } >>> >>>> >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -2637,7 +2648,7 @@ uint32_t >avnd_su_pres_terming_compinst_h >>> >>>> /* determine if su can be transitioned to instantiated >>> >>>> state */ >>> >>>> m_AVND_SU_IS_INSTANTIATED(su, is); >>> >>>> if (true == is) { >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> } >>> >>>> if (m_AVND_SU_IS_RESTART(su)) { >>> >>>> if (su->admin_op_Id == SA_AMF_ADMIN_RESTART) >>> >>>> @@ -2740,7 +2751,7 @@ uint32_t >avnd_su_pres_terming_comptermfa >>> >>>> } >>> >>>> >>> >>>> /* transition to term-failed state */ >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_TERMINATION_FAILED); >>> >>>> >>> >>>> if (true == su->is_ncs) { >>> >>>> char reason[SA_MAX_NAME_LENGTH + 64]; >>> >>>> @@ -2814,7 +2825,7 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> if (m_AVND_SU_IS_FAILED(su)) { >>> >>>> TRACE("SU is in Failed state"); >>> >>>> if (pi_su_all_comps_uninstantiated(*su) == true) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> >>> >>>> if (m_AVND_SU_IS_RESTART(su)) { >>> >>>> for (curr_comp = >>> >>>> >>> >m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_LAST(&s >u->comp_list)); >>> >>> >>>> >>> >>>> >>> >>>> @@ -2851,7 +2862,7 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> 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(su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> break; >>> >>>> } >>> >>>> } >>> >>>> @@ -2862,9 +2873,9 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> (m_AVND_COMP_IS_RESTART_DIS(comp))) { >>> >>>> TRACE("Admin operation on component"); >>> >>>> if (pi_su_all_comps_uninstantiated(*su) == true) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> avnd_comp_clc_fsm_run(cb, comp, >>> >>>> AVND_COMP_CLC_PRES_FSM_EV_INST); >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> } else { >>> >>>> TRACE("Admin operation on SU"); >>> >>>> for (curr_comp = >>> >>>> >>> >m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_PREV(& >comp->su_dll_node)); >>> >>> >>>> >>> >>>> >>> >>>> @@ -2904,7 +2915,7 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> } >>> >>>> } >>> >>>> if (pi_su_all_comps_uninstantiated(*su) == true) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> else if ((curr_comp == nullptr) && (su->admin_op_Id >>> == >>> >>>> SA_AMF_ADMIN_RESTART)) { >>> >>>> /* >>> >>>> It means it is a SU comprising of assigned >>> non >>> >>>> restartable comps and >>> >>>> @@ -2938,7 +2949,7 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> /* get here when a CSI is removed from a component >>> in >>> >>>> an NPI SU */ >>> >>>> assert(curr_csi->si->single_csi_add_rem_in_si == >>> AVSV_SUSI_ACT_DEL); >>> >>>> rc = avnd_su_si_oper_done(cb, su, curr_csi->si); >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> goto done; >>> >>>> } >>> >>>> >>> >>>> @@ -2959,7 +2970,7 @@ uint32_t >avnd_su_pres_terming_compuninst >>> >>>> >>> >>>> if (all_csis_in_assigned_state(su) || >>> >>>> all_csis_in_removed_state(su)) { >>> >>>> TRACE("SI Assignment done"); >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_UNINSTANTIATED); >>> >>>> goto done; >>> >>>> } >>> >>>> >>> >>>> @@ -3035,7 +3046,7 @@ uint32_t >avnd_su_pres_restart_suterm_hdl >>> >>>> } /* for */ >>> >>>> >>> >>>> /* transition to terminating state */ >>> >>>> - avnd_su_pres_state_set(su, >SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> >>> >>>> done: >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -3155,7 +3166,7 @@ uint32_t >avnd_su_pres_restart_compinst_h >>> >>>> curr_comp = >>> >>>> >>> >m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(& >curr_comp->su_dll_node))) >>> >>> >>>> >>> >>>> { >>> >>>> 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); >>> >>>> + avnd_su_pres_state_set(cb, 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; >>> >>>> @@ -3190,7 +3201,7 @@ 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); >>> >>>> if (su->pres != SA_AMF_PRESENCE_INSTANTIATED) >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, 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); >>> >>>> @@ -3285,7 +3296,7 @@ uint32_t >avnd_su_pres_restart_comptermin >>> >>>> } /* for */ >>> >>>> >>> >>>> /* transition to terminating state */ >>> >>>> - avnd_su_pres_state_set(su, >SA_AMF_PRESENCE_TERMINATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> SA_AMF_PRESENCE_TERMINATING); >>> >>>> >>> >>>> done: >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> @@ -3322,7 +3333,7 @@ uint32_t avnd_su_pres_inst_compinstfail_ >>> >>>> su->name.value, compname); >>> >>>> >>> >>>> /* transition to inst-failed state */ >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> m_AVND_SU_ALL_TERM_RESET(su); >>> >>>> >>> >>>> /* >>> >>>> @@ -3563,7 +3574,7 @@ uint32_t >avnd_su_pres_terming_surestart_ >>> >>>> } >>> >>>> if (all_csis_in_restarting_state(su) == true) >>> { >>> >>>> TRACE("All CSIs are in restarting >>> state, so >>> >>>> marking SU restarting"); >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_RESTARTING); >>> >>>> } >>> >>>> } >>> >>>> done: >>> >>>> @@ -3658,7 +3669,7 @@ uint32_t >avnd_su_pres_terming_suinst_hdl >>> >>>> } /* for */ >>> >>>> if ((curr_comp) && (curr_comp->pres == >>> >>>> SA_AMF_PRESENCE_INSTANTIATING) && >>> >>>> (su->pres == SA_AMF_PRESENCE_TERMINATING)) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> } >>> >>>> >>> >>>> /*TODO_SURESTART:Will relook for NPI SU as there seems a >>> rare >>> >>>> possbility for su instantiate >>> >>>> @@ -3685,12 +3696,12 @@ uint32_t >avnd_su_pres_terming_suinst_hdl >>> >>>> } >>> >>>> if ((csi->comp) && (csi->comp->pres == >>> >>>> SA_AMF_PRESENCE_INSTANTIATING) && >>> >>>> (su->pres == SA_AMF_PRESENCE_TERMINATING)) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATING); >>> >>>> } >>> >>>> >>> >>>> done: >>> >>>> if (rc == NCSCC_RC_FAILURE) >>> >>>> - avnd_su_pres_state_set(su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> + avnd_su_pres_state_set(cb, su, >>> >>>> SA_AMF_PRESENCE_INSTANTIATION_FAILED); >>> >>>> TRACE_LEAVE2("%u", rc); >>> >>>> return rc; >>> >>>> } >>> >>>> @@ -3745,7 +3756,7 @@ uint32_t >avnd_su_pres_inst_compinst_hdle >>> >>>> m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, >>> >>>> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED); >>> >>>> >>> >>>> if (su->pres != SA_AMF_PRESENCE_INSTANTIATED) >>> >>>> - avnd_su_pres_state_set(su, >>> SA_AMF_PRESENCE_INSTANTIATED); >>> >>>> + avnd_su_pres_state_set(cb, 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); >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/tmr.cc >>> >>>> b/osaf/services/saf/amf/amfnd/tmr.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/tmr.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/tmr.cc >>> >>>> @@ -38,6 +38,7 @@ static const char *tmr_type[] = >>> >>>> "proxied inst timer", >>> >>>> "proxied orphan timer", >>> >>>> "HB tmr", >>> >>>> + "SC absence timer", >>> >>>> "Qscing Complete", >>> >>>> "AVND_TMR_MAX" >>> >>>> }; >>> >>>> diff --git a/osaf/services/saf/amf/amfnd/util.cc >>> >>>> b/osaf/services/saf/amf/amfnd/util.cc >>> >>>> --- a/osaf/services/saf/amf/amfnd/util.cc >>> >>>> +++ b/osaf/services/saf/amf/amfnd/util.cc >>> >>>> @@ -30,7 +30,7 @@ >>> >>>> >>> >>>> >>> >*********************************************************** >******************* >>> >>> >>>> >>> >>>> >>> >>>> */ >>> >>>> - >>> >>>> +#include <immutil.h> >>> >>>> #include <sys/types.h> >>> >>>> #include <sys/stat.h> >>> >>>> #include <fcntl.h> >>> >>>> @@ -365,6 +365,12 @@ void dnd_msg_free(AVSV_DND_MSG *msg) >>> >>>> case AVSV_D2N_PG_TRACK_ACT_RSP_MSG: >>> >>>> free_d2n_pg_msg_info(msg); >>> >>>> break; >>> >>>> + case AVSV_N2D_ND_SISU_STATE_INFO_MSG: >>> >>>> + free_n2d_nd_sisu_state_info(msg); >>> >>>> + break; >>> >>>> + case AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG: >>> >>>> + free_n2d_nd_csicomp_state_info(msg); >>> >>>> + break; >>> >>>> default: >>> >>>> break; >>> >>>> } >>> >>>> @@ -638,6 +644,7 @@ void amf_cbk_free(AVSV_AMF_CBK_INFO >*cbk >>> >>>> >>> >>>> /* free the cbk-info ptr */ >>> >>>> delete cbk_info; >>> >>>> + cbk_info = nullptr; >>> >>>> >>> >>>> return; >>> >>>> } >>> >>>> @@ -667,3 +674,147 @@ void >nd2nd_avnd_msg_free(AVSV_ND2ND_AVND >>> >>>> >>> >>>> return; >>> >>>> } >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : free_n2d_nd_csicomp_state_info >>> >>>> + >>> >>>> + Description : This routine frees csicomp_state message. >>> >>>> + >>> >>>> + Arguments : msg - ptr to the msg >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void free_n2d_nd_csicomp_state_info(AVSV_DND_MSG *msg) >>> >>>> +{ >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + AVSV_N2D_ND_CSICOMP_STATE_MSG_INFO *info = nullptr; >>> >>>> + AVSV_CSICOMP_STATE_MSG *ptr = nullptr; >>> >>>> + AVSV_CSICOMP_STATE_MSG *next_ptr = nullptr; >>> >>>> + >>> >>>> + AVSV_COMP_STATE_MSG *comp_ptr = nullptr; >>> >>>> + AVSV_COMP_STATE_MSG *comp_next_ptr = nullptr; >>> >>>> + >>> >>>> + if (msg == nullptr) >>> >>>> + goto done; >>> >>>> + >>> >>>> + osafassert(msg->msg_type == >>> AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG); >>> >>>> + >>> >>>> + info = &msg->msg_info.n2d_nd_csicomp_state_info; >>> >>>> + osafassert(info); >>> >>>> + >>> >>>> + ptr = info->csicomp_list; >>> >>>> + >>> >>>> + TRACE("%u csicomp records to free", info->num_csicomp); >>> >>>> + >>> >>>> + while (ptr != nullptr) { >>> >>>> + TRACE("freeing %s:%s", (char*)ptr->safCSI.value, >>> >>>> (char*)ptr->safComp.value); >>> >>>> + next_ptr = ptr->next; >>> >>>> + delete ptr; >>> >>>> + ptr = next_ptr; >>> >>>> + } >>> >>>> + >>> >>>> + comp_ptr = info->comp_list; >>> >>>> + >>> >>>> + TRACE("%u comp records to free", info->num_comp); >>> >>>> + >>> >>>> + while (comp_ptr != nullptr) { >>> >>>> + comp_next_ptr = comp_ptr->next; >>> >>>> + delete comp_ptr; >>> >>>> + comp_ptr = comp_next_ptr; >>> >>>> + } >>> >>>> + >>> >>>> + info->num_csicomp = 0; >>> >>>> + info->csicomp_list = nullptr; >>> >>>> + info->num_comp = 0; >>> >>>> + info->comp_list = nullptr; >>> >>>> + >>> >>>> +done: >>> >>>> + TRACE_LEAVE(); >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : free_n2d_nd_sisu_state_info >>> >>>> + >>> >>>> + Description : This routine frees sisu_state message. >>> >>>> + >>> >>>> + Arguments : msg - ptr to the msg >>> >>>> + >>> >>>> + Return Values : None >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +void free_n2d_nd_sisu_state_info(AVSV_DND_MSG *msg) >>> >>>> +{ >>> >>>> + TRACE_ENTER(); >>> >>>> + >>> >>>> + AVSV_N2D_ND_SISU_STATE_MSG_INFO *info = >>> >>>> &msg->msg_info.n2d_nd_sisu_state_info; >>> >>>> + AVSV_SISU_STATE_MSG *ptr = info->sisu_list; >>> >>>> + AVSV_SISU_STATE_MSG *next_ptr = nullptr; >>> >>>> + AVSV_SU_STATE_MSG *su_ptr = info->su_list; >>> >>>> + AVSV_SU_STATE_MSG *su_next_ptr = nullptr; >>> >>>> + >>> >>>> + if (msg == nullptr) >>> >>>> + goto done; >>> >>>> + >>> >>>> + osafassert(msg->msg_type == >>> AVSV_N2D_ND_SISU_STATE_INFO_MSG); >>> >>>> + >>> >>>> + info = &msg->msg_info.n2d_nd_sisu_state_info; >>> >>>> + osafassert(info); >>> >>>> + >>> >>>> + ptr = info->sisu_list; >>> >>>> + >>> >>>> + TRACE("%u sisu records to free", info->num_sisu); >>> >>>> + >>> >>>> + while (ptr != nullptr) { >>> >>>> + TRACE("freeing %s:%s", (char*)ptr->safSI.value, >>> >>>> (char*)ptr->safSU.value); >>> >>>> + next_ptr = ptr->next; >>> >>>> + delete ptr; >>> >>>> + ptr = next_ptr; >>> >>>> + } >>> >>>> + >>> >>>> + su_ptr = info->su_list; >>> >>>> + >>> >>>> + TRACE("%u su records to free", info->num_su); >>> >>>> + >>> >>>> + while (su_ptr != nullptr) { >>> >>>> + su_next_ptr = su_ptr->next; >>> >>>> + delete su_ptr; >>> >>>> + su_ptr = su_next_ptr; >>> >>>> + } >>> >>>> + >>> >>>> + >>> >>>> + info->num_sisu = 0; >>> >>>> + info->sisu_list = nullptr; >>> >>>> + info->num_su = 0; >>> >>>> + info->su_list = nullptr; >>> >>>> + >>> >>>> +done: >>> >>>> + TRACE_LEAVE(); >>> >>>> +} >>> >>>> + >>> >>>> >>> >+/********************************************************* >******************* >>> >>> >>>> >>> >>>> >>> >>>> + Name : saImmOmInitialize_cond >>> >>>> + >>> >>>> + Description : A wrapper of saImmOmInitialize for headless. >>> >>>> + >>> >>>> + Arguments : msg - ptr to the msg >>> >>>> + >>> >>>> + Return Values : SA_AIS_OK or other SA_AIS_ERR_xxx code >>> >>>> + >>> >>>> + Notes : None. >>> >>>> >>> >+********************************************************** >********************/ >>> >>> >>>> >>> >>>> >>> >>>> +SaAisErrorT saImmOmInitialize_cond(SaImmHandleT *immHandle, >>> >>>> + const SaImmCallbacksT *immCallbacks, SaVersionT *version) >>> >>>> +{ >>> >>>> + if (avnd_cb->scs_absence_max_duration == 0) { >>> >>>> + return immutil_saImmOmInitialize(immHandle, >>> immCallbacks, >>> >>>> version); >>> >>>> + } >>> >>>> + >>> >>>> + // if headless mode is enabled, don't retry as IMMA already >>> has >>> >>>> a 30s >>> >>>> + // initial connection timeout towards IMMND. If we retry, we >>> may >>> >>>> + // cause the watchdog to kill AMFND. >>> >>>> + return saImmOmInitialize(immHandle, immCallbacks, version); >>> >>>> +} >>> >>>> >>> >>> >>> >> >>> > >>> >>> >>> ------------------------------------------------------------------------------ >>> Site24x7 APM Insight: Get Deep Visibility into Application >>> Performance >>> APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month >>> Monitor end-to-end web transactions and take corrective actions now >>> Troubleshoot faster and improve end-user experience. Signup Now! >>> http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 >>> _______________________________________________ >>> Opensaf-devel mailing list >>> Opensaf-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel > ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel