Hi Praveen,

Thanks for the clarification. 
Please find some other comments below:

- I'm sure you would have had a reason to do it this way, but I thought 
alternatively performing the repair at the AMFND itself(instead of notifying to 
AMFD) is one viable option!
Some other comments I had in mind are:
- is si-si dependencies automatically taken care by these changes?
- are we honouring 'order' of termination of components based on the 
'instantiationlevel'(in reverse)?

Thanks,
Mathi.


> -----Original Message-----
> From: praveen malviya
> Sent: Friday, June 21, 2013 6:20 PM
> To: Mathivanan Naickan Palanivelu
> Cc: [email protected]; Nagendra Kumar; opensaf-
> [email protected]
> Subject: Re: [PATCH 6 of 6] amf: handle sufailover in SU FSM and Comp FSM
> at amfnd [#98]
> 
> >>Can you briefly highlight during which scenario the **autorepair is taken
> into account by this patch.
> 
> **autorepiar is one of the attributes of SG (saAmfSGAutoRepair). During
> sufailover AMF will perform recovery first.
> If saAmfSGAutoRepair is true for the SG of faulted SU then AMF will perform
> auto-repair by enabling the SU.
> 
> Thanks
> Praveen
> 
> On 21-Jun-13 5:39 PM, Mathivanan Naickan Palanivelu wrote:
> > Hi Praveen,
> >
> > Good that you have sent them as patch series and thanks for working on
> this long awaited ticket.
> > A quick question.
> >
> > Can you briefly highlight during which scenario the **autorepair is taken
> into account by this patch.
> >
> > Thanks,
> > Mathi.
> >
> >> -----Original Message-----
> >> From: Praveen Malviya
> >> Sent: Friday, June 07, 2013 12:10 PM
> >> To: [email protected]; Mathivanan Naickan Palanivelu; Nagendra
> >> Kumar
> >> Cc: [email protected]
> >> Subject: [PATCH 6 of 6] amf: handle sufailover in SU FSM and Comp FSM
> >> at amfnd [#98]
> >>
> >>   osaf/services/saf/avsv/avnd/avnd_clc.c  |  130
> >> ++++++++++++++++++++++-
> >> --------
> >>   osaf/services/saf/avsv/avnd/avnd_comp.c |    2 +-
> >>   osaf/services/saf/avsv/avnd/avnd_su.c   |    1 +
> >>   osaf/services/saf/avsv/avnd/avnd_susm.c |   81 +++++++++++++------
> >>   4 files changed, 150 insertions(+), 64 deletions(-)
> >>
> >>
> >>   With this patch amfnd informs amfd for failover of assignments when
> >> all components are terminated successfully during suFailover. If some
> >> component faults and SU moves to inst/term failed state, compFailover
> >> will be performed.
> >>
> >> diff --git a/osaf/services/saf/avsv/avnd/avnd_clc.c
> >> b/osaf/services/saf/avsv/avnd/avnd_clc.c
> >> --- a/osaf/services/saf/avsv/avnd/avnd_clc.c
> >> +++ b/osaf/services/saf/avsv/avnd/avnd_clc.c
> >> @@ -72,6 +72,7 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
> >>
> >>   static uint32_t
> >> avnd_comp_clc_resp(NCS_OS_PROC_EXECUTE_TIMED_CB_INFO *);
> >>   static uint32_t avnd_instfail_su_failover(AVND_CB *, AVND_SU *,
> >> AVND_COMP *);
> >> +static bool all_comps_terminated_in_su(AVND_SU *su);
> >>
> >>
> >>
> /**********************************************************
> >> *****************
> >>    ** C O M P O N E N T   C L C   F S M   M A T R I X   D E F I N I T I O 
> >> N **
> >> @@ -840,9 +841,29 @@ uint32_t avnd_comp_clc_fsm_run(AVND_CB *
> >>                    break;
> >>            }
> >>    }
> >> -
> >>    /* get the prv presence state */
> >>    prv_st = comp->pres;
> >> +
> >> +  if (avnd_sufailover_in_progress(comp->su) &&
> >> +                  ((ev ==
> >> AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_SUCC) ||
> >> +                   (ev ==
> >> AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_FAIL)))
> >> +  {
> >> +          TRACE("SU_FAILOVER is in progress, event '%s'",
> >> pres_state_evt[ev]);
> >> +          if (ev == AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_FAIL)
> >> +                  avnd_comp_pres_state_set(comp,
> >> SA_AMF_PRESENCE_TERMINATION_FAILED);
> >> +          else
> >> +                  avnd_comp_pres_state_set(comp,
> >> SA_AMF_PRESENCE_UNINSTANTIATED);
> >> +          /* If all components terminated, finish sufailover at amfnd.
> >> */
> >> +          if (all_comps_terminated_in_su(comp->su))
> >> +          {
> >> +                  LOG_NO("Terminated all components in '%s'", comp-
> >>> su->name.value);
> >> +                  LOG_NO("Informing director of sufailover");
> >> +                  rc = avnd_di_oper_send(cb, comp->su,
> >> AVSV_ERR_RCVR_SU_FAILOVER);
> >> +                  osafassert(NCSCC_RC_SUCCESS == rc);
> >> +                  avnd_su_si_del(cb, &comp->su->name);
> >> +          }
> >> +  }
> >> +
> >>
> >>    /* if already enabled, stop PM & AM */
> >>    if (prv_st == SA_AMF_PRESENCE_INSTANTIATED && @@ -1065,8
> +1086,8
> >> @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
> >>                    if (m_AVND_COMP_IS_FAILED(comp) && !comp-
> >>> csi_list.n_nodes &&
> >>                        !m_AVND_SU_IS_ADMN_TERM(comp->su) &&
> >>                        (cb->oper_state ==
> >> SA_AMF_OPERATIONAL_ENABLED)) {
> >> -                          /* No need to restart component during
> >> shutdown */
> >> -                          if (!m_AVND_IS_SHUTTING_DOWN(cb))
> >> +                          /* No need to restart component during
> >> shutdown and during sufailover*/
> >> +                          if (!m_AVND_IS_SHUTTING_DOWN(cb) &&
> >> !avnd_sufailover_in_progress(comp->su))
> >>                                    rc = avnd_comp_clc_fsm_trigger(cb,
> comp,
> >> AVND_COMP_CLC_PRES_FSM_EV_INST);
> >>                    } else if (m_AVND_COMP_IS_FAILED(comp) &&
> >> !comp->csi_list.n_nodes) {
> >>                            m_AVND_COMP_FAILED_RESET(comp);
> >>    /*if we moved from restart -> term
> >> @@ -1099,33 +1120,38 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
> >>                            goto done;
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
> >> comp, AVND_CKPT_COMP_OPER_STATE);
> >>
> >> -                  if (!m_AVND_COMP_IS_FAILED(comp)) {
> >> -                          /* csi-set / csi-rem succeeded.. generate csi-
> >> done indication */
> >> -                          csi =
> >>
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
> >> RST(&comp->csi_list));
> >> -                          osafassert(csi);
> >> -                          if
> >> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
> >> -                                  rc = avnd_comp_csi_assign_done(cb,
> >> comp,
> >> -
> >> m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
> >> -                          else if
> >> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
> >> -                                  rc =
> >> avnd_comp_csi_remove_done(cb, comp,
> >> -
> >> m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
> >> -                          if (NCSCC_RC_SUCCESS != rc)
> >> -                                  goto done;
> >> -                  } else {
> >> -                          /* failed su is ready to take on si assignment..
> >> inform avd */
> >> -                          if (!comp->csi_list.n_nodes) {
> >> -                                  m_AVND_SU_IS_ENABLED(comp-
> >>> su, is_en);
> >> -                                  if (true == is_en) {
> >> -
> >>    m_AVND_SU_OPER_STATE_SET(comp-
> >>> su,SA_AMF_OPERATIONAL_ENABLED);
> >> -
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> -                                          rc = avnd_di_oper_send(cb,
> >> comp->su, 0);
> >> -                                          if (NCSCC_RC_SUCCESS != rc)
> >> -                                                  goto done;
> >> +                  if (avnd_sufailover_in_progress(comp->su)) {
> >> +                          /*Do not reset any flag, this will be done as a
> >> part of repair.*/
> >> +                  }
> >> +                  else {
> >> +                          if (!m_AVND_COMP_IS_FAILED(comp)) {
> >> +                                  /* csi-set / csi-rem succeeded..
> >> generate csi-done indication */
> >> +                                  csi =
> >>
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
> >> RST(&comp->csi_list));
> >> +                                  osafassert(csi);
> >> +                                  if
> >> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
> >> +                                          rc =
> >> avnd_comp_csi_assign_done(cb, comp,
> >> +
> >>    m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
> >> +                                  else if
> >> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
> >> +                                          rc =
> >> avnd_comp_csi_remove_done(cb, comp,
> >> +
> >>    m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
> >> +                                  if (NCSCC_RC_SUCCESS != rc)
> >> +                                          goto done;
> >> +                          } else {
> >> +                                  /* failed su is ready to take on si
> >> assignment.. inform avd */
> >> +                                  if (!comp->csi_list.n_nodes) {
> >> +
> >>    m_AVND_SU_IS_ENABLED(comp->su, is_en);
> >> +                                          if (true == is_en) {
> >> +
> >>    m_AVND_SU_OPER_STATE_SET(comp-
> >>> su,SA_AMF_OPERATIONAL_ENABLED);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> +                                                  rc =
> >> avnd_di_oper_send(cb, comp->su, 0);
> >> +                                                  if
> >> (NCSCC_RC_SUCCESS != rc)
> >> +                                                          goto done;
> >> +                                          }
> >> +
> >>    m_AVND_COMP_FAILED_RESET(comp);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
> >> AVND_CKPT_COMP_FLAG_CHANGE);
> >>                                    }
> >> -
> >>    m_AVND_COMP_FAILED_RESET(comp);
> >> -
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
> >> AVND_CKPT_COMP_FLAG_CHANGE);
> >> +
> >>                            }
> >> -
> >>                    }
> >>            }
> >>
> >> @@ -1190,12 +1216,17 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
> >>
> >>            /* terminating -> uninstantiated */
> >>            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 (NCSCC_RC_SUCCESS != rc)
> >> -                          goto done;
> >> -                  m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
> >> comp, AVND_CKPT_COMP_OPER_STATE);
> >> +                  if (avnd_sufailover_in_progress(comp->su)) {
> >> +                          /*Do not reset any flag, this will be done as a
> >> part of repair.*/
> >> +                  }
> >> +                  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 (NCSCC_RC_SUCCESS != rc)
> >> +                                  goto done;
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
> >> AVND_CKPT_COMP_OPER_STATE);
> >> +                  }
> >>            }
> >>
> >>            /* Instantiating -> Instantiationfailed */ @@ -2763,7 +2794,7
> @@
> >> uint32_t avnd_comp_clc_cmd_execute(AVND_
> >>   uint32_t avnd_instfail_su_failover(AVND_CB *cb, AVND_SU *su,
> >> AVND_COMP *failed_comp)
> >>   {
> >>    uint32_t rc = NCSCC_RC_SUCCESS;
> >> -  TRACE_ENTER2("Executing SU Failover: Instantiation failed SU: '%s' :
> >> Failed component: '%s'",
> >> +  TRACE_ENTER2("Executing Component Failover: Instantiation failed
> >> SU: '%s' : Failed component: '%s'",
> >>                                                            su-
> >>> name.value, failed_comp->name.value);
> >>    /* mark the comp failed */
> >> @@ -2812,14 +2843,39 @@ uint32_t avnd_instfail_su_failover(AVND_
> >>            m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >>
> >>            /* inform AvD */
> >> -          rc = avnd_di_oper_send(cb, su,
> >> AVSV_ERR_RCVR_SU_FAILOVER);
> >> +          rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>    }
> >>
> >>    done:
> >>    if (rc == NCSCC_RC_SUCCESS)
> >> -          LOG_NO("SU Failover trigerred for '%s': Failed component:
> >> '%s'",
> >> +          LOG_NO("Component Failover trigerred for '%s': Failed
> >> component: '%s'",
> >>                    su->name.value, failed_comp->name.value);
> >>    TRACE_LEAVE2("%u", rc);
> >>    return rc;
> >>   }
> >>
> >> +/**
> >> + * Check if all components have been terminated in the su.
> >> + * @param su
> >> + * @return bool
> >> + */
> >> +static bool all_comps_terminated_in_su(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))) {
> >> +
> >> +          if ((comp->pres != SA_AMF_PRESENCE_UNINSTANTIATED)
> >> &&
> >> +                          (comp->pres !=
> >> SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
> >> +                          (comp->pres !=
> >> SA_AMF_PRESENCE_TERMINATION_FAILED)) {
> >> +
> >> +                  TRACE("'%s' not terminated, pres.st=%u", comp-
> >>> name.value, comp->pres);
> >> +                  return false;
> >> +          }
> >> +  }
> >> +
> >> +  return true;
> >> +}
> >> +
> >> diff --git a/osaf/services/saf/avsv/avnd/avnd_comp.c
> >> b/osaf/services/saf/avsv/avnd/avnd_comp.c
> >> --- a/osaf/services/saf/avsv/avnd/avnd_comp.c
> >> +++ b/osaf/services/saf/avsv/avnd/avnd_comp.c
> >> @@ -872,7 +872,7 @@ uint32_t avnd_comp_unreg_prc(AVND_CB *cb
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
> >> comp->su, AVND_CKPT_SU_OPER_STATE);
> >>
> >>                    /* inform AvD */
> >> -                  rc = avnd_di_oper_send(cb, comp->su, 0);
> >> +                  rc = avnd_di_oper_send(cb, comp->su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>            }
> >>    }
> >>
> >> diff --git a/osaf/services/saf/avsv/avnd/avnd_su.c
> >> b/osaf/services/saf/avsv/avnd/avnd_su.c
> >> --- a/osaf/services/saf/avsv/avnd/avnd_su.c
> >> +++ b/osaf/services/saf/avsv/avnd/avnd_su.c
> >> @@ -494,6 +494,7 @@ uint32_t avnd_evt_su_admin_op_req(AVND_C
> >>            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);
> >> +          rc = avnd_di_oper_send(cb, su, 0);
> >>
> >>            if (!comp_in_term_failed_state())
> >>                    avnd_failed_state_file_delete(); diff --git
> >> a/osaf/services/saf/avsv/avnd/avnd_susm.c
> >> b/osaf/services/saf/avsv/avnd/avnd_susm.c
> >> --- a/osaf/services/saf/avsv/avnd/avnd_susm.c
> >> +++ b/osaf/services/saf/avsv/avnd/avnd_susm.c
> >> @@ -1411,17 +1411,24 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>            /* terminating -> uninstantiated */
> >>            if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
> >> (SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
> >>                    TRACE("SU Terminating -> Uninstantiated");
> >> -                  /* reset the su failed flag */
> >> -                  if (m_AVND_SU_IS_FAILED(su)) {
> >> -                          m_AVND_SU_FAILED_RESET(su);
> >> -
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> AVND_CKPT_SU_FLAG_CHANGE);
> >> +                  if (avnd_sufailover_in_progress(su)) {
> >> +                          /*Do not reset any flag, this will be done as a
> >> part of repair.*/
> >>                    }
> >> +                  else
> >> +                  {
> >> +                          /* reset the su failed flag */
> >> +                          if (m_AVND_SU_IS_FAILED(su)) {
> >> +                                  m_AVND_SU_FAILED_RESET(su);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> AVND_CKPT_SU_FLAG_CHANGE);
> >> +                          }
> >>
> >> -                  /* reset the su restart falg */
> >> -                  if (m_AVND_SU_IS_RESTART(su)) {
> >> -                          m_AVND_SU_RESTART_RESET(su);
> >> -
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_FLAG_CHANGE);
> >> +                          /* reset the su restart flag */
> >> +                          if (m_AVND_SU_IS_RESTART(su)) {
> >> +                                  m_AVND_SU_RESTART_RESET(su);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_FLAG_CHANGE);
> >> +                          }
> >>                    }
> >> +                  goto done;
> >>            }
> >>
> >>            /* instantiating -> inst-failed */
> >> @@ -1430,7 +1437,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                    /* send the su-oper state msg (to indicate that
> >> instantiation failed) */
> >>                    m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_DISABLED);
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> -                  rc = avnd_di_oper_send(cb, su,
> >> AVSV_ERR_RCVR_SU_FAILOVER);
> >> +                  rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>                    if (NCSCC_RC_SUCCESS != rc)
> >>                            goto done;
> >>            }
> >> @@ -1445,7 +1452,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                            TRACE("SU oper state is enabled");
> >>                            m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_DISABLED);
> >>
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> -                          rc = avnd_di_oper_send(cb, su,
> >> AVSV_ERR_RCVR_SU_FAILOVER);
> >> +                          rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>                            if (NCSCC_RC_SUCCESS != rc)
> >>                                    goto done;
> >>                    }
> >> @@ -1459,7 +1466,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                    m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_DISABLED);
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >>                    /* inform AvD about oper state change */
> >> -                  rc = avnd_di_oper_send(cb, su, 0);
> >> +                  rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>                    if (NCSCC_RC_SUCCESS != rc)
> >>                            goto done;
> >>
> >> @@ -1503,7 +1510,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                    m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_DISABLED);
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >>
> >> -                  rc = avnd_di_oper_send(cb, su,
> >> AVSV_ERR_RCVR_SU_FAILOVER);
> >> +                  rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>
> >>            }
> >>
> >> @@ -1521,13 +1528,19 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                    TRACE("Terminating -> UnInstantiated");
> >>                    /* si assignment/removal success.. generate si-oper
> >> done indication */
> >>                    rc = avnd_su_si_oper_done(cb, su,
> >> m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
> >> -                  m_AVND_SU_ALL_SI_RESET(su);
> >> -                  m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_FLAG_CHANGE);
> >> +                  if (avnd_sufailover_in_progress(su)) {
> >> +                          /*Do not reset any flag, this will be done as a
> >> part of repair.*/
> >> +                  }
> >> +                  else
> >> +                  {
> >> +                          m_AVND_SU_ALL_SI_RESET(su);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_FLAG_CHANGE);
> >>
> >> -                  /* npi su is enabled in uninstantiated state */
> >> -                  m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_ENABLED);
> >> -                  m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> -                  rc = avnd_di_oper_send(cb, su, 0);
> >> +                          /* npi su is enabled in uninstantiated state */
> >> +                          m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_ENABLED);
> >> +
> >>    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >> +                          rc = avnd_di_oper_send(cb, su, 0);
> >> +                  }
> >>            }
> >>
> >>            /* terminating/instantiated/restarting -> term-failed */
> >> @@ -1538,7 +1551,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
> >>                    m_AVND_SU_OPER_STATE_SET(su,
> >> SA_AMF_OPERATIONAL_DISABLED);
> >>                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
> >> AVND_CKPT_SU_OPER_STATE);
> >>                    /* inform AvD about oper state change */
> >> -                  rc = avnd_di_oper_send(cb, su, 0);
> >> +                  rc = avnd_di_oper_send(cb, su,
> >> SA_AMF_COMPONENT_FAILOVER);
> >>
> >>                    /* si assignment/removal failed.. inform AvD */
> >>                    rc = avnd_di_susi_resp_send(cb, su,
> >> m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
> >> @@ -2073,11 +2086,9 @@ uint32_t avnd_su_pres_inst_compterming_h
> >>    TRACE_ENTER2("CompTerminating event in the Instantiated
> >> state:'%s' : '%s'",
> >>                             su->name.value, compname);
> >>
> >> -  if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
> >> -          if (m_AVND_SU_IS_FAILED(su)) {
> >> -                  /* transition to terminating state */
> >> -                  avnd_su_pres_state_set(su,
> >> SA_AMF_PRESENCE_TERMINATING);
> >> -          }
> >> +  if (m_AVND_SU_IS_FAILED(su)) {
> >> +          /* transition to terminating state */
> >> +          avnd_su_pres_state_set(su,
> >> SA_AMF_PRESENCE_TERMINATING);
> >>    }
> >>
> >>    TRACE_LEAVE2("%u", rc);
> >> @@ -2246,7 +2257,9 @@ uint32_t avnd_su_pres_terming_compuninst
> >>                             su->name.value, compname);
> >>
> >>    /* This case is for handling the case of admn su term while su is
> >> restarting */
> >> -  if (m_AVND_SU_IS_PREINSTANTIABLE(su) &&
> >> m_AVND_SU_IS_FAILED(su) && m_AVND_SU_IS_ADMN_TERM(su)) {
> >> +  if (m_AVND_SU_IS_PREINSTANTIABLE(su) &&
> >> m_AVND_SU_IS_FAILED(su) &&
> >> +                  (m_AVND_SU_IS_ADMN_TERM(su) ||
> >> avnd_sufailover_in_progress(su)))
> >> +  {
> >>            TRACE("PI SU");
> >>            for (curr_comp =
> >>
> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(
> >> &su->comp_list));
> >>                 curr_comp;
> >> @@ -2262,6 +2275,7 @@ uint32_t avnd_su_pres_terming_compuninst
> >>            }
> >>    }
> >>
> >> +
> >>    /*
> >>     * If pi su, pick the prv pi comp & trigger it's FSM with TermEv.
> >>     */
> >> @@ -2292,7 +2306,7 @@ uint32_t avnd_su_pres_terming_compuninst
> >>    /*
> >>     * If npi su, pick the prv csi & trigger it's comp fsm with TermEv.
> >>     */
> >> -  if (!m_AVND_SU_IS_PREINSTANTIABLE(su)) {
> >> +  if (!m_AVND_SU_IS_PREINSTANTIABLE(su) &&
> >> !m_AVND_SU_IS_FAILED(su)) {
> >>            TRACE("NPI SU");
> >>            /* get the only csi rec */
> >>            curr_csi =
> >>
> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
> >> RST(&comp->csi_list));
> >> @@ -2718,3 +2732,18 @@ uint32_t avnd_su_pres_instfailed_compuni
> >>    return rc;
> >>   }
> >>
> >> +/**
> >> + * This function checks if the sufailover is going on.
> >> + * @param su: ptr to the SU .
> >> + *
> >> + * @return true/false.
> >> + */
> >> +bool avnd_sufailover_in_progress(AVND_SU *su)
> >> +{
> >> +  if (m_AVND_SU_IS_FAILED(su) && (su->sufailover) &&
> >> +                  ((su->sg_redundancy_model ==
> >> SA_AMF_2N_REDUNDANCY_MODEL) ||
> >> +                   (su->sg_redundancy_model ==
> >> SA_AMF_NO_REDUNDANCY_MODEL)) &&
> >> +                   (avnd_cb->oper_state !=
> >> SA_AMF_OPERATIONAL_DISABLED) && (!su->is_ncs))
> >> +                          return true;
> >> +  return false;
> >> +}
> 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to