osaf/services/saf/amf/amfd/role.cc   |  10 ++++----
 osaf/services/saf/amf/amfd/sgproc.cc |   2 +-
 osaf/services/saf/amf/amfd/siass.cc  |   4 ++-
 osaf/services/saf/amf/amfnd/err.cc   |  37 ++++++++++-------------------------
 osaf/services/saf/amf/amfnd/susm.cc  |  20 ++++++++++++++++--
 5 files changed, 37 insertions(+), 36 deletions(-)


diff --git a/osaf/services/saf/amf/amfd/role.cc 
b/osaf/services/saf/amf/amfd/role.cc
--- a/osaf/services/saf/amf/amfd/role.cc
+++ b/osaf/services/saf/amf/amfd/role.cc
@@ -180,6 +180,11 @@ uint32_t avd_active_role_initialization(
                goto done;
        }
 
+       if (avd_imm_impl_set() != SA_AIS_OK) {
+               LOG_ER("avd_imm_impl_set FAILED");
+               goto done;
+       }
+
        if (avd_imm_config_get() != NCSCC_RC_SUCCESS) {
                LOG_ER("avd_imm_config_get FAILED");
                goto done;
@@ -187,11 +192,6 @@ uint32_t avd_active_role_initialization(
 
        cb->init_state = AVD_CFG_DONE;
 
-       if (avd_imm_impl_set() != SA_AIS_OK) {
-               LOG_ER("avd_imm_impl_set FAILED");
-               goto done;
-       }
-
        avd_imm_update_runtime_attrs();
 
        status = NCSCC_RC_SUCCESS;
diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
b/osaf/services/saf/amf/amfd/sgproc.cc
--- a/osaf/services/saf/amf/amfd/sgproc.cc
+++ b/osaf/services/saf/amf/amfd/sgproc.cc
@@ -282,7 +282,7 @@ void su_try_repair(const AVD_SU *su)
 {
        TRACE_ENTER2("Repair for SU:'%s'", su->name.value);
 
-       if ((su->sg_of_su->saAmfSGAutoRepair) && (su->saAmfSUFailover) &&
+       if ((su->sg_of_su->saAmfSGAutoRepair) &&
                        (su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) &&
                        (su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_INSTANTIATION_FAILED) && 
                        (su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_TERMINATION_FAILED)) {
diff --git a/osaf/services/saf/amf/amfd/siass.cc 
b/osaf/services/saf/amf/amfd/siass.cc
--- a/osaf/services/saf/amf/amfd/siass.cc
+++ b/osaf/services/saf/amf/amfd/siass.cc
@@ -888,7 +888,9 @@ SaAisErrorT avd_susi_recreate(AVSV_N2D_N
                        susi->su->inc_curr_act_si();
                        susi->si->inc_curr_act_ass();
                }
-
+                su->saAmfSUHostedByNode = node->name;
+                avd_saImmOiRtObjectUpdate(&su->name, "saAmfSUHostedByNode",
+                        SA_IMM_ATTR_SANAMET, &su->saAmfSUHostedByNode);
                m_AVSV_SEND_CKPT_UPDT_ASYNC_ADD(avd_cb, susi, 
AVSV_CKPT_AVD_SI_ASS);
        }
 
diff --git a/osaf/services/saf/amf/amfnd/err.cc 
b/osaf/services/saf/amf/amfnd/err.cc
--- a/osaf/services/saf/amf/amfnd/err.cc
+++ b/osaf/services/saf/amf/amfnd/err.cc
@@ -773,28 +773,6 @@ uint32_t avnd_err_rcvr_comp_failover(AVN
                        LOG_ER("cleanup of '%s' failed", 
failed_comp->name.value);
                        goto done;
                }
-
-               // if headless, remove all assignments from this SU
-               if (cb->is_avd_down == true) {
-                       AVND_SU_SI_REC *si = 0;
-                       AVND_SU_SI_REC *next_si = 0;
-                       uint32_t rc = NCSCC_RC_SUCCESS;
-                       TRACE("Removing assignments from '%s'", su->name.value);
-
-                       m_AVND_SU_ASSIGN_PEND_SET(su);
-
-                       /* scan the su-si list & remove the sis */
-                       for (si = (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_FIRST(&su->si_list); si;) {
-                               next_si = (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_NEXT(&si->su_dll_node);
-                               rc = avnd_su_si_remove(cb, su, si);
-                               if (NCSCC_RC_SUCCESS != rc) {
-                                       LOG_ER("failed to remove SI assignment 
from '%s'",
-                                               su->name.value);
-                                       break;
-                               }
-                               si = next_si;
-                       }
-               }
        } else  {
                /* request director to orchestrate component failover */
                rc = avnd_di_oper_send(cb, failed_comp->su, 
AVSV_ERR_RCVR_SU_FAILOVER);
@@ -1382,10 +1360,13 @@ uint32_t avnd_err_restart_esc_level_2(AV
        TRACE_ENTER();
 
        /* first time in this level */
-       if (su->sufailover)
+       if (su->sufailover) {
                *esc_rcvr = AVSV_ERR_RCVR_SU_FAILOVER;
-       else
+       } else if (su->sufailover == false && su->is_ncs == false && 
cb->is_avd_down == true) {
+               *esc_rcvr = AVSV_ERR_RCVR_SU_FAILOVER;
+       } else {
                *esc_rcvr = 
static_cast<AVSV_ERR_RCVR>(SA_AMF_COMPONENT_FAILOVER);
+       }
 
        /* External components are not supposed to escalate SU Failover of
           cluster components. For Ext component, SU Failover will be limited to
@@ -1450,10 +1431,14 @@ AVSV_ERR_RCVR avnd_err_esc_su_failover(A
        TRACE_ENTER();
 
        /* initialize */
-       if (su->sufailover)
+       if (su->sufailover) {
                *esc_rcvr = AVSV_ERR_RCVR_SU_FAILOVER;
-       else
+       } else if (su->sufailover == false && su->is_ncs == false && 
cb->is_avd_down == true) {
+               LOG_NO("Director is down. Escalate to SU failover for 
'%s'",su->name.value);
+               *esc_rcvr = AVSV_ERR_RCVR_SU_FAILOVER;
+       } else {
                *esc_rcvr = 
static_cast<AVSV_ERR_RCVR>(SA_AMF_COMPONENT_FAILOVER);
+       }
 
        if (true == su->su_is_external) {
                /* External component should not contribute to NODE FAILOVER of 
cluster
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
@@ -738,8 +738,13 @@ uint32_t avnd_su_si_remove(AVND_CB *cb, 
 
        /* if no si is specified, the action is aimed at all the sis... pick up 
any si */
        curr_si = (si) ? si : (AVND_SU_SI_REC 
*)m_NCS_DBLIST_FIND_FIRST(&su->si_list);
-       if (!curr_si)
+       if (!curr_si) {
+               // after headless, we may have a buffered susi remove msg
+               // if the susi can't be found (already removed), reset flag
+               LOG_NO("no SI found in '%s'", su->name.value);
+               m_AVND_SU_ALL_SI_RESET(su);
                goto done;
+       }
 
        /* initiate the si removal for pi su */
        if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
@@ -3474,10 +3479,19 @@ uint32_t avnd_su_pres_instfailed_compuni
  */
 bool sufailover_in_progress(const AVND_SU *su)
 {
+       TRACE_ENTER2("%s", su->name.value);
        if (m_AVND_SU_IS_FAILED(su) && (su->sufailover) && 
(!m_AVND_SU_IS_RESTART(su)) &&
-                        (avnd_cb->oper_state != SA_AMF_OPERATIONAL_DISABLED) 
&& (!su->is_ncs))
+                        (avnd_cb->oper_state != SA_AMF_OPERATIONAL_DISABLED) 
&& (!su->is_ncs)) {
+                               TRACE_LEAVE();
                                return true;
-       return false;
+       } else if (m_AVND_SU_IS_FAILED(su) && (su->sufailover == false) && 
(!m_AVND_SU_IS_RESTART(su)) &&
+                        (avnd_cb->oper_state != SA_AMF_OPERATIONAL_DISABLED) 
&& (!su->is_ncs) && avnd_cb->is_avd_down == true) {
+                               TRACE_LEAVE();
+                               return true;
+       } else {
+               TRACE_LEAVE();
+               return false;
+       }
 }
 
 /**

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