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.

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(&param, 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), &param);
>>> +}
>>> +
>>> +
>>>   /**
>>>    * @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_FIRST(&comp->csi_list));
>>>
>>> +                csi != nullptr;
>>> +                csi =
>>> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&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(&param, 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), &param); \
>>> -};
>>> +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(&su->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

Reply via email to