osaf/services/saf/amf/amfd/cluster.cc     |   6 +
 osaf/services/saf/amf/amfd/include/node.h |   6 +-
 osaf/services/saf/amf/amfd/include/sg.h   |   2 +-
 osaf/services/saf/amf/amfd/node.cc        |  35 +++++++++++
 osaf/services/saf/amf/amfd/nodegroup.cc   |  16 +++++
 osaf/services/saf/amf/amfd/sg.cc          |  95 +++++++++++++++++++++++++++++++
 osaf/services/saf/amf/amfd/sg_2n_fsm.cc   |  68 +---------------------
 7 files changed, 159 insertions(+), 69 deletions(-)


The adjustment for uncompleted admin command has been implemented
for 2N SG, but it's applicable for all other SG.

The patch makes this adjustment common for all other SGs, plus
adding support for uncompleted admin command on nodegroup

diff --git a/osaf/services/saf/amf/amfd/cluster.cc 
b/osaf/services/saf/amf/amfd/cluster.cc
--- a/osaf/services/saf/amf/amfd/cluster.cc
+++ b/osaf/services/saf/amf/amfd/cluster.cc
@@ -76,6 +76,11 @@ void avd_cluster_tmr_init_evh(AVD_CL_CB 
         * system that are not NCS specific.
         */
 
+    if (cb->scs_absence_max_duration > 0) {
+       avd_adjust_intermediate_node();
+       avd_adjust_intermediate_ng();
+    }
+
        for (std::map<std::string, AVD_SG*>::const_iterator it = sg_db->begin();
                        it != sg_db->end(); it++) {
                AVD_SG *i_sg = it->second;
@@ -92,6 +97,7 @@ void avd_cluster_tmr_init_evh(AVD_CL_CB 
                 * to satisfy the number of assignment configuration.
                 */
                if (cb->scs_absence_max_duration > 0) {
+                       i_sg->adjust_intermediate_sg(cb);
                        i_sg->adjust_delayed_failover(cb);
                }
                if (i_sg->sg_fsm_state == AVD_SG_FSM_STABLE)
diff --git a/osaf/services/saf/amf/amfd/include/node.h 
b/osaf/services/saf/amf/amfd/include/node.h
--- a/osaf/services/saf/amf/amfd/include/node.h
+++ b/osaf/services/saf/amf/amfd/include/node.h
@@ -221,12 +221,13 @@ extern uint32_t node_admin_unlock_instan
 extern void avd_node_admin_lock_unlock_shutdown(AVD_AVND *node,
                            SaInvocationT invocation, SaAmfAdminOperationIdT 
operationId);
 extern void node_reset_su_try_inst_counter(const AVD_AVND *node);
+extern void avd_adjust_intermediate_node();
 /* AMF Node group */
 extern SaAisErrorT avd_ng_config_get(void);
 extern AVD_AMF_NG *avd_ng_get(const SaNameT *dn);
 extern void avd_ng_constructor(void);
 extern bool node_in_nodegroup(const std::string& node, const AVD_AMF_NG *ng);
-
+extern void avd_adjust_intermediate_ng();
 /* AMF Node SW Bundle */
 extern void avd_nodeswbundle_constructor(void);
 
@@ -234,4 +235,7 @@ extern void ng_complete_admin_op(AVD_AMF
 extern void avd_ng_admin_state_set(AVD_AMF_NG* ng, SaAmfAdminStateT state);
 extern bool are_all_ngs_in_unlocked_state(const AVD_AVND *node);
 extern bool any_ng_in_locked_in_state(const AVD_AVND *node);
+// TODO: will merge any_ng_in_locked_in_state() and any_ng_in_locked_state()
+// into one function with extra param as compared ng state
+extern bool any_ng_in_locked_state(const AVD_AVND *node);
 #endif
diff --git a/osaf/services/saf/amf/amfd/include/sg.h 
b/osaf/services/saf/amf/amfd/include/sg.h
--- a/osaf/services/saf/amf/amfd/include/sg.h
+++ b/osaf/services/saf/amf/amfd/include/sg.h
@@ -424,7 +424,7 @@ public:
        bool is_sg_serviceable_outside_ng(const AVD_AMF_NG *ng);
        SaAisErrorT check_sg_stability();
        bool ng_using_saAmfSGAdminState;
-       
+       void adjust_intermediate_sg(AVD_CL_CB *cb);
        uint32_t term_su_list_in_reverse();
        //Runtime calculates value of saAmfSGNumCurrAssignedSUs;
        uint32_t curr_assigned_sus() const;
diff --git a/osaf/services/saf/amf/amfd/node.cc 
b/osaf/services/saf/amf/amfd/node.cc
--- a/osaf/services/saf/amf/amfd/node.cc
+++ b/osaf/services/saf/amf/amfd/node.cc
@@ -1509,6 +1509,41 @@ bool any_ng_in_locked_in_state(const AVD
        return false;
 }
 
+/**
+ * @brief  Checks if any nodegroup of node are is in LOCKED state.
+ * @param  ptr to Node (AVD_AVND).
+ * @return true/false
+ */
+bool any_ng_in_locked_state(const AVD_AVND *node)
+{
+       for (std::map<std::string, AVD_AMF_NG*>::const_iterator it = 
nodegroup_db->begin();
+                       it != nodegroup_db->end(); it++) {
+               AVD_AMF_NG *ng = it->second;
+               if ((node_in_nodegroup(Amf::to_string(&node->name), ng) == 
true) &&
+                               (ng->saAmfNGAdminState == SA_AMF_ADMIN_LOCKED)) 
{
+                       TRACE("Nodegroup '%s' is in locked-in", ng->name.value);
+                       return true;
+               }
+       }
+       return false;
+}
+
+/*
+ *
+ */
+void avd_adjust_intermediate_node()
+{
+       TRACE_ENTER();
+       for (std::map<std::string, AVD_AVND *>::const_iterator it = 
node_name_db->begin();
+                       it != node_name_db->end(); it++) {
+               AVD_AVND *avnd = it->second;
+               osafassert(avnd);
+               if (avnd->saAmfNodeAdminState == SA_AMF_ADMIN_SHUTTING_DOWN)
+                       node_admin_state_set(avnd, SA_AMF_ADMIN_LOCKED);
+       }
+       TRACE_LEAVE();
+}
+
 void avd_node_constructor(void)
 {
        node_name_db = new AmfDb<std::string, AVD_AVND>;
diff --git a/osaf/services/saf/amf/amfd/nodegroup.cc 
b/osaf/services/saf/amf/amfd/nodegroup.cc
--- a/osaf/services/saf/amf/amfd/nodegroup.cc
+++ b/osaf/services/saf/amf/amfd/nodegroup.cc
@@ -1280,6 +1280,22 @@ done:
        TRACE_LEAVE();
 }
 
+/*
+ *
+ */
+void avd_adjust_intermediate_ng() {
+
+       TRACE_ENTER();
+       for (std::map<std::string, AVD_AMF_NG*>::const_iterator it = 
nodegroup_db->begin();
+                       it != nodegroup_db->end(); it++) {
+               AVD_AMF_NG *ng = it->second;
+               if (ng->saAmfNGAdminState == SA_AMF_ADMIN_SHUTTING_DOWN) {
+                       avd_ng_admin_state_set(ng, SA_AMF_ADMIN_LOCKED);
+               }
+       }
+       TRACE_LEAVE();
+}
+
 /**
  * Constructor for node group class. Should be called first of all.
  */
diff --git a/osaf/services/saf/amf/amfd/sg.cc b/osaf/services/saf/amf/amfd/sg.cc
--- a/osaf/services/saf/amf/amfd/sg.cc
+++ b/osaf/services/saf/amf/amfd/sg.cc
@@ -2083,3 +2083,98 @@ uint32_t AVD_SG::curr_non_instantiated_s
                [](AVD_SU *su) -> bool { return ((su->list_of_susi == nullptr) 
&&
                        (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED));}));      
 }
+
+void AVD_SG::adjust_intermediate_sg(AVD_CL_CB *cb)
+{
+       AVD_SU_SI_REL *curr_susi;
+       TRACE_ENTER();
+
+       // move SG from SHUTTING_DOWN to LOCKED
+       if (saAmfSGAdminState == SA_AMF_ADMIN_SHUTTING_DOWN)
+               avd_sg_admin_state_set(this, SA_AMF_ADMIN_LOCKED);
+       // directly move SU from SHUTTING_DOWN to LOCKED
+       for (const auto& su : list_of_su) {
+               if (su->saAmfSUAdminState == SA_AMF_ADMIN_SHUTTING_DOWN)
+                       su->set_admin_state(SA_AMF_ADMIN_LOCKED);
+       }
+       // directly move SI from SHUTTING_DOWN to LOCKED
+       for (const auto& si : list_of_si) {
+               if (si->saAmfSIAdminState == SA_AMF_ADMIN_SHUTTING_DOWN)
+                       si->set_admin_state(SA_AMF_ADMIN_LOCKED);
+       }
+
+       // Check AdminState of node/sg/su whether is LOCKED
+       // which states will cause removal of assignment
+       for (const auto& su : list_of_su) {
+               SaAmfHAStateT su_ha_state;
+               TRACE("Check AdminState of SU/SG/Node, SU:'%s', 
saAmfSUAdminState:%u, "
+                               "saAmfSGAdminState:%u, saAmfNodeAdminState:%u, "
+                               "saAmfSUNumCurrActiveSIs:%u, 
saAmfSUNumCurrStandbySIs:%u",
+                               su->name.value,
+                               su->saAmfSUAdminState,
+                               su->sg_of_su->saAmfSGAdminState,
+                               su->su_on_node->saAmfNodeAdminState,
+                               su->saAmfSUNumCurrActiveSIs,
+                               su->saAmfSUNumCurrStandbySIs);
+
+               if (su->saAmfSUAdminState == SA_AMF_ADMIN_LOCKED ||
+                       su->sg_of_su->saAmfSGAdminState == SA_AMF_ADMIN_LOCKED 
||
+                       su->su_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_LOCKED ||
+                       any_ng_in_locked_state(su->su_on_node) == true) {
+
+                       if (su->list_of_susi) {
+                               su_ha_state = avd_su_state_determine(su);
+                               if (su_ha_state == SA_AMF_HA_QUIESCED ||
+                                       su_ha_state == SA_AMF_HA_STANDBY ||
+                                       su_ha_state == SA_AMF_HA_QUIESCING) {
+                                       // remove all susi belong to this su
+                                       avd_sg_su_si_del_snd(cb, su);
+                               } else if (su_ha_state == SA_AMF_HA_ACTIVE) {
+                                       // quiesced this su
+                                       avd_sg_su_si_mod_snd(cb, su, 
SA_AMF_HA_QUIESCED);
+                               }
+                               avd_sg_su_oper_list_add(cb, su, false);
+                               set_fsm_state(AVD_SG_FSM_SG_REALIGN);
+                       }
+               }
+       }
+
+       // Check AdminState of si whether is LOCKED
+       for (const auto& si : list_of_si) {
+
+               TRACE("Check SI:'%s', saAmfSIAdminState:%u, 
saAmfSINumCurrActiveAssignments:%u, "
+                               "saAmfSINumCurrStandbyAssignments:%u",
+                               si->name.value,
+                               si->saAmfSIAdminState,
+                               si->saAmfSINumCurrActiveAssignments,
+                               si->saAmfSINumCurrStandbyAssignments);
+
+               for (curr_susi = si->list_of_sisu; curr_susi;
+                               curr_susi = curr_susi->si_next) {
+
+                       TRACE("Check SUSI:'%s,%s', HaState:%u", 
curr_susi->su->name.value,
+                                       curr_susi->si->name.value,
+                                       curr_susi->state);
+
+                       if (si->saAmfSIAdminState == SA_AMF_ADMIN_LOCKED) {
+                               // only process assigned susi, ignore the 
others due to
+                               // being modified or unassigned, ...
+                               if (curr_susi->fsm == AVD_SU_SI_STATE_ASGND) {
+                                       if (curr_susi->state == 
SA_AMF_HA_STANDBY ||
+                                               curr_susi->state == 
SA_AMF_HA_QUIESCED ||
+                                               curr_susi->state == 
SA_AMF_HA_QUIESCING) {
+                                               // remove one susi
+                                               avd_susi_del_send(curr_susi);
+                                       } else if (curr_susi->state == 
SA_AMF_HA_ACTIVE) {
+                                               // quiesced one susi
+                                               avd_susi_mod_send(curr_susi, 
SA_AMF_HA_QUIESCED);
+                                       }
+                                       set_fsm_state(AVD_SG_FSM_SG_REALIGN);
+                                       avd_sg_su_oper_list_add(cb, 
curr_susi->su, false);
+                               }
+                       }
+               }
+       }
+
+       TRACE_LEAVE();
+}
diff --git a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc 
b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
--- a/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
+++ b/osaf/services/saf/amf/amfd/sg_2n_fsm.cc
@@ -3538,52 +3538,7 @@ void SG_2N::adjust_delayed_failover(AVD_
        AVD_SU_SI_REL *curr_susi;
        TRACE_ENTER();
 
-       // Check AdminState of node/sg/su whether is LOCKED or SHUTTING_DOWN
-       // which states will cause removal of assignment
-       for (const auto& su : list_of_su) {
-               SaAmfHAStateT su_ha_state;
-               TRACE("Check AdminState of SU/SG/Node, SU:'%s', 
saAmfSUAdminState:%u, "
-                               "saAmfSGAdminState:%u, saAmfNodeAdminState:%u, "
-                               "saAmfSUNumCurrActiveSIs:%u, 
saAmfSUNumCurrStandbySIs:%u",
-                               su->name.value,
-                               su->saAmfSUAdminState,
-                               su->sg_of_su->saAmfSGAdminState,
-                               su->su_on_node->saAmfNodeAdminState,
-                               su->saAmfSUNumCurrActiveSIs,
-                               su->saAmfSUNumCurrStandbySIs);
-
-               if (su->saAmfSUAdminState == SA_AMF_ADMIN_LOCKED ||
-                       su->sg_of_su->saAmfSGAdminState == SA_AMF_ADMIN_LOCKED 
||
-                       su->su_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_LOCKED ||
-                       su->saAmfSUAdminState == SA_AMF_ADMIN_SHUTTING_DOWN ||
-                       su->sg_of_su->saAmfSGAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN ||
-                       su->su_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN) {
-
-                       if (su->list_of_susi) {
-                               su_ha_state = avd_su_state_determine(su);
-                               if (su_ha_state == SA_AMF_HA_QUIESCED ||
-                                       su_ha_state == SA_AMF_HA_STANDBY ||
-                                       su_ha_state == SA_AMF_HA_QUIESCING) {
-                                       // remove all susi belong to this su
-                                       avd_sg_su_si_del_snd(cb, su);
-                               } else if (su_ha_state == SA_AMF_HA_ACTIVE) {
-                                       // quiesced this su
-                                       avd_sg_su_si_mod_snd(cb, su, 
SA_AMF_HA_QUIESCED);
-                               }
-                               avd_sg_su_oper_list_add(cb, su, false);
-                               set_fsm_state(AVD_SG_FSM_SG_REALIGN);
-                       }
-                       // directly move from SHUTTING_DOWN to LOCKED
-                       if (su->saAmfSUAdminState == SA_AMF_ADMIN_SHUTTING_DOWN)
-                               su->set_admin_state(SA_AMF_ADMIN_LOCKED);
-                       if (su->sg_of_su->saAmfSGAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN)
-                               avd_sg_admin_state_set(su->sg_of_su, 
SA_AMF_ADMIN_LOCKED);
-                       if (su->su_on_node->saAmfNodeAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN)
-                               node_admin_state_set(su->su_on_node, 
SA_AMF_ADMIN_LOCKED);
-               }
-       }
-
-       // Check AdminState of si whether is LOCKED or SHUTTING_DOWN
+       // Check AdminState of si whether is LOCKED
        for (const auto& si : list_of_si) {
 
                AVD_SU_SI_REL *curr_active_susi = nullptr;
@@ -3604,27 +3559,6 @@ void SG_2N::adjust_delayed_failover(AVD_
                                        curr_susi->si->name.value,
                                        curr_susi->state);
 
-                       if (si->saAmfSIAdminState == SA_AMF_ADMIN_SHUTTING_DOWN 
||
-                               si->saAmfSIAdminState == SA_AMF_ADMIN_LOCKED) {
-                               // only process assigned susi, ignore the 
others due to
-                               // being modified or unassigned, ...
-                               if (curr_susi->fsm == AVD_SU_SI_STATE_ASGND) {
-                                       if (curr_susi->state == 
SA_AMF_HA_STANDBY ||
-                                               curr_susi->state == 
SA_AMF_HA_QUIESCED ||
-                                               curr_susi->state == 
SA_AMF_HA_QUIESCING) {
-                                               // remove one susi
-                                               avd_susi_del_send(curr_susi);
-                                       } else if (curr_susi->state == 
SA_AMF_HA_ACTIVE) {
-                                               // quiesced one susi
-                                               avd_susi_mod_send(curr_susi, 
SA_AMF_HA_QUIESCED);
-                                       }
-                                       set_fsm_state(AVD_SG_FSM_SG_REALIGN);
-                                       avd_sg_su_oper_list_add(cb, 
curr_susi->su, false);
-                               }
-                               // directly move from SHUTTING_DOWN to LOCKED
-                               if (si->saAmfSIAdminState == 
SA_AMF_ADMIN_SHUTTING_DOWN)
-                                       
si->set_admin_state(SA_AMF_ADMIN_LOCKED);
-                       }
                        if (curr_susi->fsm != AVD_SU_SI_STATE_ASGND)
                                continue;
 

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to