Hi Minh,

Ack, reviewed and tested

Regards,
Ravi

-----Original Message-----
From: Minh Chau [mailto:[email protected]] 
Sent: Thursday, December 21, 2017 6:35 AM
To: [email protected]; [email protected]; 
[email protected]
Cc: [email protected]; Minh Chau <[email protected]>
Subject: [PATCH 1/1] amfnd: Check UNASSIGNED CSI in csi assigment removal 
[#2741]

A csi can be marked as UNASSIGNED from a su restart or this csi is newly added 
from scaling out. This unassigned csi currently makes the csi assignment 
removal sequence running non-stop, since the removal sequence is not checking 
UNASSIGNED state.

Patch considers UNASSIGNED state of csi to be ignored so the removal sequence 
can move on
---
 src/amf/amfnd/avnd_su.h |  2 +-
 src/amf/amfnd/comp.cc   | 25 +++++++++----------------
 src/amf/amfnd/susm.cc   |  2 +-
 3 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/src/amf/amfnd/avnd_su.h b/src/amf/amfnd/avnd_su.h index 
69124ed..c1df8f8 100644
--- a/src/amf/amfnd/avnd_su.h
+++ b/src/amf/amfnd/avnd_su.h
@@ -428,7 +428,7 @@ extern struct avnd_su_si_rec *avnd_silist_getprev(  extern 
struct avnd_su_si_rec *avnd_silist_getlast(void);  extern bool 
sufailover_in_progress(const AVND_SU *su);  extern bool 
sufailover_during_nodeswitchover(const AVND_SU *su); -extern bool 
all_csis_in_removed_state(const AVND_SU *su);
+extern bool all_csis_removable_from_su(const AVND_SU *su);
 extern void su_reset_restart_count_in_comps(const struct avnd_cb_tag *cb,
                                             const AVND_SU *su);  extern bool 
all_comps_terminated_in_su(const AVND_SU *su, diff --git 
a/src/amf/amfnd/comp.cc b/src/amf/amfnd/comp.cc index 3d712fa..fdaa342 100644
--- a/src/amf/amfnd/comp.cc
+++ b/src/amf/amfnd/comp.cc
@@ -1703,11 +1703,12 @@ done:
   return rc;
 }
 
-static bool all_csis_in_si_removed(const AVND_SU_SI_REC *si) {
+static bool all_csis_removable_from_si(const AVND_SU_SI_REC *si) {
   AVND_COMP_CSI_REC *csi;
   for (csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_FIRST(&si->csi_list); csi;
        csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_NEXT(&csi->si_dll_node)) {
-    if (csi->curr_assign_state != AVND_COMP_CSI_ASSIGN_STATE_REMOVED)
+    if (csi->curr_assign_state != AVND_COMP_CSI_ASSIGN_STATE_REMOVED &&
+        csi->curr_assign_state != 
+ AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED)
       return false;
   }
   return true;
@@ -1720,8 +1721,7 @@ static bool all_csis_in_si_removed(const AVND_SU_SI_REC 
*si) {
  *
  * @returns     true/false
  **/
-bool all_csis_in_removed_state(const AVND_SU *su) {
-  AVND_COMP_CSI_REC *curr_csi;
+bool all_csis_removable_from_su(const AVND_SU *su) {
   AVND_SU_SI_REC *curr_si;
   bool all_csi_removed = true;
   TRACE_ENTER2("'%s'", su->name.c_str()); @@ -1730,15 +1730,7 @@ bool 
all_csis_in_removed_state(const AVND_SU *su) {
        curr_si && all_csi_removed;
        curr_si =
            (AVND_SU_SI_REC *)m_NCS_DBLIST_FIND_NEXT(&curr_si->su_dll_node)) {
-    for (curr_csi =
-             (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_FIRST(&curr_si->csi_list);
-         curr_csi; curr_csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_NEXT(
-                       &curr_csi->si_dll_node)) {
-      if (!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVED(curr_csi)) {
-        all_csi_removed = false;
-        break;
-      }
-    }
+    all_csi_removed = all_csis_removable_from_si(curr_si);
   }
   TRACE_LEAVE2("%u", all_csi_removed);
   return all_csi_removed;
@@ -1822,7 +1814,8 @@ uint32_t avnd_comp_csi_remove_done(AVND_CB *cb, AVND_COMP 
*comp,
                (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_LAST(&csi->si->csi_list);
            curr_csi; curr_csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_PREV(
                          &curr_csi->si_dll_node)) {
-        if (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVED(curr_csi))
+        if (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVED(curr_csi) ||
+            m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(curr_csi))
           continue;
         else if (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(curr_csi))
           break;
@@ -1838,7 +1831,7 @@ uint32_t avnd_comp_csi_remove_done(AVND_CB *cb, AVND_COMP 
*comp,
       }
 
       /* all csis belonging to the si are removed */
-      if ((all_csis_in_si_removed(csi->si) == true) &&
+      if ((all_csis_removable_from_si(csi->si) == true) &&
           (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_REMOVING(csi->si)))
         rc = avnd_su_si_oper_done(
             cb, comp->su, m_AVND_SU_IS_ALL_SI(comp->su) ? nullptr : csi->si); 
@@ -1873,7 +1866,7 @@ uint32_t avnd_comp_csi_remove_done(AVND_CB *cb, AVND_COMP 
*comp,
 
     /* This is removal with TARGET_ALL. So if all CSIs in all SIs of SU are
        moved to removed state, mark all SIs removed and inform AMF director.*/
-    if (all_csis_in_removed_state(comp->su) && m_AVND_SU_IS_ALL_SI(comp->su)) {
+    if (all_csis_removable_from_su(comp->su) && 
+ m_AVND_SU_IS_ALL_SI(comp->su)) {
       rc = avnd_su_si_oper_done(cb, comp->su, 0);
     }
   }
diff --git a/src/amf/amfnd/susm.cc b/src/amf/amfnd/susm.cc index 
8c2c6f1..c5f8240 100644
--- a/src/amf/amfnd/susm.cc
+++ b/src/amf/amfnd/susm.cc
@@ -3208,7 +3208,7 @@ uint32_t avnd_su_pres_terming_compuninst_hdler(AVND_CB 
*cb, AVND_SU *su,
       if (NCSCC_RC_SUCCESS != rc) goto done;
     }
 
-    if (all_csis_in_assigned_state(su) || all_csis_in_removed_state(su)) {
+    if (all_csis_in_assigned_state(su) || 
+ all_csis_removable_from_su(su)) {
       TRACE("SI Assignment done");
       avnd_su_pres_state_set(cb, su, SA_AMF_PRESENCE_UNINSTANTIATED);
       goto done;
--
2.7.4

------------------------------------------------------------------------------
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

Reply via email to