More comments inline: > -----Original Message----- > From: praveen malviya > Sent: Tuesday, June 25, 2013 5:14 PM > To: Mathivanan Naickan Palanivelu > Cc: Hans Feldt; Nagendra Kumar; [email protected] > Subject: Re: [PATCH 6 of 6] amf: handle sufailover in SU FSM and Comp FSM > at amfnd [#98] > > Thanks for the comments and discussion. I will respond for other comments > soon, as of now starting with this mail. > Please see the response below. > > One more point can be brought into discussion here. The case is when admin > restart operation is invoked on the component and saAmfDisableRestart is > true for it. > Now if saAmfSUFailover is also true for the SU of this component, then: > case1) AMF should honor saAmfSUFailover and perform the failover of > whole SU. > case2) Amf should reject the comp restart admin operation because whole > su should fail-over as a single entity. In my opinion AMF should reject the > operation. > > Any comments? >
I would say AMF should reject it for semantic clarity and to prevent behavioural mix-up. i.e. - saAmfDisableRestart=FALSE 'must' only mean that "component restart must not" be attempted by admin or AMF. More comments below > On 25-Jun-13 3:20 PM, Mathivanan Naickan Palanivelu wrote: > >> -----Original Message----- > >> From: Hans Feldt [mailto:[email protected]] > >> Sent: Tuesday, June 25, 2013 3:01 PM > >> To: Mathivanan Naickan Palanivelu > >> Cc: Praveen Malviya; Nagendra Kumar; > >> [email protected] > >> Subject: Re: [PATCH 6 of 6] amf: handle sufailover in SU FSM and Comp > >> FSM at amfnd [#98] > >> > >> > >> On 06/24/2013 04:39 PM, Mathivanan Naickan Palanivelu wrote: > >>> 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! > >> > >> Guess not it interferes with a potential auto adjust feature right? > > I meant that we could avoid the 'extra step' of informing AMFD. > > May be, we could reduce the latency (in repairing) if avoid going through > AMFD. > > Well, AMFND could be made aware of autoadjust attributes, isn't it! > saAmfSGAutoRepair attribute is maintained at amfd only. Current > implementation support repair of SU through admin operation. > When repair admin operation is invoked, amfd informs amfnd to perform > repair. So functionally it is amfnd that performs the repair. > In these patches, this same mechanism is used to perform repair. After > performing failover of assignments of faulted SU (this only amfd can do), > amfd checks saAmfSGAutoRepair and if it is true informs amfnd to perform > repair. Rest of the flow is same as admin repair operation. > If saAmfSGAutoRepair is maintained at amfnd, then in ccb modify operations > on this attribute amfd will have to update to each amfnd hosting SUs of this > SG. These again will be "extra steps". > Well, I would look at it from a "sense of urgency to do the repair", perspective. That way, we could still challenge the idea of routing this through AMFD. I could rather accept an argument that 'the current flow does not permit it to be done directly by AMFND'. > >>> 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)? > >> > >> 3.11.1.3.2 SU failover: > >> > >> "If the service unit is configured to fail over as a single entity > >> (saAmfSUFailover set to SA_TRUE), all other components of the service > >> unit are abruptly terminated" > >> > >> Does not say anything about ordering. Should we add some defined > >> ordering semantics on top of that you mean? > >> > >> > > I meant the below. Also, SU failover 'effectively' involves restart of the > failed SU! > -In case of SU failover no quiesced assignment will be given. So SI dep will > be > honored only while giving active assignment to the standby or spare su. > - As a part of su failover components will be abruptly terminated without > honoring instantiation-level. Neither will abrupt termination imply unordered termination nor can we assume that existing 'component dependencies' will not harm components when we do terminate them unorderedly. At the same time, there are guidelines on how termination of components within an SU can be performed, we could apply these guidelines during all kinds of termination. i.e. When SU restart involves termination and re-instantiation, we cannot argue that we will honour dependencies only during the instanation and not during termination. Please see 3.8.2, line 33 onwards. Cheers, Mathi. > I think instantiation-level is to be considered > during graceful termination of component like Lock-in operation. > In case of SU restart one ticket exists #315 > >> FYI just realized ordering and semantics of "SU restart" is wrong. > >> Will write a defect. > As pointed out ticket already exists #315. > > I suspected this problem could exist. > > > > Thanks, > > Mathi. > > > >> Thanks, > >> Hans > >> > >>> 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
