Isolation should happen immediately, but it is the recovery and repair actions that can sometimes be postponed until the system controllers are back.
regards, Anders Widell On 03/02/2016 12:18 PM, Mathivanan Naickan Palanivelu wrote: > 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 > ------------------------------------------------------------------------------ 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