What is the addition in sg_su_failover_func() there for? It is new since V1 and uncommented.
In all places complete_siswap() is called, do we know for sure that an SI swap is in progress or could it be any SI admin operation? Thanks, Hans On 04/07/2014 11:46 AM, [email protected] wrote: > osaf/services/saf/amf/amfd/sg_2n_fsm.cc | 70 > ++++++++++++++++++-------------- > osaf/services/saf/amf/amfd/sgproc.cc | 6 ++ > 2 files changed, 45 insertions(+), 31 deletions(-) > > > Problem: During si-swap if quiesced assignment faults, AMF returns > BAD_OPERATION even though si-swap completes successfuly after recovery. > > Reason: During si-swap, AMF sends quiesced assignment to active SU. > During quiesced assignments, one of the components faults. > AMF performs cleanup of this failed component and perfroms the failover of > assignments to standby SU. For the faulted SU assignments are deleted and > when it gets sucessfully repaired, AMF assigns it with standby assignments. > Thus si-swap operation eventually gets successful, but AMF returns > BAD_OPERATION for the operation. > > Fix: Since AMF performs si-swap successfuly despite fault in quiesced state, > this patch ensures that AMF returns SA_AIS_OK for the operation. > > diff --git a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc > b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc > --- a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc > +++ b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc > @@ -31,6 +31,41 @@ > #include <imm.h> > > /** > + * @brief Respond to IMM for si-swap operation. > + * > + * @param [in] su > + * @param [in] status > + * > + */ > + > +static void complete_siswap(AVD_SU *su, SaAisErrorT status) > +{ > + AVD_SU_SI_REL *l_susi; > + > + TRACE_ENTER(); > + > + /* find the SI on which SWAP admin operation is pending */ > + for (l_susi = su->list_of_susi; l_susi != NULL; l_susi = > l_susi->su_next) { > + if (l_susi->si->invocation != 0) > + break; > + } > + > + if (l_susi != NULL) { > + avd_saImmOiAdminOperationResult(avd_cb->immOiHandle, > l_susi->si->invocation, status); > + l_susi->si->invocation = 0; > + LOG_NO("%s Swap done", l_susi->si->name.value); > + saflog(LOG_NOTICE, amfSvcUsrName, "%s Swap done", > l_susi->si->name.value); > + } else { > + /* si->invocation field is not check pointed. If controller > failovers when si-swap > + operation is in progress, si->invocation will be zero on the > new active controller. > + Log an error when si-swap operation completes.*/ > + LOG_ER("Operation done, but invocationId for the operation on > SI not found '%s'", su->name.value); > + } > + TRACE_LEAVE(); > +} > + > + > +/** > * @brief Determine fsm state of an SU. > * > * @param [in] su > @@ -888,16 +923,6 @@ static uint32_t avd_sg_2n_su_fault_su_op > if (su->sg_of_su->su_oper_list.su == su) { > su_ha_state = avd_su_state_determine(su); > if (su_ha_state == SA_AMF_HA_QUIESCED) { > - if (su->su_switch == AVSV_SI_TOGGLE_SWITCH) { > - AVD_SU_SI_REL *temp_susi; > - for (temp_susi = su->list_of_susi; temp_susi != > NULL; temp_susi = temp_susi->su_next) { > - if (temp_susi->si->invocation != 0) { > - > avd_saImmOiAdminOperationResult(cb->immOiHandle, > - > temp_susi->si->invocation, SA_AIS_ERR_BAD_OPERATION); > - temp_susi->si->invocation = 0; > - } > - } > - } > m_AVD_SET_SU_SWITCH(cb, su, AVSV_SI_TOGGLE_STABLE); > } else if (su_ha_state == SA_AMF_HA_QUIESCING) { > if (avd_sidep_si_dependency_exists_within_su(su)) { > @@ -2095,6 +2120,8 @@ static uint32_t avd_sg_2n_susi_sucss_su_ > } > > m_AVD_SET_SG_FSM(cb, (su->sg_of_su), > AVD_SG_FSM_SG_REALIGN); > + complete_siswap(su, SA_AIS_OK); > + > } > } else if ((act == AVSV_SUSI_ACT_MOD) && (state == SA_AMF_HA_STANDBY) && > (su->sg_of_su->su_oper_list.su == su)) { > @@ -2112,20 +2139,7 @@ static uint32_t avd_sg_2n_susi_sucss_su_ > /*As sg is stable, screen for si dependencies and take action > on whole sg*/ > avd_sidep_update_si_dep_state_for_all_sis(su->sg_of_su); > avd_sidep_sg_take_action(su->sg_of_su); > - /* find the SI on which SWAP admin operation is pending */ > - for (l_susi = su->list_of_susi; l_susi != NULL && > l_susi->si->invocation == 0; l_susi = l_susi->su_next); > - if (l_susi != NULL){ > - avd_saImmOiAdminOperationResult(cb->immOiHandle, > l_susi->si->invocation, SA_AIS_OK); > - l_susi->si->invocation = 0; > - LOG_NO("%s Swap done", l_susi->si->name.value); > - saflog(LOG_NOTICE, amfSvcUsrName, "%s Swap done", > l_susi->si->name.value); > - } > - else { > - /* si->invocation field is not check pointed. If > controller failovers when si-swap > - operation is in progress, si->invocation will be > zero on the new active controller. > - Log an error when si-swap operation completes.*/ > - LOG_ER("Swap done, but invocationId for the swap > operation not found '%s'", su->name.value); > - } > + complete_siswap(su, SA_AIS_OK); > > if (su->sg_of_su->sg_ncs_spec) > amfd_switch(avd_cb); > @@ -2708,13 +2722,7 @@ uint32_t avd_sg_2n_susi_fail_func(AVD_CL > > m_AVD_SET_SU_SWITCH(cb, su, AVSV_SI_TOGGLE_STABLE); > m_AVD_SET_SG_FSM(cb, (su->sg_of_su), > AVD_SG_FSM_SG_REALIGN); > - for (l_susi = su->list_of_susi; l_susi != NULL; l_susi > = l_susi->su_next) { > - if (l_susi->si->invocation != 0) { > - > avd_saImmOiAdminOperationResult(cb->immOiHandle, > - l_susi->si->invocation, > SA_AIS_ERR_BAD_OPERATION); > - l_susi->si->invocation = 0; > - } > - } > + complete_siswap(su, SA_AIS_ERR_BAD_OPERATION); > > } else if ((act == AVSV_SUSI_ACT_MOD) && > ((state == SA_AMF_HA_QUIESCED) || (state == > SA_AMF_HA_QUIESCING)) && > diff --git a/osaf/services/saf/amf/amfd/sgproc.cc > b/osaf/services/saf/amf/amfd/sgproc.cc > --- a/osaf/services/saf/amf/amfd/sgproc.cc > +++ b/osaf/services/saf/amf/amfd/sgproc.cc > @@ -334,6 +334,12 @@ static uint32_t sg_su_failover_func(AVD_ > deleting the SUSI. */ > avd_si_dec_curr_act_ass(susi->si); > } > + > + if (susi->si->invocation != 0) { > + > avd_saImmOiAdminOperationResult(avd_cb->immOiHandle, > + susi->si->invocation, > SA_AIS_OK); > + susi->si->invocation = 0; > + } > } > su->sg_of_su->node_fail(avd_cb, su); > avd_sg_su_asgn_del_util(avd_cb, su, true, false); > > ------------------------------------------------------------------------------ Put Bad Developers to Shame Dominate Development with Jenkins Continuous Integration Continuously Automate Build, Test & Deployment Start a new project now. Try Jenkins in the cloud. http://p.sf.net/sfu/13600_Cloudbees_APR _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
