ack, code review only. Minor comments below. /Thanks HansN

On 01/05/2016 02:33 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             |   46 ++-
>   osaf/services/saf/amf/amfnd/compdb.cc           |   45 ++-
>   osaf/services/saf/amf/amfnd/di.cc               |  419 
> +++++++++++++++++++++++-
>   osaf/services/saf/amf/amfnd/err.cc              |  111 +++++-
>   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, 1062 insertions(+), 157 deletions(-)
>
>
> Outline changes:
> . amfnd does not reboot if amfd is down
> . Failover/switchover recovery is limited during headless, only
> componentRestart and suRestart is supported
> . 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
> @@ -458,7 +458,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);
> @@ -777,7 +777,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;
> @@ -935,8 +935,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)) {
> @@ -993,7 +995,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);
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_FLAG_CHANGE);
>               }
> @@ -1010,7 +1014,9 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>                               m_AVND_COMP_FAILED_RESET(comp);
>                               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_FLAG_CHANGE);
>                               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;
>                               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1099,7 +1105,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;
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1154,7 +1162,9 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>                               m_AVND_COMP_FAILED_RESET(comp);
>                               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_FLAG_CHANGE);
>                               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;
>                               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1179,7 +1189,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_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
>   
>                       m_AVND_SU_FAILED_SET(comp->su);
> @@ -1201,7 +1213,9 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>                       m_AVND_COMP_FAILED_RESET(comp);
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_FLAG_CHANGE);
>                       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;
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1216,7 +1230,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;
>                               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1230,7 +1246,9 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>                       m_AVND_COMP_FAILED_SET(comp);
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_FLAG_CHANGE);
>                       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;
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_OPER_STATE);
> @@ -1440,7 +1458,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;
>       }
> @@ -1460,7 +1478,7 @@ uint32_t avnd_comp_clc_uninst_inst_hdler
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_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:
> @@ -1534,7 +1552,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);
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, AVND_CKPT_COMP_CONFIG);
>   
>       TRACE_LEAVE();
> @@ -1625,7 +1643,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();
> @@ -1660,7 +1678,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);
>   
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
> @@ -1720,7 +1738,7 @@ uint32_t avnd_comp_clc_xxxing_cleansucc_
>                       /* Cleanup was already initiated when comp faulted with 
> comprestart recovery.
>                          If further escalation 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(cb, comp, 
> SA_AMF_PRESENCE_UNINSTANTIATED);
>               goto done;
>       }
>   
> @@ -1765,7 +1783,7 @@ uint32_t avnd_comp_clc_xxxing_cleansucc_
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CLC_REG_TMR);
>               }
>               /* => 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();
> @@ -1791,7 +1809,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;
> @@ -1823,7 +1841,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);
>   
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
> @@ -1884,7 +1902,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);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
>   
> @@ -1946,7 +1964,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);
>   
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
> @@ -2035,9 +2053,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);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
>   done:
> @@ -2071,7 +2089,7 @@ uint32_t avnd_comp_clc_inst_orph_hdler(A
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, AVND_CKPT_COMP_ORPH_TMR);
>   
>       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();
> @@ -2097,7 +2115,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)) {
> @@ -2170,7 +2188,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) {
>               /*
> @@ -2272,7 +2290,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);
>   
>       if ((cb->term_state == AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED) &&
>                       all_comps_terminated()) {
> @@ -2367,7 +2385,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;
> @@ -2412,7 +2430,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);
>   
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
> @@ -2511,7 +2529,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();
> @@ -2557,7 +2575,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);
>   
> @@ -2587,7 +2605,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;
> @@ -2618,7 +2636,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;
> @@ -2683,7 +2701,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);
>   
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
> AVND_CKPT_COMP_CONFIG);
>       }
> @@ -3067,12 +3085,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)
>   {
> @@ -121,7 +122,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,
> @@ -143,6 +149,7 @@ static void clm_to_amf_node(void)
>   done:
>       immutil_saImmOmSearchFinalize(searchHandle);
>       immutil_saImmOmFinalize(immOmHandle);
> +done1:
>       TRACE_LEAVE2("%u", error);
>   }
>   
> @@ -173,6 +180,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.
> @@ -253,6 +258,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;
> @@ -2818,7 +2829,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;
>   
> @@ -2838,7 +2849,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 */
> @@ -2877,12 +2890,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);
> +             }
>       }
>   }
>   /**
> @@ -2902,6 +2917,29 @@ 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;
>   }
> @@ -1538,10 +1545,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__,
> @@ -1678,6 +1690,7 @@ done:
>       delete [] path_prefix;
>       avnd_comptype_delete(comptype);
>       immutil_saImmOmFinalize(immOmHandle);
> +done1:
>       TRACE_LEAVE();
>       return res;
>   }
> @@ -1718,7 +1731,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;
>   
> @@ -1837,7 +1850,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;
> @@ -1868,6 +1885,7 @@ unsigned int avnd_comp_config_get_su(AVN
>       (void)immutil_saImmOmSearchFinalize(searchHandle);
>    done1:
>       immutil_saImmOmFinalize(immOmHandle);
> + done:
>       TRACE_LEAVE();
>       return rc;
>   }
> @@ -1886,6 +1904,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);
>   
> @@ -1902,14 +1921,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);
> @@ -1919,8 +1945,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
> @@ -271,6 +271,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
> @@ -340,6 +444,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();
> @@ -354,10 +459,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;
>   
> @@ -424,9 +539,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;
> @@ -459,15 +604,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;
>   }
> @@ -491,6 +715,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);
>   
> @@ -575,6 +806,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) {
[HansN] indentation is missing.
> +        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));
>   
> @@ -671,6 +907,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 */
> @@ -791,6 +1032,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 */
> @@ -1011,8 +1256,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);
> @@ -1140,3 +1394,154 @@ uint32_t avnd_evt_tmr_avd_hb_duration_ev
>   
>       return NCSCC_RC_SUCCESS;
>   }
> +
> +/**
> + * 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
> @@ -420,6 +420,7 @@ uint32_t avnd_err_process(AVND_CB *cb, A
>               goto done;
>   
>    done:
> +
>       TRACE_LEAVE2("Return value:'%u'", rc);
>       return rc;
>   }
> @@ -480,8 +481,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:
> @@ -785,11 +789,56 @@ 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);
> +                     m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_FLAG_CHANGE);
> +
> +                     /* 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
> +             // for now, just terminate all components in the SU
> +             if (cb->is_avd_down == true) {
> +                     AVND_COMP *comp;
> +
> +                     LOG_NO("Terminating components of '%s'(abruptly & 
> unordered)",su->name.value);
> +                     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))) 
> {
> +                             if (comp->su->su_is_external)
> +                                     continue;
> +
> +                             rc = avnd_comp_clc_fsm_run(cb, comp, 
> AVND_COMP_CLC_PRES_FSM_EV_CLEANUP);
> +                             if (NCSCC_RC_SUCCESS != rc) {
> +                                     LOG_ER("'%s' termination failed", 
> comp->name.value);
> +                                     goto done;
> +                             }
> +                     }
> +             }
>       }
>   
>    done:
> @@ -837,7 +886,7 @@ 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:
>   
> @@ -932,7 +981,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 {
> @@ -944,6 +993,35 @@ uint32_t avnd_err_rcvr_node_switchover(A
>               }
>       }
>   
> +     // 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) {
> +             /* 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 node switchover while controllers are 
> down. Recovery is node failfast.");
> +             LOG_ER("Exiting to aid fast node reboot");
> +             exit(1);
> +     }
> +
>    done:
>       TRACE_LEAVE2("%u", rc);
>       return rc;
> @@ -1007,7 +1085,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);
> @@ -1089,7 +1177,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;
> @@ -1196,7 +1284,7 @@ uint32_t avnd_err_restart_esc_level_0(AV
>               tmr_comp_err_esc_stop(cb, su);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_ERR_ESC_TMR);
>               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)) {
> @@ -1288,7 +1376,7 @@ uint32_t avnd_err_restart_esc_level_1(AV
>               tmr_su_err_esc_stop(cb, su);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_ERR_ESC_TMR);
>               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)) 
> {
> @@ -1305,7 +1393,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);
> +     }
> +
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_RESTART_CNT);
>       TRACE_LEAVE2("retval=%u", rc);
>       return rc;
> @@ -1481,7 +1572,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;
> 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
> @@ -50,6 +50,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 */
> @@ -98,7 +99,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;
> @@ -130,6 +136,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
> @@ -645,18 +645,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);
>   
>   /**
> @@ -929,7 +918,7 @@ bool comp_has_quiesced_assignment(const
>    *  * 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
> @@ -397,7 +397,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);
> @@ -407,7 +407,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
> @@ -96,6 +96,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 */
> @@ -120,6 +121,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;
>   
> @@ -135,6 +138,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)
>   {
> @@ -174,6 +179,10 @@ int main(int argc, char *argv[])
>               goto done;
>       }
>   
> +     immutilWrapperProfile.retryInterval = 400;
> +     immutilWrapperProfile.nTries = 25;
> +     immutilWrapperProfile.errorsAreFatal = 0;
> +
>       /* should never return */
>       avnd_main_process();
>   
> @@ -330,6 +339,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);
> @@ -547,6 +566,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();
>   
> @@ -597,7 +618,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) {
> @@ -649,9 +681,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 */
> @@ -692,3 +726,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[] = {
> @@ -576,11 +576,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
> @@ -285,7 +285,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);
> @@ -304,7 +309,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;
>   }
> @@ -173,7 +179,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);
>               }
>       }
> @@ -327,7 +333,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,
> @@ -344,6 +354,7 @@ static uint32_t get_sirank(const SaNameT
>       immutil_saImmOmAccessorFinalize(accessorHandle);
>       immutil_saImmOmFinalize(immOmHandle);
>   
> +done:
>       return rank;
>   }
>   
> @@ -477,7 +488,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;
> @@ -489,14 +500,14 @@ uint32_t avnd_evt_tmr_su_err_esc_evh(AVN
>               su->comp_restart_cnt = 0;
>               su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0;
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_COMP_RESTART_CNT);
> -             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;
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_RESTART_CNT);
> -             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:
> @@ -573,7 +584,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);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_CONFIG);
> @@ -648,7 +659,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);
> @@ -663,7 +674,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;
> @@ -703,13 +714,15 @@ 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);
> +     }
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_PRES_STATE);
>   }
>   
> @@ -717,13 +730,13 @@ void avnd_su_pres_state_set(AVND_SU *su,
>    * @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
> @@ -462,7 +462,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;
> @@ -570,7 +570,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;
> @@ -675,7 +675,7 @@ uint32_t avnd_su_si_assign(AVND_CB *cb,
>       if (si) {
>               m_AVND_SU_SI_CURR_ASSIGN_STATE_SET(si, 
> AVND_SU_SI_ASSIGN_STATE_ASSIGNING);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, si, 
> AVND_CKPT_SU_SI_REC_CURR_ASSIGN_STATE);
> -             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;
> @@ -704,7 +704,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;
>               }
> @@ -829,7 +829,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 */
> @@ -1397,11 +1397,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 {
[HansN] format of todo comment should be // TODO(userid) comment, (see 
google c++ styleguide)
> +                             // @todo 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)) {
> @@ -1412,7 +1418,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);
> @@ -1542,7 +1548,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) &&
> @@ -1828,7 +1834,10 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, 
> AVND_CKPT_SU_OPER_STATE);
>   
>                       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");
> @@ -2007,11 +2016,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;
>   }
> @@ -2062,7 +2071,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);
> @@ -2143,7 +2152,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);
>               }
>       }
>   
> @@ -2163,7 +2172,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;
>               }
>   
> @@ -2179,7 +2188,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);
>               }
>       }
>   
> @@ -2221,7 +2230,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);
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_FLAG_CHANGE);
>   
> @@ -2372,11 +2381,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.
> @@ -2392,7 +2401,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);
> @@ -2501,14 +2510,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);
>               }
>       }
>   
> @@ -2542,7 +2551,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);
>               }
>       }
>   
> @@ -2590,7 +2599,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)) {
> @@ -2614,7 +2623,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:
> @@ -2645,7 +2654,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);
> @@ -2683,7 +2692,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)
> @@ -2786,7 +2795,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];
> @@ -2860,7 +2869,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));
> @@ -2897,7 +2906,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;
>                                               }
>                                       }
> @@ -2908,9 +2917,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));
> @@ -2950,7 +2959,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
> @@ -2986,7 +2995,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;
>               }
>   
> @@ -3007,7 +3016,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;
>               }
>   
> @@ -3085,7 +3094,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);
> @@ -3205,7 +3214,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;
> @@ -3241,7 +3250,7 @@ uint32_t avnd_su_pres_restart_compinst_h
>               m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, 
> AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi, 
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
>               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);
> @@ -3338,7 +3347,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);
> @@ -3375,7 +3384,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);
>       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_FLAG_CHANGE);
>   
> @@ -3625,7 +3634,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:
> @@ -3720,7 +3729,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
> @@ -3748,12 +3757,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;
>   }
> @@ -3809,7 +3818,7 @@ uint32_t avnd_su_pres_inst_compinst_hdle
>               m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi, 
> AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
>   
>               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=267308311&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to