Hi Minh,
But I agree that we need to avoid rebooting the controllers.
But by avoiding assert, I am not sure, let me check.
Thanks
-Nagu
> -----Original Message-----
> From: Nagendra Kumar
> Sent: 07 June 2017 14:41
> To: minh chau; [email protected]; Praveen Malviya;
> [email protected]
> Cc: [email protected]
> Subject: Re: [devel] [PATCH 1/1] amf: Replace osafassert by log_warning to
> avoid cyclic reboot [#2477]
>
> Hi Minh,
> I updated the ticket with the following details, we need to
> check with more granular levels, how to handle such cases (may be in an
> enhancement ticket):
> =====================
> Also, to note, it is documented as limitations in Amf PR Doc as below, so this
> ticket qualifies as Enhancement (could have been #2416 as well):
> 2.2.11.3 Limitations
> . Possible loss of RTA updates and SI assignment messages If both SCs go
> down abruptly (SCs are immediately powered-off for instance), AMFD could
> fail to update RTA to IMM, the SI assignment messages sent from AMFND
> could not reach to AMFD, or vice versa. In such cases, recovery could be
> impossible, applications may have inappropriate assignment states.
> ========================
>
> What do you think?
>
> Thanks
> -Nagu
>
> > -----Original Message-----
> > From: minh chau [mailto:[email protected]]
> > Sent: 06 June 2017 16:35
> > To: Nagendra Kumar; [email protected]; Praveen Malviya;
> > [email protected]
> > Cc: [email protected]
> > Subject: Re: [PATCH 1/1] amf: Replace osafassert by log_warning to
> > avoid cyclic reboot [#2477]
> >
> > Hi Nagu,
> >
> > At the beginning, I thought the osafassert(s) were there to prevent a
> > weird thing continues to happen unpredictably. When those
> > osafassert(s) are hit, the active controller reboots and the standby
> > will be ok when the standby takes over active role. But in fact, the
> > new active also gets into these osafassert(s) and cluster is facing
> > cyclic reboot of controllers.
> > I think the osafassert(s) would help if the SU(s) are deployed on
> > controllers, but if SU(s) are deployed in payloads, the cyclic reboot
> > should be happening.
> >
> > In addition to replacing the osafassert(s), the @stby_susi now ensures
> > it must always point to a STANDBY susi, callers of
> > avd_sg_2n_act_susi() are mostly in 2n SG Fsm code that already take
> > care of @stby_susi as null and not-null. By doing this, the problem in
> > this ticket has gone, and it should work with existing cases as
> > @stby_susi should truly point to a STANDBY one.
> >
> > If you have another approach, please let me know, I can try it out.
> >
> > Thanks,
> > Minh
> >
> > On 06/06/17 19:53, Nagendra Kumar wrote:
> > > Hi Minh,
> > > I think, we need to avoid this situation by doing something
> > else. These logics are kept for putting checks and balances for not
> > happening such situations, in my opinion, we shouldn't alter these logics.
> > >
> > > Thanks
> > > -Nagu
> > >
> > >> -----Original Message-----
> > >> From: Minh Chau [mailto:[email protected]]
> > >> Sent: 02 June 2017 14:54
> > >> To: [email protected]; [email protected];
> > >> [email protected]; [email protected]
> > >> Cc: [email protected]; Minh Chau
> > >> Subject: [PATCH 1/1] amf: Replace osafassert by log_warning to
> > >> avoid
> > cyclic
> > >> reboot [#2477]
> > >>
> > >> In large cluster, the IMM sync calls mostly take no effect when
> > >> both SCs abruptly go down, thus amfd may leaves the susi
> > >> assignments in amfnd
> > and
> > >> IMM in a very unexpected states.
> > >>
> > >> The scenario is same as #2416, but in #2477 amfd can also see 2
> > >> ACTIVE assignments for both SUs of a 2N SG. That leads to
> > >> osafassert(), causes node reboot, and the same osafassert()
> > >> repeatedly happens after node comes up.
> > >>
> > >> Patch replaces the osafassert() with LOG_WA, reinforces the
> > >> checking of @stby_susi in avd_sg_2n_act_susi(). Also, a fix
> > >> avnd_diq_rec_check_buffered_msg()
> > >> is needed in this scenario
> > >> ---
> > >> src/amf/amfd/sg_2n_fsm.cc | 29 +++++++++++++++++++++++------
> > >> src/amf/amfd/siass.cc | 20 ++++++++++----------
> > >> src/amf/amfnd/di.cc | 6 ++++--
> > >> 3 files changed, 37 insertions(+), 18 deletions(-)
> > >>
> > >> diff --git a/src/amf/amfd/sg_2n_fsm.cc b/src/amf/amfd/sg_2n_fsm.cc
> > >> index 3a7609e07..b9748015e 100644
> > >> --- a/src/amf/amfd/sg_2n_fsm.cc
> > >> +++ b/src/amf/amfd/sg_2n_fsm.cc
> > >> @@ -580,7 +580,8 @@ static AVD_SU_SI_REL
> > >> *avd_sg_2n_act_susi(AVD_CL_CB *cb, AVD_SG *sg,
> > >> /* Determining SUSI for su_2 may not be needed, but to make
> > >> sure we have
> > >> * correct SUSI.*/
> > >> a_susi_2 = su_assigned_susi_find(su_2, &s_susi_2);
> > >> - osafassert(a_susi_1 && s_susi_1);
> > >> + if (a_susi_1 == nullptr) LOG_WA("a_susi_1 is null");
> > >> + if (s_susi_1 == nullptr) LOG_WA("s_susi_1 is null");
> > >> /* There is a case where both the SUs become Standby: When
> > >> SU1 is locked, it
> > >> transitions from Act to Quisced, then SU2 goes to Act from
> > >> Std. Now
> > if
> > >> Act assgnment fails, then SU2 will go into Quisced state.
> > >> Here both
> > the
> > >> @@ -590,11 +591,23 @@ static AVD_SU_SI_REL
> > >> *avd_sg_2n_act_susi(AVD_CL_CB *cb, AVD_SG *sg,
> > >> standby. */
> > >> if ((SA_AMF_HA_QUIESCED == avd_su_state_determine(su_1)) &&
> > >> (SA_AMF_HA_QUIESCED == avd_su_state_determine(su_2))) {
> > >> - osafassert(a_susi_1->su == s_susi_2->su);
> > >> - osafassert(a_susi_2->su == s_susi_1->su);
> > >> + if (a_susi_1 && s_susi_2 && a_susi_1->su != s_susi_2->su) {
> > >> + LOG_WA("a_susi_1->su:%s != s_susi_2->su:%s",
> > >> + a_susi_1->su->name.c_str(), s_susi_2->su->name.c_str());
> > >> + }
> > >> + if (a_susi_2 && s_susi_1 && a_susi_2->su != s_susi_1->su) {
> > >> + LOG_WA("a_susi_2->su:%s != s_susi_1->su:%s",
> > >> + a_susi_2->su->name.c_str(), s_susi_1->su->name.c_str());
> > >> + }
> > >> } else {
> > >> - osafassert(a_susi_1->su == a_susi_2->su);
> > >> - osafassert(s_susi_1->su == s_susi_2->su);
> > >> + if (a_susi_1 && a_susi_2 && a_susi_1->su != a_susi_2->su) {
> > >> + LOG_WA("a_susi_1->su:%s != a_susi_2->su:%s",
> > >> + a_susi_1->su->name.c_str(), a_susi_2->su->name.c_str());
> > >> + }
> > >> + if (s_susi_1 && s_susi_2 && s_susi_1->su != s_susi_2->su) {
> > >> + LOG_WA("s_susi_1->su:%s != s_susi_2->su:%s",
> > >> + s_susi_1->su->name.c_str(), s_susi_2->su->name.c_str());
> > >> + }
> > >> }
> > >> a_susi = a_susi_1;
> > >> s_susi = s_susi_1;
> > >> @@ -602,7 +615,11 @@ static AVD_SU_SI_REL
> > >> *avd_sg_2n_act_susi(AVD_CL_CB *cb, AVD_SG *sg,
> > >> }
> > >>
> > >> done:
> > >> - *stby_susi = s_susi;
> > >> + if (s_susi && s_susi->state == SA_AMF_HA_STANDBY) {
> > >> + *stby_susi = s_susi;
> > >> + } else {
> > >> + *stby_susi = nullptr;
> > >> + }
> > >>
> > >> TRACE_LEAVE2("act: '%s', stdby: '%s'",
> > >> a_susi ? a_susi->su->name.c_str() : nullptr, diff
> > >> --git a/src/amf/amfd/siass.cc b/src/amf/amfd/siass.cc index
> > >> 6a13836f9..f23f3a947 100644
> > >> --- a/src/amf/amfd/siass.cc
> > >> +++ b/src/amf/amfd/siass.cc
> > >> @@ -218,13 +218,20 @@ void
> > >> avd_susi_read_headless_cached_rta(AVD_CL_CB *cb) {
> > >> std::string(strstr(osaf_extended_name_borrow(&dn), "safSi"));
> > >> assert(si_name.empty() == false);
> > >> AVD_SI *si = si_db->find(si_name);
> > >> - osafassert(si);
> > >> + if (si == nullptr) {
> > >> + LOG_ER("SI:'%s' does not exist in AMF's sidb", si_name.c_str());
> > >> + continue;
> > >> + }
> > >> SaNameT su_name;
> > >> avsv_sanamet_init_from_association_dn(&dn, &su_name, "safSu",
> > >> si->name.c_str());
> > >> AVD_SU *su = su_db->find(Amf::to_string(&su_name));
> > >> + if (su == nullptr) {
> > >> + LOG_ER("SU:'%s' does not exist in AMF's sudb",
> > >> + Amf::to_string(&su_name).c_str());
> > >> + continue;
> > >> + }
> > >> osaf_extended_name_free(&su_name);
> > >> - osafassert(su);
> > >> susi = avd_su_susi_find(cb, su, si->name);
> > >> rc = immutil_getAttr("osafAmfSISUFsmState", attributes, 0,
> > >> &imm_susi_fsm);
> > >> osafassert(rc == SA_AIS_OK);
> > >> @@ -335,15 +342,8 @@ bool
> > >> avd_susi_validate_headless_cached_rta(AVD_SU_SI_REL *present_susi,
> > >> bool valid = true;
> > >> // rule 1: valid ha state
> > >> if (ha_fr_imm != present_susi->state) {
> > >> - if (ha_fr_imm == SA_AMF_HA_QUIESCING || ha_fr_imm ==
> > >> SA_AMF_HA_QUIESCED) {
> > >> - // That's fine
> > >> - ;
> > >> - } else {
> > >> - LOG_ER("SISU:'%s', old(imm) ha state: %d, new(sync) ha state: %d",
> > >> + LOG_WA("SISU:'%s', old(imm) ha state: %d, new(sync) ha
> > >> + state: %d",
> > >> dn.c_str(), ha_fr_imm, present_susi->state);
> > >> - valid = false;
> > >> - goto done;
> > >> - }
> > >> }
> > >> // rule 2: if ha_fr_imm is QUIESCING, one of relevant entities must
> > >> // have adminState is SHUTTINGDOWN, otherwise re-adjust if
> > >> possible diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
> > >> index 6f0a76cda..0da907566 100644
> > >> --- a/src/amf/amfnd/di.cc
> > >> +++ b/src/amf/amfnd/di.cc
> > >> @@ -1290,6 +1290,7 @@ void avnd_di_msg_ack_process(AVND_CB
> *cb,
> > >> uint32_t mid) {
> > >> void avnd_diq_rec_check_buffered_msg(AVND_CB *cb) {
> > >> if ((cb->dnd_list.head != nullptr)) {
> > >> AVND_DND_MSG_LIST *rec = 0;
> > >> + AVND_DND_MSG_LIST *tail = cb->dnd_list.tail;
> > >> bool found = true;
> > >> while (found) {
> > >> found = false;
> > >> @@ -1318,7 +1319,7 @@ void
> > >> avnd_diq_rec_check_buffered_msg(AVND_CB *cb) {
> > >> rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id);
> > >> }
> > >> m_AVND_DIQ_REC_PUSH(cb, rec);
> > >> - break;
> > >> + if (tail == cb->dnd_list.tail) break;
> > >> } else if (rec->msg.info.avd->msg_type ==
> > >> AVSV_N2D_OPERATION_STATE_MSG) {
> > >> if (rec->msg.info.avd->msg_info.n2d_opr_state.msg_id !=
> > >> 0) { @@ -1337,11 +1338,12 @@ void
> > >> avnd_diq_rec_check_buffered_msg(AVND_CB *cb) {
> > >> .raw);
> > >> }
> > >> m_AVND_DIQ_REC_PUSH(cb, rec);
> > >> - break;
> > >> + if (tail == cb->dnd_list.tail) break;
> > >> } else {
> > >> // delete other messages for now
> > >> avnd_diq_rec_del(cb, rec);
> > >> rec = cb->dnd_list.head;
> > >> + tail = cb->dnd_list.tail;
> > >> }
> > >> }
> > >> }
> > >> --
> > >> 2.11.0
> >
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most engaging
> tech sites, Slashdot.org! https://urldefense.proofpoint.com/v2/url?u=http-
> 3A__sdm.link_slashdot&d=DwICAg&c=RoP1YumCXCgaWHvlZYR8PQcxBKCX5
> YTpkKY057SbK10&r=Msq2CEtg63eU7sEKWk3a28RY1AX1Y11SftpoiJrP_ek&m
> =x8kq2JTA5qSX4bUJ9glC-ZfPeXvw3s8NuM-
> KzJCpXf4&s=sdR_EgPO_goQqLliX5C9QYANHE3ghEXMq9tFlvu32oo&e=
> _______________________________________________
> Opensaf-devel mailing list
> [email protected]
> https://urldefense.proofpoint.com/v2/url?u=https-
> 3A__lists.sourceforge.net_lists_listinfo_opensaf-
> 2Ddevel&d=DwICAg&c=RoP1YumCXCgaWHvlZYR8PQcxBKCX5YTpkKY057SbK
> 10&r=Msq2CEtg63eU7sEKWk3a28RY1AX1Y11SftpoiJrP_ek&m=x8kq2JTA5qSX
> 4bUJ9glC-ZfPeXvw3s8NuM-
> KzJCpXf4&s=6TalETbGgKtab_QaRt6nwpgUTtb65SX2XKbNrmNkxwU&e=
------------------------------------------------------------------------------
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