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