AMFD recovery after headless should check if any SI sponsor
under failover to decide SG stable or not.
---
 src/amf/amfd/sg.cc     |  3 ++-
 src/amf/amfd/sgproc.cc |  3 +--
 src/amf/amfd/su.cc     | 19 +++++++++++++++++++
 src/amf/amfd/su.h      |  1 +
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/amf/amfd/sg.cc b/src/amf/amfd/sg.cc
index e2c2528c8..6ed585c49 100644
--- a/src/amf/amfd/sg.cc
+++ b/src/amf/amfd/sg.cc
@@ -2405,7 +2405,8 @@ bool AVD_SG::any_assignment_in_progress() {
   for (const auto &su : list_of_su) {
     if (su->any_susi_fsm_in(AVD_SU_SI_STATE_ASGN) ||
         su->any_susi_fsm_in(AVD_SU_SI_STATE_UNASGN) ||
-        su->any_susi_fsm_in(AVD_SU_SI_STATE_MODIFY)) {
+        su->any_susi_fsm_in(AVD_SU_SI_STATE_MODIFY) ||
+        su->any_sponsor_si_under_failover()) {
       pending = true;
       break;
     }
diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc
index 405e2c45d..7de64f4a8 100644
--- a/src/amf/amfd/sgproc.cc
+++ b/src/amf/amfd/sgproc.cc
@@ -2480,9 +2480,7 @@ uint32_t avd_sg_su_oper_list_add(AVD_CL_CB *cb, AVD_SU 
*su, bool ckpt,
   }
 
   TRACE("added %s to %s", su->name.c_str(), su->sg_of_su->name.c_str());
-
   su_oper_list.push_back(su);
-
   if (!ckpt) {
     // Update to IMM if headless is enabled
     if (cb->scs_absence_max_duration > 0 && wrt_to_imm) {
@@ -2539,6 +2537,7 @@ uint32_t avd_sg_su_oper_list_del(AVD_CL_CB *cb, AVD_SU 
*su, bool ckpt,
     goto done;
   }
 
+  TRACE("erased %s to %s", su->name.c_str(), su->sg_of_su->name.c_str());
   su_oper_list.erase(elem);
   if (!ckpt) {
     // Update to IMM if headless is enabled
diff --git a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc
index 5a6c69c33..1fe92c16b 100644
--- a/src/amf/amfd/su.cc
+++ b/src/amf/amfd/su.cc
@@ -2692,6 +2692,25 @@ bool AVD_SU::any_susi_fsm_in(uint32_t check_fsm) {
   TRACE_LEAVE();
   return rc;
 }
+/**
+ * @brief    Checks if sponsor SI under failover
+ * @result   true/false
+ */
+bool AVD_SU::any_sponsor_si_under_failover() {
+  TRACE_ENTER2("SU:'%s'", name.c_str());
+  bool rc = false;
+  for (AVD_SU_SI_REL *susi = list_of_susi; susi && rc == false;
+       susi = susi->su_next) {
+    TRACE("SUSI:'%s,%s', si_dep_state:'%d'", susi->su->name.c_str(),
+          susi->si->name.c_str(), susi->si->si_dep_state);
+    if (susi->si->si_dep_state == AVD_SI_FAILOVER_UNDER_PROGRESS) {
+      rc = true;
+      TRACE("Found");
+    }
+  }
+  TRACE_LEAVE();
+  return rc;
+}
 /**
  * @brief  Verify if SU is stable for admin operation on any higher
            level enity like SG, Node and Nodegroup etc.
diff --git a/src/amf/amfd/su.h b/src/amf/amfd/su.h
index f32f3138a..3a6266c7c 100644
--- a/src/amf/amfd/su.h
+++ b/src/amf/amfd/su.h
@@ -146,6 +146,7 @@ class AVD_SU {
   void lock(SaImmOiHandleT immoi_handle, SaInvocationT invocation,
             SaAmfAdminStateT adm_state);
   bool any_susi_fsm_in(uint32_t check_fsm);
+  bool any_sponsor_si_under_failover();
   SaAisErrorT check_su_stability();
   uint32_t curr_num_standby_sis();
   uint32_t curr_num_active_sis();
-- 
2.17.1



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to