osaf/services/saf/amf/amfnd/comp.cc             |  47 ++++++++++++++++++---
 osaf/services/saf/amf/amfnd/include/avnd_comp.h |   9 ++++
 osaf/services/saf/amf/amfnd/sidb.cc             |   2 +-
 osaf/services/saf/amf/amfnd/susm.cc             |  55 +++++++++++++++++++-----
 4 files changed, 92 insertions(+), 21 deletions(-)


If su-si active assignment is on-going, some csi(s) may get assigned but other
csi(s) could be still in unassigned state. At this point, assigning component
issues saAmfErrorReport(COMPONENT_FAILOVER), AMFND receives QUIESCED assignment
from AMFD. The unassigned yet component also receives the quiesced csi callback
that should not happen

Adding new flag suspending_assignment, which indicates the unassigned csi(s) 
will
not involve in QUIESCED/QUIESCING assignment loop. Once su-si QUIESCED/QUIESCING
assignment is done, this flag reset to false.

diff --git a/osaf/services/saf/amf/amfnd/comp.cc 
b/osaf/services/saf/amf/amfnd/comp.cc
--- a/osaf/services/saf/amf/amfnd/comp.cc
+++ b/osaf/services/saf/amf/amfnd/comp.cc
@@ -906,6 +906,7 @@ uint32_t avnd_comp_csi_assign(AVND_CB *c
        /* flags to indicate the prv & curr inst states of an npi comp */
        bool npi_prv_inst = true, npi_curr_inst = true;
        AVND_COMP_CSI_REC *curr_csi = 0;
+       AVND_COMP_CSI_REC *t_csi = 0;
        AVND_COMP_CLC_PRES_FSM_EV comp_ev = AVND_COMP_CLC_PRES_FSM_EV_MAX;
        bool mark_csi = false;
        uint32_t rc = NCSCC_RC_SUCCESS;
@@ -1000,11 +1001,29 @@ uint32_t avnd_comp_csi_assign(AVND_CB *c
                                        if (NCSCC_RC_SUCCESS != rc)
                                                goto done;
                                } else {
-                                       /* active/standby can be directly 
assigned */
-                                       rc = avnd_comp_cbk_send(cb, comp, 
AVSV_AMF_CSI_SET, 0, 0);
-                                       if (NCSCC_RC_SUCCESS != rc)
-                                               goto done;
-                                       mark_csi = true;
+                                       if (curr_csi->curr_assign_state == 
AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED &&
+                                               curr_csi->prv_assign_state == 
AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED) {
+                                               // Mark suspending_assignment 
for all unassigned csi(s) which are going 
+                                               // to be assigned to 
*curr_csi->comp*
+                                               for (t_csi = 
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&curr_csi->comp->csi_list));
+                                                       t_csi;
+                                                       t_csi = 
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&t_csi->comp_dll_node)))
 {
+                                                       if 
(t_csi->curr_assign_state == AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED &&
+                                                               
t_csi->prv_assign_state == AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED) {
+                                                               
t_csi->suspending_assignment = true;
+                                                       }
+                                               }
+                                               // just generate csi-oper done 
for unassigned csi
+                                               rc = 
avnd_comp_csi_assign_done(cb, comp, 0);
+                                               if (NCSCC_RC_SUCCESS != rc)
+                                                       goto done;
+                                       } else {
+                                               /* active/standby can be 
directly assigned */
+                                               rc = avnd_comp_cbk_send(cb, 
comp, AVSV_AMF_CSI_SET, 0, 0);
+                                               if (NCSCC_RC_SUCCESS != rc)
+                                                       goto done;
+                                               mark_csi = true;
+                                       }
                                }
                        } else {
                                /* assign the csi as the comp is aware of 
atleast one csi */
@@ -1222,7 +1241,16 @@ uint32_t avnd_comp_csi_remove(AVND_CB *c
                             curr_csi;
                             curr_csi =
                             
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_csi->comp_dll_node)))
 {
-                               if 
((m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
+
+                               // silently removing csi, don't issue callback
+                               if 
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(curr_csi)) {
+                                       
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi,
+                                                                             
AVND_COMP_CSI_ASSIGN_STATE_REMOVING);
+                                       m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, 
curr_csi,
+                                                                        
AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
+                                       rc = avnd_comp_csi_remove_done(cb, 
comp, csi);
+                                       goto done;
+                               } else if 
((m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
                                    || 
(m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi))
                                    || 
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_csi))) {
                                        if 
(!csi_of_same_si_in_removing_state(curr_csi->comp,curr_csi->si))
@@ -1404,6 +1432,10 @@ static bool all_csis_at_rank_assigned(st
 
                        LOG_IN("Ignoring Failed/Unreg Comp'%s' comp pres 
state=%u, comp flag %x, su pres state %u", 
                                csi->comp->name.value, csi->comp->pres, 
csi->comp->flag, csi->comp->su->pres);
+                       } else if 
(m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(csi->comp) &&
+                                       csi->suspending_assignment) {
+                               LOG_IN("Ignoring quiescing/quiesced assignment 
on unassigned comp'%s'",
+                                               csi->comp->name.value);
                        } else {
                                TRACE_LEAVE2("false");
                                return false;
@@ -1627,6 +1659,7 @@ bool all_csis_in_removed_state(const AVN
        AVND_COMP_CSI_REC *curr_csi;
        AVND_SU_SI_REC *curr_si;
        bool all_csi_removed = true;
+       TRACE_ENTER2("'%s'",su->name.value);
 
        for (curr_si = (AVND_SU_SI_REC *)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
                        curr_si && all_csi_removed;
@@ -1639,7 +1672,7 @@ bool all_csis_in_removed_state(const AVN
                        }
                }
        }
-
+       TRACE_LEAVE2("%u", all_csi_removed);
        return all_csi_removed;
 }
 /****************************************************************************
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h 
b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
@@ -192,6 +192,15 @@ typedef struct avnd_comp_csi_rec {
                                removal callback only after CSI gets assigned. 
AMFND will mark this flag 
                                so that it can start removal after CSI is 
assigned.
                               */
+       bool suspending_assignment; /* This flag is used when su-si active 
assignment is on-going,
+                               some other csi may get assigned but *this* csi 
is still in
+                               unassigned state. At this point, AMFND receives 
QUIESCED or
+                               QUIESCING assignment from AMFD. This csi has 
never got active
+                               assignment so the quiesced csi callback should 
not be issued.
+                               This flag is true, which indicates this csi is 
not involved
+                               in QUIESCED/QUIESCING assignment loop. Once 
su-si QUIESCED/
+                               QUIESCING assignment is done, this flag reset 
to false. */
+
 } AVND_COMP_CSI_REC;
 
 #define AVND_COMP_CSI_REC_NULL ((AVND_COMP_CSI_REC *)0)
diff --git a/osaf/services/saf/amf/amfnd/sidb.cc 
b/osaf/services/saf/amf/amfnd/sidb.cc
--- a/osaf/services/saf/amf/amfnd/sidb.cc
+++ b/osaf/services/saf/amf/amfnd/sidb.cc
@@ -424,7 +424,7 @@ AVND_COMP_CSI_REC *avnd_su_si_csi_rec_ad
        csi_rec->si_name = si_rec->name;
        csi_rec->su_name = su->name;
        csi_rec->pending_removal = false;
-
+       csi_rec->suspending_assignment = false;
        return csi_rec;
 
  err:
diff --git a/osaf/services/saf/amf/amfnd/susm.cc 
b/osaf/services/saf/amf/amfnd/susm.cc
--- a/osaf/services/saf/amf/amfnd/susm.cc
+++ b/osaf/services/saf/amf/amfnd/susm.cc
@@ -428,16 +428,24 @@ static bool csi_of_same_si_in_assigning_
 {
        AVND_COMP_CSI_REC *curr_csi;
        bool all_csi_assigned = true;
-
+       TRACE_ENTER();
        for (curr_csi = 
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&cmp->csi_list));
                curr_csi;
                curr_csi = 
m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_csi->comp_dll_node)))
 {
+               TRACE("curr_csi:'%s', prv_assign_state:%u curr_assign_state:%u, 
suspending_assignment:%u",
+                               curr_csi->name.value,
+                               curr_csi->prv_assign_state,
+                               curr_csi->curr_assign_state,
+                               curr_csi->suspending_assignment);
                if ((curr_csi->si == si) && 
!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_csi)) {
-                       all_csi_assigned = false;
-                       break;
+                       //ignore suspending_assignment
+                       if (!curr_csi->suspending_assignment) {
+                               all_csi_assigned = false;
+                               break;
+                       }
                }
        }
-
+       TRACE_LEAVE();
        return all_csi_assigned;
 }
 /**
@@ -521,14 +529,17 @@ static uint32_t assign_si_to_su(AVND_SU_
                                                }
                                        /*if ((!single_csi) && (false == 
curr_csi->comp->assigned_flag) && 
                                                                
(m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi)))*/
-                                               if ((false == 
curr_csi->comp->assigned_flag) && 
-                                                       
(m_AVND_COMP_CSI_PRV_ASSIGN_STATE_IS_ASSIGNED(curr_csi))) {
-                                                       if 
(csi_of_same_si_in_assigning_state(curr_csi->comp, si))
-                                                               
curr_csi->comp->assigned_flag = true;
+                                               if (false == 
curr_csi->comp->assigned_flag) {
+                                                       if 
(csi_of_same_si_in_assigning_state(curr_csi->comp, si)) {
+                                                                       
curr_csi->comp->assigned_flag = true;
+                                                       }
                                                }
                                        } else {
-                                               
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, 
AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
-                                               
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi, 
AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
+                                               // Don't move csi to ASSIGNED 
state if its assignment's suspending
+                                               if 
(!curr_csi->suspending_assignment) {
+                                                       
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, 
AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
+                                                       
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi, 
AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
+                                               }
                                        }
                                }
                        }
@@ -828,12 +839,14 @@ static bool susi_operation_in_progress(A
        AVND_COMP_CSI_REC *curr_csi, *t_csi;
        bool opr_done = true;
 
+       TRACE_ENTER2("'%s' '%s'", su->name.value, si ? si->name.value : NULL);
+
        for (curr_si = (si) ? si : (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
                        curr_si && opr_done; curr_si = (si) ? 0 : 
(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_ASSIGNING(curr_csi) || 
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(curr_csi)) {
-                               opr_done = false;       
+                               opr_done = false;
                                break;
                        } else if (m_AVND_COMP_IS_FAILED(curr_csi->comp)){
                                for (t_si = (si) ? si : (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
@@ -847,8 +860,11 @@ static bool susi_operation_in_progress(A
                                                else if 
(m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(t_csi) ||
                                                                
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(t_csi) ||
                                                                
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_UNASSIGNED(t_csi)) {
-                                                       opr_done = false;
-                                                       break;
+
+                                                       if 
(!t_csi->suspending_assignment) {
+                                                               opr_done = 
false;
+                                                               break;
+                                                       }
                                                }
                                        }
                                }
@@ -856,6 +872,19 @@ static bool susi_operation_in_progress(A
                } 
        }
 
+       // reset suspending_assignment flag if opr_done
+       if (opr_done) {
+               for (curr_si = (si) ? si : (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
+                               curr_si; curr_si = (si) ? 0 : (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 (curr_csi->suspending_assignment)
+                                       curr_csi->suspending_assignment = false;
+                       }
+               }
+       }
+
+       TRACE_LEAVE2("%u", opr_done);
        return opr_done;
 }
 

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

Reply via email to