osaf/services/saf/avsv/avd/avd_clm.cc         |    1 +
 osaf/services/saf/avsv/avd/avd_node.cc        |    7 +-
 osaf/services/saf/avsv/avd/avd_sg.cc          |    9 +-
 osaf/services/saf/avsv/avd/avd_sgproc.cc      |  371 ++++++++++++++++---------
 osaf/services/saf/avsv/avd/avd_su.cc          |    1 +
 osaf/services/saf/avsv/avd/include/avd_proc.h |    3 +
 6 files changed, 242 insertions(+), 150 deletions(-)


Refloating the patch after incorporating comments.

diff --git a/osaf/services/saf/avsv/avd/avd_clm.cc 
b/osaf/services/saf/avsv/avd/avd_clm.cc
--- a/osaf/services/saf/avsv/avd/avd_clm.cc
+++ b/osaf/services/saf/avsv/avd/avd_clm.cc
@@ -50,6 +50,7 @@ static void clm_node_join_complete(AVD_A
                                        (node->node_state == 
AVD_AVND_STATE_NO_CONFIG) ||
                                        (node->node_state == 
AVD_AVND_STATE_NCS_INIT)) {
                                if ((su->sg_of_su->saAmfSGAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+                                               (su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) && 
                                                (su->saAmfSUAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) {
                                        /* When the SU will instantiate then 
prescence state change message will come
                                           and so store the callback parameters 
to send response later on. */
diff --git a/osaf/services/saf/avsv/avd/avd_node.cc 
b/osaf/services/saf/avsv/avd/avd_node.cc
--- a/osaf/services/saf/avsv/avd/avd_node.cc
+++ b/osaf/services/saf/avsv/avd/avd_node.cc
@@ -721,7 +721,8 @@ uint32_t node_admin_unlock_instantiation
        while (su != NULL) {
                if ((su->saAmfSUAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
                    (su->sg_of_su->saAmfSGAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
-                   (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED)) {
+                   (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED) && 
+                   (su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)) {
 
                        if (su->saAmfSUPreInstantiable == true) {
                                if (su->sg_of_su->saAmfSGNumPrefInserviceSUs >
@@ -735,9 +736,7 @@ uint32_t node_admin_unlock_instantiation
                                                LOG_WA("Failed Instantiation 
'%s'", su->name.value);
                                        }
                                }
-                       } else {
-                               avd_su_oper_state_set(su, 
SA_AMF_OPERATIONAL_ENABLED);
-                       }
+                       } 
                }
                su = su->avnd_list_su_next;
        }
diff --git a/osaf/services/saf/avsv/avd/avd_sg.cc 
b/osaf/services/saf/avsv/avd/avd_sg.cc
--- a/osaf/services/saf/avsv/avd/avd_sg.cc
+++ b/osaf/services/saf/avsv/avd/avd_sg.cc
@@ -944,8 +944,9 @@ static void sg_app_sg_admin_unlock_inst(
        /* Instantiate the SUs in this SG */
        for (su = sg->list_of_su, su_try_inst = 0; su != NULL; su = 
su->sg_list_su_next) {
                if ((su->saAmfSUAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
-                               (su->su_on_node->saAmfNodeAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION)
-                               && (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED)) {
+                               (su->su_on_node->saAmfNodeAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+                               (su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) &&
+                               (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED)) {
 
                        if (su->saAmfSUPreInstantiable == true) {
                                if (su->su_on_node->node_state == 
AVD_AVND_STATE_PRESENT) {
@@ -963,9 +964,7 @@ static void sg_app_sg_admin_unlock_inst(
                                /* set uncondionally of msg snd outcome */
                                m_AVD_SET_SU_TERM(cb, su, false);
 
-                       } else {
-                               avd_su_oper_state_set(su, 
SA_AMF_OPERATIONAL_ENABLED);
-                       }
+                       } 
                }
        }
 
diff --git a/osaf/services/saf/avsv/avd/avd_sgproc.cc 
b/osaf/services/saf/avsv/avd/avd_sgproc.cc
--- a/osaf/services/saf/avsv/avd/avd_sgproc.cc
+++ b/osaf/services/saf/avsv/avd/avd_sgproc.cc
@@ -36,6 +36,9 @@
 #include <avd_si_dep.h>
 
 static SaAisErrorT avd_d2n_reboot_snd(AVD_AVND *node);
+static uint32_t sg_su_failover_func(AVD_SU *su);
+static void su_try_repair(const AVD_SU *su);
+static uint32_t su_recover_from_fault(AVD_SU *su);
 
 /*****************************************************************************
  * Function: avd_new_assgn_susi
@@ -370,14 +373,19 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
                                        while (i_su != NULL) {
                                                
avd_su_readiness_state_set(i_su, SA_AMF_READINESS_OUT_OF_SERVICE);
                                                if (i_su->list_of_susi != 
AVD_SU_SI_REL_NULL) {
-                                                       node_reboot_req = false;
-                                                       /* Since assignments 
exists call the SG FSM.
+                                                       /* Delay Node reboot if:
+                                                               a)Faulted SU 
has saAmfSUFailover flag set but 
+                                                                       other 
healthy SUs are present on node.
+                                                               b)Only faulted 
SU exists on the node and its 
+                                                                       
saAmfSUFailover flag is false.
                                                         */
-                                                       if 
(i_su->sg_of_su->su_fault(cb, i_su) == NCSCC_RC_FAILURE) {
-                                                               /* Bad 
situation. Free the message and return since
-                                                                * receive id 
was not processed the event will again
-                                                                * comeback 
which we can then process.
-                                                                */
+                                                       if (((i_su == su) && 
(!i_su->saAmfSUFailover)) ||
+                                                                       ((i_su 
!= su) &&
+                                                                
(i_su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED)))
+                                                               node_reboot_req 
= false;
+
+                                                       /* Since assignments 
exists call the SG FSM.*/
+                                                       if 
(su_recover_from_fault(i_su) == NCSCC_RC_FAILURE) {
                                                                LOG_ER("%s:%d 
%s", __FUNCTION__, __LINE__, i_su->name.value);
                                                                goto done;
                                                        }
@@ -387,16 +395,12 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
                                                 * to be done for the SG on 
which this SU exists.
                                                 */
                                                if (avd_sg_app_su_inst_func(cb, 
i_su->sg_of_su) == NCSCC_RC_FAILURE) {
-                                                       /* Bad situation. Free 
the message and return since
-                                                        * receive id was not 
processed the event will again
-                                                        * comeback which we 
can then process.
-                                                        */
                                                        LOG_ER("%s:%d %s", 
__FUNCTION__, __LINE__, i_su->name.value);
                                                        goto done;
                                                }
 
                                                i_su = i_su->avnd_list_su_next;
-                                       }       /* while(i_su != AVD_SU_NULL) */
+                                       }
                                        break;
                                default :
                                        break;
@@ -410,41 +414,53 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
                                                avd_d2n_reboot_snd(node);
                                        } else {
                                                saflog(LOG_NOTICE, 
amfSvcUsrName,
-                                                               "Autorepair 
disabled for '%s', NO reboot ordered",
+                                                               "NodeAutorepair 
disabled for '%s', NO reboot ordered",
                                                                
node->name.value);
+                                               
                                        }
                                }
                        } else { /* if 
(n2d_msg->msg_info.n2d_opr_state.node_oper_state == 
SA_AMF_OPERATIONAL_DISABLED) */
 
-                                       if (su->list_of_susi != 
AVD_SU_SI_REL_NULL) {
-                                               /* Since assignments exists 
call the SG FSM.
-                                                */
+                               if (su->list_of_susi != AVD_SU_SI_REL_NULL) {
+                                       /* Since assignments exists call the SG 
FSM. */
+                                       switch 
(n2d_msg->msg_info.n2d_opr_state.rec_rcvr.saf_amf) {
+                                       case SA_AMF_COMPONENT_FAILOVER:
                                                if (su->sg_of_su->su_fault(cb, 
su) == NCSCC_RC_FAILURE) {
-                                                       /* Bad situation. Free 
the message and return since
-                                                        * receive id was not 
processed the event will again
-                                                        * comeback which we 
can then process.
-                                                        */
                                                        LOG_ER("%s:%d %s", 
__FUNCTION__, __LINE__, su->name.value);
                                                        goto done;
                                                }
+                                               break;
+                                       case AVSV_ERR_RCVR_SU_FAILOVER:
+                                               if (sg_su_failover_func(su) == 
NCSCC_RC_FAILURE) {
+                                                       LOG_ER("%s:%d %s", 
__FUNCTION__, __LINE__, su->name.value);
+                                                       goto done;
+                                               }
+                                               break;
+                                       default :
+                                               LOG_ER("Recovery:'%u' not 
supported",
+                                                               
n2d_msg->msg_info.n2d_opr_state.rec_rcvr.saf_amf);
+                                               break;
                                        }
+                               }
 
-                                       /* Verify the SG to check if any 
instantiations need
-                                        * to be done for the SG on which this 
SU exists.
+                               su_try_repair(su);
+
+                               /* Verify the SG to check if any instantiations 
need
+                                * to be done for the SG on which this SU 
exists.
+                                */
+                               if (avd_sg_app_su_inst_func(cb, su->sg_of_su) 
== NCSCC_RC_FAILURE) {
+                                       /* Bad situation. Free the message and 
return since
+                                        * receive id was not processed the 
event will again
+                                        * comeback which we can then process.
                                         */
-                                       if (avd_sg_app_su_inst_func(cb, 
su->sg_of_su) == NCSCC_RC_FAILURE) {
-                                               /* Bad situation. Free the 
message and return since
-                                                * receive id was not processed 
the event will again
-                                                * comeback which we can then 
process.
-                                                */
-                                               LOG_ER("%s:%d %s", 
__FUNCTION__, __LINE__, su->sg_of_su->name.value);
-                                               goto done;
-                                       }
+                                       LOG_ER("%s:%d %s", __FUNCTION__, 
__LINE__, su->sg_of_su->name.value);
+                                       goto done;
+                               }
 
-                               } /* else 
(n2d_msg->msg_info.n2d_opr_state.node_oper_state == 
SA_AMF_OPERATIONAL_DISABLED) */
+                       } /* else 
(n2d_msg->msg_info.n2d_opr_state.node_oper_state == 
SA_AMF_OPERATIONAL_DISABLED) */
 
-                       }
-                       /* else if(cb->init_state == AVD_APP_STATE) */
+               }
+               /* else if(cb->init_state == AVD_APP_STATE) */
        } /* if (n2d_msg->msg_info.n2d_opr_state.su_oper_state == 
SA_AMF_OPERATIONAL_DISABLED) */
        else if (n2d_msg->msg_info.n2d_opr_state.su_oper_state == 
SA_AMF_OPERATIONAL_ENABLED) {
                avd_su_oper_state_set(su, SA_AMF_OPERATIONAL_ENABLED);
@@ -472,6 +488,13 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
                        m_AVD_GET_SU_NODE_PTR(cb, su, su_node_ptr);
 
                        if (m_AVD_APP_SU_IS_INSVC(su, su_node_ptr)) {
+                               /* If oper state of Uninstantiated SU got 
ENABLED so try to instantiate it 
+                                  after evaluating SG. */
+                               if (su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED) {
+                                       avd_sg_app_su_inst_func(cb, 
su->sg_of_su);
+                                       goto done;
+                               }
+
                                avd_su_readiness_state_set(su, 
SA_AMF_READINESS_IN_SERVICE);
                                if ((cb->init_state == AVD_APP_STATE) && 
(old_state == SA_AMF_READINESS_OUT_OF_SERVICE)) {
                                        /* An application SU has become in 
service call SG FSM */
@@ -908,17 +931,10 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                if ((su->saAmfSUNumCurrActiveSIs == 0) && 
(su->saAmfSUNumCurrStandbySIs == 0)) {
                                        /* For lock and shutdown, response to 
IMM admin operation should be
                                           sent when response for DEL operation 
is received */
-                                       if (AVSV_SUSI_ACT_DEL == 
n2d_msg->msg_info.n2d_su_si_assign.msg_act) {
-                                               
avd_saImmOiAdminOperationResult(cb->immOiHandle, 
-                                                               
su->pend_cbk.invocation, SA_AIS_OK);
-                                               su->pend_cbk.invocation = 0;
-                                               su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-                                       }
+                                       if (AVSV_SUSI_ACT_DEL == 
n2d_msg->msg_info.n2d_su_si_assign.msg_act)
+                                               avd_su_complete_admin_op(su, 
SA_AIS_OK);
                                } else if 
(n2d_msg->msg_info.n2d_su_si_assign.error != NCSCC_RC_SUCCESS) {
-                                       
avd_saImmOiAdminOperationResult(cb->immOiHandle, su->pend_cbk.invocation,
-                                                                           
SA_AIS_ERR_REPAIR_PENDING);
-                                       su->pend_cbk.invocation = 0;
-                                       su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
+                                       avd_su_complete_admin_op(su, 
SA_AIS_ERR_REPAIR_PENDING);
                                }
                                /* else lock is still not complete so don't 
send result. */
                        } else if (su->pend_cbk.admin_oper == 
SA_AMF_ADMIN_UNLOCK) {
@@ -926,18 +942,12 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                /* Respond to IMM when SG is STABLE or if a 
fault occured */
                                if (n2d_msg->msg_info.n2d_su_si_assign.error == 
NCSCC_RC_SUCCESS) {
                                        if (su->sg_of_su->sg_fsm_state == 
AVD_SG_FSM_STABLE) {
-                                               
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-                                                               
su->pend_cbk.invocation, SA_AIS_OK);
-                                               su->pend_cbk.invocation = 0;
-                                               su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
+                                               avd_su_complete_admin_op(su, 
SA_AIS_OK);
                                        } else
                                                ; // wait for SG to become 
STABLE
-                               } else {
-                                       
avd_saImmOiAdminOperationResult(cb->immOiHandle, su->pend_cbk.invocation,
-                                                                           
SA_AIS_ERR_TIMEOUT);
-                                       su->pend_cbk.invocation = 0;
-                                       su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-                               }
+                               } 
+                               else
+                                       avd_su_complete_admin_op(su, 
SA_AIS_ERR_TIMEOUT);
                        }
                } else if (su->su_on_node->admin_node_pend_cbk.invocation != 0) 
{
                        /* decrement the SU count on the node undergoing admin 
operation  
@@ -979,12 +989,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                                (su->sg_of_su->sg_fsm_state == 
AVD_SG_FSM_STABLE)) {
                                        for (temp_su = 
su->sg_of_su->list_of_su; temp_su != NULL; 
                                                        temp_su = 
temp_su->sg_list_su_next) {
-                                               if 
(temp_su->pend_cbk.invocation != 0) {
-                                                       
avd_saImmOiAdminOperationResult(cb->immOiHandle,
-                                                                       
temp_su->pend_cbk.invocation, SA_AIS_OK);
-                                                       
temp_su->pend_cbk.invocation = 0;
-                                                       
temp_su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(0);
-                                               }
+                                               
avd_su_complete_admin_op(temp_su, SA_AIS_OK);
                                        }
                                } else
                                        ; // wait for SG to become STABLE
@@ -1035,7 +1040,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
                                avd_d2n_reboot_snd(node);
                        } else {
                                saflog(LOG_NOTICE, amfSvcUsrName,
-                                       "Autorepair disabled for '%s', NO 
reboot ordered",
+                                       "NodeAutorepair disabled for '%s', NO 
reboot ordered",
                                        node->name.value);
                        }
                }
@@ -1089,6 +1094,7 @@ void avd_sg_app_node_su_inst_func(AVD_CL
                            (i_su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED) &&
                            (i_su->saAmfSUAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) && 
                            (i_su->sg_of_su->saAmfSGAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
+                           (i_su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) && 
                            (i_su->su_on_node->saAmfNodeAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) { 
                                if (i_su->saAmfSUPreInstantiable == true) {
                                        if 
(i_su->sg_of_su->saAmfSGNumPrefInserviceSUs >
@@ -1184,8 +1190,8 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_
                        if ((i_su->saAmfSUPreInstantiable == false) &&
                            (i_su->saAmfSUPresenceState == 
SA_AMF_PRESENCE_UNINSTANTIATED) &&
                            (su_node_ptr->saAmfNodeOperState == 
SA_AMF_OPERATIONAL_ENABLED) &&
+                           (i_su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) &&
                            (i_su->term_state == false)) {
-                               avd_su_oper_state_set(i_su, 
SA_AMF_OPERATIONAL_ENABLED);
                                m_AVD_GET_SU_NODE_PTR(cb, i_su, su_node_ptr);
 
                                if (m_AVD_APP_SU_IS_INSVC(i_su, su_node_ptr)) {
@@ -1208,6 +1214,7 @@ uint32_t avd_sg_app_su_inst_func(AVD_CL_
                                        (i_su->su_on_node->saAmfNodeAdminState 
!= SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
                                        (su_node_ptr->saAmfNodeOperState == 
SA_AMF_OPERATIONAL_ENABLED) &&
                                        (su_node_ptr->node_info.member == true) 
&&
+                                       (i_su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) &&
                                        (i_su->term_state == false)) {
 
                                /* Try to Instantiate this SU */
@@ -1346,7 +1353,6 @@ done:
 void avd_node_down_mw_susi_failover(AVD_CL_CB *cb, AVD_AVND *avnd)
 {
        AVD_SU *i_su;
-       AVD_COMP *i_comp;
 
        TRACE_ENTER2("'%s'", avnd->name.value);
 
@@ -1362,31 +1368,8 @@ void avd_node_down_mw_susi_failover(AVD_
                avd_su_oper_state_set(i_su, SA_AMF_OPERATIONAL_DISABLED);
                avd_su_pres_state_set(i_su, SA_AMF_PRESENCE_UNINSTANTIATED);
                avd_su_readiness_state_set(i_su, 
SA_AMF_READINESS_OUT_OF_SERVICE);
-
-               /* Check if there was any admin operations going on this SU. */
-               if (i_su->pend_cbk.invocation != 0) {
-                       avd_saImmOiAdminOperationResult(cb->immOiHandle, 
i_su->pend_cbk.invocation,
-                                       SA_AIS_ERR_TIMEOUT);
-                       i_su->pend_cbk.invocation = 0;
-                       i_su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-               }
-
-               i_comp = i_su->list_of_comp;
-               while (i_comp != NULL) {
-                       i_comp->curr_num_csi_actv = 0;
-                       i_comp->curr_num_csi_stdby = 0;
-                       avd_comp_oper_state_set(i_comp, 
SA_AMF_OPERATIONAL_DISABLED);
-                       avd_comp_pres_state_set(i_comp, 
SA_AMF_PRESENCE_UNINSTANTIATED);
-                       i_comp->saAmfCompRestartCount = 0;
-                       if (i_comp->admin_pend_cbk.invocation != 0) {
-                               
avd_saImmOiAdminOperationResult(cb->immOiHandle, 
-                                               
i_comp->admin_pend_cbk.invocation, SA_AIS_ERR_TIMEOUT);
-                               i_comp->admin_pend_cbk.invocation = 0;
-                               i_comp->admin_pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-                       }
-                       m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_comp, 
AVSV_CKPT_AVD_COMP_CONFIG);
-                       i_comp = i_comp->su_comp_next;
-               }
+               avd_su_complete_admin_op(i_su, SA_AIS_ERR_TIMEOUT);
+               avd_su_disable_comps(i_su, SA_AIS_ERR_TIMEOUT);
 
                /* Now analyze the service group for the new HA state
                 * assignments and send the SU SI assign messages
@@ -1394,21 +1377,8 @@ void avd_node_down_mw_susi_failover(AVD_
                 */
                i_su->sg_of_su->node_fail(cb, i_su);
 
-               /* Free all the SU SI assignments for all the SIs on the
-                * the SU if there are any.
-                */
-
-               while (i_su->list_of_susi != AVD_SU_SI_REL_NULL) {
-
-                       /* free all the CSI assignments  */
-                       avd_compcsi_delete(cb, i_su->list_of_susi, false);
-                       /* Unassign the SUSI */
-                       m_AVD_SU_SI_TRG_DEL(cb, i_su->list_of_susi);
-               }
-
-               i_su->saAmfSUNumCurrActiveSIs = 0;
-               i_su->saAmfSUNumCurrStandbySIs = 0;
-               m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_su, 
AVSV_CKPT_AVD_SU_CONFIG);
+               /* Free all the SU SI assignments*/ 
+               avd_sg_su_asgn_del_util(cb, i_su, true, false);
 
                i_su = i_su->avnd_list_su_next;
 
@@ -1441,7 +1411,6 @@ void avd_node_down_mw_susi_failover(AVD_
 void avd_node_down_appl_susi_failover(AVD_CL_CB *cb, AVD_AVND *avnd)
 {
        AVD_SU *i_su;
-       AVD_COMP *i_comp;
 
        TRACE_ENTER2("'%s'", avnd->name.value);
 
@@ -1454,29 +1423,8 @@ void avd_node_down_appl_susi_failover(AV
                avd_su_readiness_state_set(i_su, 
SA_AMF_READINESS_OUT_OF_SERVICE);
 
                /* Check if there was any admin operations going on this SU. */
-               if (i_su->pend_cbk.invocation != 0) {
-                       avd_saImmOiAdminOperationResult(cb->immOiHandle, 
i_su->pend_cbk.invocation,
-                                       SA_AIS_ERR_TIMEOUT);
-                       i_su->pend_cbk.invocation = 0;
-                       i_su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-               }
-
-               i_comp = i_su->list_of_comp;
-               while (i_comp != NULL) {
-                       i_comp->curr_num_csi_actv = 0;
-                       i_comp->curr_num_csi_stdby = 0;
-                       avd_comp_oper_state_set(i_comp, 
SA_AMF_OPERATIONAL_DISABLED);
-                       avd_comp_pres_state_set(i_comp, 
SA_AMF_PRESENCE_UNINSTANTIATED);
-                       i_comp->saAmfCompRestartCount = 0;
-                       if (i_comp->admin_pend_cbk.invocation != 0) {
-                               
avd_saImmOiAdminOperationResult(cb->immOiHandle, 
i_comp->admin_pend_cbk.invocation, 
-                                               SA_AIS_ERR_TIMEOUT);
-                               i_comp->admin_pend_cbk.invocation = 0;
-                               i_comp->admin_pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
-                       }
-                       m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_comp, 
AVSV_CKPT_AVD_COMP_CONFIG);
-                       i_comp = i_comp->su_comp_next;
-               }
+               avd_su_complete_admin_op(i_su, SA_AIS_ERR_TIMEOUT);
+               avd_su_disable_comps(i_su, SA_AIS_ERR_TIMEOUT);
 
                i_su = i_su->avnd_list_su_next;
        } /* while (i_su != AVD_SU_NULL) */
@@ -1494,21 +1442,8 @@ void avd_node_down_appl_susi_failover(AV
                         */
                        i_su->sg_of_su->node_fail(cb, i_su);
 
-                       /* Free all the SU SI assignments for all the SIs on the
-                        * the SU if there are any.
-                        */
-
-                       while (i_su->list_of_susi != AVD_SU_SI_REL_NULL) {
-
-                               /* free all the CSI assignments  */
-                               avd_compcsi_delete(cb, i_su->list_of_susi, 
false);
-                               /* Unassign the SUSI */
-                               m_AVD_SU_SI_TRG_DEL(cb, i_su->list_of_susi);
-                       }
-
-                       i_su->saAmfSUNumCurrActiveSIs = 0;
-                       i_su->saAmfSUNumCurrStandbySIs = 0;
-                       m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, i_su, 
AVSV_CKPT_AVD_SU_CONFIG);
+                       /* Free all the SU SI assignments*/ 
+                       avd_sg_su_asgn_del_util(cb, i_su, true, false);
 
                        /* Since a SU has gone out of service relook at the SG 
to
                         * re instatiate and terminate SUs if needed.
@@ -2042,4 +1977,158 @@ void avd_su_role_failover(AVD_SU *su, AV
        TRACE_LEAVE();
 }
 
+/**
+ * @brief      Performs sufailover or component failover       
+ *             At present sufailover is supported only for 2N and NoRed model.
+ *
+ * @param[in]   su
+ *
+ * @return     NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS 
+ **/
+static uint32_t su_recover_from_fault(AVD_SU *su)
+{
+       uint32_t rc = NCSCC_RC_SUCCESS;
 
+       if (((su->sg_of_su->sg_redundancy_model == SA_AMF_NO_REDUNDANCY_MODEL) 
||
+                       (su->sg_of_su->sg_redundancy_model == 
SA_AMF_2N_REDUNDANCY_MODEL)) &&
+                       (su->saAmfSUFailover) && (su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_DISABLED)) {
+               rc = sg_su_failover_func(su);
+       } else {
+               rc = su->sg_of_su->su_fault(avd_cb, su);
+       }
+       return rc;
+}
+
+/**
+ * @brief      Sends repair operation message to avnd to perform repiar of the 
faulted SU.
+ *             This function is used to perform repiar after sufailover 
recovery.
+ *             Autorepair will be performed only for 2N and NoRed model.
+ *
+ * @param[in]   su
+ *
+ **/
+static void su_try_repair(const AVD_SU *su)
+{
+       TRACE_ENTER2("Repair for SU:'%s'", su->name.value);
+
+       if (((su->sg_of_su->sg_redundancy_model == SA_AMF_NO_REDUNDANCY_MODEL) 
||
+                       (su->sg_of_su->sg_redundancy_model == 
SA_AMF_2N_REDUNDANCY_MODEL)) &&
+                       (su->sg_of_su->saAmfSGAutoRepair) && 
(su->saAmfSUFailover) &&
+                       (su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) &&
+                       (su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_INSTANTIATION_FAILED) && 
+                       (su->saAmfSUPresenceState != 
SA_AMF_PRESENCE_TERMINATION_FAILED)) {
+
+               saflog(LOG_NOTICE, amfSvcUsrName, "Ordering Auto repair of '%s' 
as sufailover repair action",
+                               su->sg_of_su->name.value);
+               avd_admin_op_msg_snd(&su->name, AVSV_SA_AMF_SU,
+                               
static_cast<SaAmfAdminOperationIdT>(SA_AMF_ADMIN_REPAIRED), su->su_on_node); 
+       } else {
+               saflog(LOG_NOTICE, amfSvcUsrName, "Autorepair not done for 
'%s'", su->sg_of_su->name.value);
+       }
+
+       TRACE_LEAVE();
+}
+
+/**
+ * @brief      This function is called when AMFD gets oper_state_evh for 
disabled SU and 
+ *             with recovery as saAmfSUFailover. SU failover will be performed 
honoring SI dependency
+ *             if configured.
+ * @param      su 
+ * 
+ * @return SaAisErrorT
+ */
+static uint32_t sg_su_failover_func(AVD_SU *su)
+{
+       uint32_t rc = NCSCC_RC_FAILURE;
+
+       TRACE_ENTER2("'%s', %u", su->name.value, su->sg_of_su->sg_fsm_state);
+
+       if (su->list_of_susi == AVD_SU_SI_REL_NULL) {
+               LOG_NO("'%s' has no assignments", su->name.value);
+               rc =  NCSCC_RC_SUCCESS;
+               goto done;
+       }
+
+       /* In case of other than 2N and NoRed model perform component failover. 
*/
+       if ((su->sg_of_su->sg_redundancy_model != SA_AMF_NO_REDUNDANCY_MODEL) 
&& 
+                       (su->sg_of_su->sg_redundancy_model != 
SA_AMF_2N_REDUNDANCY_MODEL)) {
+               rc = su->sg_of_su->su_fault(avd_cb, su);
+               goto done;
+       }
+
+       avd_su_oper_state_set(su, SA_AMF_OPERATIONAL_DISABLED);
+       avd_su_readiness_state_set(su, SA_AMF_READINESS_OUT_OF_SERVICE);
+       avd_su_complete_admin_op(su, SA_AIS_ERR_TIMEOUT);
+       avd_su_disable_comps(su, SA_AIS_ERR_TIMEOUT);
+
+       /*If the AvD is in AVD_APP_STATE then reassign all the SUSI assignments 
for this SU */
+       if (avd_cb->init_state == AVD_APP_STATE) {
+               /* Now analyze the service group for the new HA state
+                  assignments and send the SU SI assign messages
+                  accordingly.
+                */
+               su->sg_of_su->node_fail(avd_cb, su);
+
+               /* Free all the SU SI assignments*/ 
+               avd_sg_su_asgn_del_util(avd_cb, su, true, false);
+       }
+
+       rc =  NCSCC_RC_SUCCESS;
+
+done:
+       TRACE_LEAVE();
+       return rc;
+}
+
+/**
+ * @brief      This function completes admin operation on SU. 
+ *              It responds IMM with the result of admin operation on SU.  
+ * @param      ptr to su 
+ * @param      result
+ * 
+ */
+void avd_su_complete_admin_op(AVD_SU *su, SaAisErrorT result)
+{
+       if (su->pend_cbk.invocation != 0) {
+               avd_saImmOiAdminOperationResult(avd_cb->immOiHandle, 
su->pend_cbk.invocation, result);
+               su->pend_cbk.invocation = 0;
+               su->pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
+       }
+}
+
+
+/**
+ * @brief      This function completes admin operation on component. 
+ *              It responds IMM with the result of admin operation on 
component.  
+ * @param      ptr to comp 
+ * @param      result
+ * 
+ */
+void avd_comp_complete_admin_op(AVD_COMP *comp, SaAisErrorT result)
+{
+       if (comp->admin_pend_cbk.invocation != 0) {
+               avd_saImmOiAdminOperationResult(avd_cb->immOiHandle, 
comp->admin_pend_cbk.invocation, result);
+               comp->admin_pend_cbk.invocation = 0;
+               comp->admin_pend_cbk.admin_oper = 
static_cast<SaAmfAdminOperationIdT>(0);
+       }
+}
+/**
+ * @brief      Disable all components since SU is disabled and out of service. 
+ *              It takes care of response to IMM for any admin operation 
pending on components.  
+ * @param      ptr to su 
+ * @param      result
+ * 
+ */
+void avd_su_disable_comps(AVD_SU *su, SaAisErrorT result)
+{
+       AVD_COMP *comp;
+       for (comp = su->list_of_comp; comp; comp = comp->su_comp_next) {
+               comp->curr_num_csi_actv = 0;
+               comp->curr_num_csi_stdby = 0;
+               avd_comp_oper_state_set(comp, SA_AMF_OPERATIONAL_DISABLED);
+               avd_comp_pres_state_set(comp, SA_AMF_PRESENCE_UNINSTANTIATED);
+               comp->saAmfCompRestartCount = 0;
+               avd_comp_complete_admin_op(comp, result);
+               m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, comp, 
AVSV_CKPT_AVD_COMP_CONFIG);
+       }
+}
diff --git a/osaf/services/saf/avsv/avd/avd_su.cc 
b/osaf/services/saf/avsv/avd/avd_su.cc
--- a/osaf/services/saf/avsv/avd/avd_su.cc
+++ b/osaf/services/saf/avsv/avd/avd_su.cc
@@ -1117,6 +1117,7 @@ static void su_admin_op_cb(SaImmOiHandle
                if ((node->node_state == AVD_AVND_STATE_PRESENT) &&
                                ((node->saAmfNodeAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) && 
                                 (su->sg_of_su->saAmfSGAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION)) && 
+                                (su->saAmfSUOperState == 
SA_AMF_OPERATIONAL_ENABLED) && 
                                (su->sg_of_su->saAmfSGNumPrefInserviceSUs > 
sg_instantiated_su_count(su->sg_of_su))) {
                        /* When the SU will instantiate then prescence state 
change message will come
                           and so store the callback parameters to send 
response later on. */
diff --git a/osaf/services/saf/avsv/avd/include/avd_proc.h 
b/osaf/services/saf/avsv/avd/include/avd_proc.h
--- a/osaf/services/saf/avsv/avd/include/avd_proc.h
+++ b/osaf/services/saf/avsv/avd/include/avd_proc.h
@@ -160,5 +160,8 @@ extern void avd_node_mark_absent(AVD_AVN
 extern void avd_tmr_snd_hb_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 extern void avd_node_failover(AVD_AVND *node);
 extern AVD_SU *get_other_su_from_oper_list(AVD_SU *su);
+extern void avd_su_complete_admin_op(AVD_SU *su, SaAisErrorT result);
+extern void avd_comp_complete_admin_op(AVD_COMP *comp, SaAisErrorT result);
+extern void avd_su_disable_comps(AVD_SU *su, SaAisErrorT result);
 
 #endif

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to