btw this patch does not compile with gcc4.7, this change is required:

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
@@ -423,7 +423,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb

                                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) {
+                                       switch
(n2d_msg->msg_info.n2d_opr_state.rec_rcvr.raw) {
                                        case SA_AMF_COMPONENT_FAILOVER:
                                                if
(su->sg_of_su->su_fault(cb, su) == NCSCC_RC_FAILURE) {
                                                        LOG_ER("%s:%d
%s", __FUNCTION__, __LINE__, su->name.value);

On 4 July 2013 14:35, Hans Feldt <[email protected]> wrote:
> Please add new static functions at the top of a C file. That way no
> forward declarations are needed.
> Please remove the avd_ prefix, will probably remove it later anyway.
> Otherwise my comments are inconclusive which has to do with the
> overall approach.
> Thanks,
> Hans
>
> On 28 June 2013 08:21,  <[email protected]> wrote:
>>  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

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