Hi Praveen Ack (review only + regression tests run) with minor comment below.
Thanks Gary -----Original Message----- From: <[email protected]> Date: Friday, 17 March 2017 at 8:22 pm To: <[email protected]>, <[email protected]>, gary <[email protected]>, <[email protected]> Cc: <[email protected]> Subject: [PATCH 1 of 1] amfd: remove assignments from lower ranked SU while adjusting SI assignments [#2268] src/amf/amfd/si.cc | 92 +++++++++++++++++++++++++++--------------------------- 1 files changed, 46 insertions(+), 46 deletions(-) In N-Way Active mode, when saAmfSIPrefActiveAssignments is reduced, AMFD removes assignments from higher ranked SU when siranked su is not configured and lower ranked SU have assignments. Similar issue in N-Way model when SiPrefStandbyAssignment is reduced. Also AMFD is not checking HA state of susi and tries to delete active susi and crashes. Patch fixes the problem by removing assignments from lower ranked SU. diff --git a/src/amf/amfd/si.cc b/src/amf/amfd/si.cc --- a/src/amf/amfd/si.cc +++ b/src/amf/amfd/si.cc @@ -1052,8 +1052,7 @@ done: */ void AVD_SI::adjust_si_assignments(const uint32_t mod_pref_assignments) { - AVD_SU_SI_REL *sisu, *tmp_sisu; - uint32_t no_of_sisus_to_delete; + AVD_SU_SI_REL *sisu; uint32_t i = 0; TRACE_ENTER2("for SI:%s ", name.c_str()); @@ -1073,31 +1072,24 @@ void AVD_SI::adjust_si_assignments(const TRACE("No New assignments are been done SI:%s", name.c_str()); } } else { - no_of_sisus_to_delete = saAmfSINumCurrActiveAssignments - - mod_pref_assignments; - - /* Get the sisu pointer from the si->list_of_sisu list from which - no of sisus need to be deleted based on SI ranked SU */ - sisu = tmp_sisu = list_of_sisu; - for( i = 0; i < no_of_sisus_to_delete && nullptr != tmp_sisu; i++ ) { - tmp_sisu = tmp_sisu->si_next; + if (list_of_sisu == nullptr) + return; + /* + avd_susi_create() keeps sisus in list_of_sisu in order from highest + ranked to lowest ranked. + Keep mod_pref_assignments in list_of_sisu from beginning and delete others. + */ + sisu = list_of_sisu; + for( i = 0; ((i < mod_pref_assignments) && (sisu != nullptr)); i++ ) { + sisu = sisu->si_next; } - while( tmp_sisu && (tmp_sisu->si_next != nullptr) ) { - sisu = sisu->si_next; - tmp_sisu = tmp_sisu->si_next; - } - - for( i = 0; i < no_of_sisus_to_delete && (nullptr != sisu); i++ ) { - /* Send quiesced request for the sisu that needs tobe deleted */ + for( ; sisu != nullptr; sisu = sisu->si_next) { if (avd_susi_mod_send(sisu, SA_AMF_HA_QUIESCED) == NCSCC_RC_SUCCESS) { - /* Add SU to su_opr_list */ avd_sg_su_oper_list_add(avd_cb, sisu->su, false); } - sisu = sisu->si_next; } - /* Change the SG FSM to AVD_SG_FSM_SG_REALIGN if assignment is sent.*/ - if (i > 0) - sg_of_si->set_fsm_state(AVD_SG_FSM_SG_REALIGN); + /* Change the SG FSM to AVD_SG_FSM_SG_REALIGN as assignment is sent.*/ + sg_of_si->set_fsm_state(AVD_SG_FSM_SG_REALIGN); } } if( sg_of_si->sg_redundancy_model == SA_AMF_N_WAY_REDUNDANCY_MODEL ) { @@ -1107,30 +1099,28 @@ void AVD_SI::adjust_si_assignments(const LOG_ER("SI new assignmemts failed SI:%s", name.c_str()); } } else { - no_of_sisus_to_delete = 0; - no_of_sisus_to_delete = saAmfSINumCurrStandbyAssignments - - mod_pref_assignments; - - /* Get the sisu pointer from the si->list_of_sisu list from which - no of sisus need to be deleted based on SI ranked SU */ - sisu = tmp_sisu = list_of_sisu; - for(i = 0; i < no_of_sisus_to_delete && (nullptr != tmp_sisu); i++) { - tmp_sisu = tmp_sisu->si_next; + if (list_of_sisu == nullptr) + return; + /* + avd_susi_create() keeps sisus in list_of_sisu in order from highest + ranked to lowest ranked. + Keep mod_pref_assignments + active in list_of_sisu from beginning and delete others. + */ + for (sisu = list_of_sisu; sisu != nullptr; sisu = sisu->si_next) { + if (sisu->state == SA_AMF_HA_ACTIVE) + continue; + if (i == mod_pref_assignments) + break; + i++; } - while( tmp_sisu && (tmp_sisu->si_next != nullptr) ) { - sisu = sisu->si_next; - tmp_sisu = tmp_sisu->si_next; + for(; sisu != nullptr; sisu = sisu->si_next) { + if (sisu->state == SA_AMF_HA_ACTIVE) + continue; + if (avd_susi_del_send(sisu) == NCSCC_RC_SUCCESS) { + avd_sg_su_oper_list_add(avd_cb, sisu->su, false); + } } - - for( i = 0; i < no_of_sisus_to_delete && (nullptr != sisu); i++ ) { - /* Delete Standby SI assignment & move it to Realign state */ - if (avd_susi_del_send(sisu) == NCSCC_RC_SUCCESS) { - /* Add SU to su_opr_list */ - avd_sg_su_oper_list_add(avd_cb, sisu->su, false); - } - sisu = sisu->si_next; - } - /* Change the SG FSM to AVD_SG_FSM_SG_REALIGN */ + /* Change the SG FSM to AVD_SG_FSM_SG_REALIGN as assignment is sent.*/ sg_of_si->set_fsm_state(AVD_SG_FSM_SG_REALIGN); } } @@ -1171,10 +1161,20 @@ static void si_ccb_apply_modify_hdlr(Ccb si->saAmfSIPrefActiveAssignments = mod_pref_assignments; continue; } - /* Check if we need to readjust the SI assignments as PrefActiveAssignments got changed */ - if ( mod_pref_assignments == si->saAmfSINumCurrActiveAssignments ) { + if (mod_pref_assignments == 0) { + //Zero is set for using PrefAssignedSus as default arguments. + uint32_t count = si->sg_of_si->pref_assigned_sus(); + if (count > si->saAmfSINumCurrActiveAssignments) { [GL] below statement looks redundant, as it’s done a few lines later anyway. + si->saAmfSIPrefActiveAssignments = mod_pref_assignments; + si->adjust_si_assignments(count); + } else if (count < si->saAmfSINumCurrActiveAssignments) { + si->adjust_si_assignments(count); + } else + TRACE("Assignments are equal updating the SI status "); + si->saAmfSIPrefActiveAssignments = mod_pref_assignments; + } else if ( mod_pref_assignments == si->saAmfSINumCurrActiveAssignments ) { TRACE("Assignments are equal updating the SI status "); si->saAmfSIPrefActiveAssignments = mod_pref_assignments; } else if (mod_pref_assignments > si->saAmfSINumCurrActiveAssignments) { ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
