osaf/services/saf/amf/amfd/sg_nway_fsm.cc |  10 ++++++++++
 osaf/services/saf/amf/amfd/si.cc          |   8 ++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)


AMF make SI active in two SUs when a component faults with su-failover recovery
in removal callback during lock operation on SU. In

As a part of lock operation when quiesced assignment gets successful for
both SI1 and SI2 in the locked SU1, AMFD makes SU2 active for both the SIs and
sends SU level delete to SU1. Comp1 in SU1 faults with su-failover recovery 
while handling
CSI Remove callback. AMFD makes SU3 active for both SIs as part of recovery. 
Since SU2
was already made active after successful quiesced assignments, AMFD should not 
perform
failover of SI1 and SI2 to SU3.

Patch avoids failover if SI is already active in some other healthy SU.

diff --git a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc 
b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
--- a/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
+++ b/osaf/services/saf/amf/amfd/sg_nway_fsm.cc
@@ -2999,6 +2999,16 @@ void avd_sg_nway_node_fail_stable(AVD_CL
                if (curr_susi == susi)
                        continue;
 
+               /*
+                  This node and its SUs are already marked OOS. 
+                  If a valid active SISU exists for this SI on some other node 
and this SI 
+                  is not having any sponsor then continue the for loop as for 
this 
+                  SI (curr_susi->si) neither failover is required nor deletion 
of all 
+                  assignments. This curr_susi will be deleted in this function.
+                */
+               if ((curr_susi->si->is_active() == true) && 
(curr_susi->si->spons_si_list == nullptr))
+                       continue;
+                       
                if ((SA_AMF_HA_ACTIVE == curr_susi->state) ||
                    (SA_AMF_HA_QUIESCED == curr_susi->state) || 
(SA_AMF_HA_QUIESCING == curr_susi->state)) {
                        /* identify the most preferred standby su for this si */
diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc
--- a/osaf/services/saf/amf/amfd/si.cc
+++ b/osaf/services/saf/amf/amfd/si.cc
@@ -1553,8 +1553,12 @@ void AVD_SI::update_alarm_state(bool ala
 bool AVD_SI::is_active() const
 {
        for (AVD_SU_SI_REL *sisu = list_of_sisu; sisu != nullptr; sisu = 
sisu->si_next) {
-               if ((sisu->state == SA_AMF_HA_ACTIVE) && (sisu->fsm == 
AVD_SU_SI_STATE_ASGND) &&
-                               (sisu->su->saAmfSuReadinessState == 
SA_AMF_READINESS_IN_SERVICE)) {
+               if ((sisu->state == SA_AMF_HA_ACTIVE) &&
+                       ((sisu->fsm == AVD_SU_SI_STATE_ASGND) ||
+                        (sisu->fsm == AVD_SU_SI_STATE_ASGN) ||
+                        (sisu->fsm == AVD_SU_SI_STATE_MODIFY)) &&
+                       (sisu->si->saAmfSIAdminState == SA_AMF_ADMIN_UNLOCKED) 
&&
+                       (sisu->su->saAmfSuReadinessState == 
SA_AMF_READINESS_IN_SERVICE)) {
                        return true;
                }
        }

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to