osaf/services/saf/amf/amfd/include/su.h | 9 + osaf/services/saf/amf/amfd/su.cc | 461 +++++++++++++++++-------------- 2 files changed, 257 insertions(+), 213 deletions(-)
complexity of su.cc dropped pretty good: $ pmccabe su.cc | sort -nr | head -2 73 78 154 865 337 su.cc(865): su_admin_op_cb 38 38 101 230 201 su.cc(230): is_config_valid $ pmccabe su.cc | sort -nr | head -2 38 38 101 230 201 su.cc(230): is_config_valid 35 40 56 1104 133 su.cc(1104): su_admin_op_cb diff --git a/osaf/services/saf/amf/amfd/include/su.h b/osaf/services/saf/amf/amfd/include/su.h --- a/osaf/services/saf/amf/amfd/include/su.h +++ b/osaf/services/saf/amf/amfd/include/su.h @@ -122,6 +122,15 @@ class AVD_SU { AVD_COMP *find_unassigned_comp_that_provides_cstype(const SaNameT *cstype); void disable_comps(SaAisErrorT result); void complete_admin_op(SaAisErrorT result); + void unlock(SaImmOiHandleT immoi_handle, SaInvocationT invocation); + void lock_instantiation(SaImmOiHandleT immoi_handle, + SaInvocationT invocation); + void unlock_instantiation(SaImmOiHandleT immoi_handle, + SaInvocationT invocation); + void repaired(SaImmOiHandleT immoi_handle, SaInvocationT invocation); + void shutdown(SaImmOiHandleT immoi_handle, SaInvocationT invocation); + void lock(SaImmOiHandleT immoi_handle, SaInvocationT invocation, + SaAmfAdminStateT adm_state); private: diff --git a/osaf/services/saf/amf/amfd/su.cc b/osaf/services/saf/amf/amfd/su.cc --- a/osaf/services/saf/amf/amfd/su.cc +++ b/osaf/services/saf/amf/amfd/su.cc @@ -853,6 +853,245 @@ void AVD_SU::set_admin_state(SaAmfAdminS old_state, saAmfSUAdminState); } +void AVD_SU::unlock(SaImmOiHandleT immoi_handle, SaInvocationT invocation) { + bool is_oper_successful = true; + + TRACE_ENTER2("'%s'", name.value); + set_admin_state(SA_AMF_ADMIN_UNLOCKED); + + if ((is_in_service() == true) || (sg_of_su->sg_ncs_spec == true)) { + /* Reason for checking for MW component is that node oper state and + * SU oper state are marked enabled after they gets assignments. + * So, we can't check compatibility with is_in_service() for them. + */ + set_readiness_state(SA_AMF_READINESS_IN_SERVICE); + if (sg_of_su->su_insvc(avd_cb, this) != NCSCC_RC_SUCCESS) + is_oper_successful = false; + + avd_sg_app_su_inst_func(avd_cb, sg_of_su); + } else + LOG_IN("SU '%s' is not in service", name.value); + + if (is_oper_successful == true) { + if (sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_REALIGN ) { + pend_cbk.admin_oper = SA_AMF_ADMIN_UNLOCK; + pend_cbk.invocation = invocation; + } else { + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + } + } else { + set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); + set_admin_state(SA_AMF_ADMIN_LOCKED); + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_FAILED_OPERATION, NULL, + "SG redundancy model specific handler failed"); + } + + TRACE_LEAVE(); +} + +void AVD_SU::lock(SaImmOiHandleT immoi_handle, SaInvocationT invocation, + SaAmfAdminStateT adm_state = SA_AMF_ADMIN_LOCKED) { + AVD_AVND *node = get_node_ptr(); + SaAmfReadinessStateT back_red_state; + SaAmfAdminStateT back_admin_state; + bool is_oper_successful = true; + + TRACE_ENTER2("'%s'", name.value); + + if (list_of_susi == NULL) { + set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); + set_admin_state(SA_AMF_ADMIN_LOCKED); + avd_sg_app_su_inst_func(avd_cb, sg_of_su); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + goto done; + } + + back_red_state = saAmfSuReadinessState; + back_admin_state = saAmfSUAdminState; + set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); + set_admin_state(adm_state); + + if (sg_of_su->su_admin_down(avd_cb, this, node) != NCSCC_RC_SUCCESS) + is_oper_successful = false; + + avd_sg_app_su_inst_func(avd_cb, sg_of_su); + + if (is_oper_successful == true) { + if ((sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_REALIGN) || + (sg_of_su->sg_fsm_state == AVD_SG_FSM_SU_OPER)) { + pend_cbk.admin_oper = (adm_state == SA_AMF_ADMIN_SHUTTING_DOWN) ? + SA_AMF_ADMIN_SHUTDOWN : SA_AMF_ADMIN_LOCK; + pend_cbk.invocation = invocation; + } else { + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + } + } else { + set_readiness_state(back_red_state); + set_admin_state(back_admin_state); + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_FAILED_OPERATION, NULL, + "SG redundancy model specific handler failed"); + } + +done: + TRACE_LEAVE(); +} + +void AVD_SU::shutdown(SaImmOiHandleT immoi_handle, SaInvocationT invocation) { + TRACE_ENTER2("'%s'", name.value); + lock(immoi_handle, invocation, SA_AMF_ADMIN_SHUTTING_DOWN); + TRACE_LEAVE(); +} + +void AVD_SU::lock_instantiation(SaImmOiHandleT immoi_handle, + SaInvocationT invocation) { + AVD_AVND *node = get_node_ptr(); + + TRACE_ENTER2("'%s'", name.value); + + /* For non-preinstantiable SU lock-inst is same as lock */ + if (saAmfSUPreInstantiable == false) { + set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + goto done; + } + + if (list_of_susi != NULL) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, + "SIs still assigned to this SU '%s'", name.value); + goto done; + } + + if ((saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATING) || + (saAmfSUPresenceState == SA_AMF_PRESENCE_TERMINATING) || + (saAmfSUPresenceState == SA_AMF_PRESENCE_RESTARTING)) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, + "'%s' presence state is '%u'", name.value, saAmfSUPresenceState); + goto done; + } + + if ((saAmfSUPresenceState == SA_AMF_PRESENCE_UNINSTANTIATED) || + (saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATION_FAILED) || + (saAmfSUPresenceState == SA_AMF_PRESENCE_TERMINATION_FAILED)) { + /* No need to terminate the SUs in Unins/Inst Failed/Term Failed state */ + set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + set_term_state(true); + goto done; + } + + if ( ( node->node_state == AVD_AVND_STATE_PRESENT ) || + ( node->node_state == AVD_AVND_STATE_NO_CONFIG ) || + ( node->node_state == AVD_AVND_STATE_NCS_INIT ) ) { + /* When the SU will terminate then presence state change message will come + and so store the callback parameters to send response later on. */ + if (avd_snd_presence_msg(avd_cb, this, true) == NCSCC_RC_SUCCESS) { + set_term_state(true); + set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); + pend_cbk.admin_oper = SA_AMF_ADMIN_LOCK_INSTANTIATION; + pend_cbk.invocation = invocation; + goto done; + } + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, + "Internal error, could not send message to avnd"); + goto done; + } else { + set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + set_term_state(true); + } +done: + TRACE_LEAVE(); +} + +void AVD_SU::unlock_instantiation(SaImmOiHandleT immoi_handle, + SaInvocationT invocation) { + AVD_AVND *node = get_node_ptr(); + + TRACE_ENTER2("'%s'", name.value); + + if (list_of_comp == NULL) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, + "There is no component configured for SU '%s'.", name.value); + goto done; + } + + /* For non-preinstantiable SU unlock-inst will not lead to its inst until unlock. */ + if (saAmfSUPreInstantiable == false) { + /* Adjusting saAmfSGMaxActiveSIsperSU and saAmfSGMaxStandbySIsperSU + is required when SG and SUs/Comps are created in different CCBs. */ + avd_sg_adjust_config(sg_of_su); + set_admin_state(SA_AMF_ADMIN_LOCKED); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + goto done; + } + + if (saAmfSUPresenceState != SA_AMF_PRESENCE_UNINSTANTIATED) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, + "Can't instantiate '%s', whose presence state is '%u'", name.value, + saAmfSUPresenceState); + goto done; + } + + if ((node->node_state == AVD_AVND_STATE_PRESENT) && + ((node->saAmfNodeAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) && + (sg_of_su->saAmfSGAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION)) && + (saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED) && + (sg_of_su->saAmfSGNumPrefInserviceSUs > sg_instantiated_su_count(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. */ + if (avd_snd_presence_msg(avd_cb, this, false) == NCSCC_RC_SUCCESS) { + set_term_state(false); + set_admin_state(SA_AMF_ADMIN_LOCKED); + pend_cbk.admin_oper = SA_AMF_ADMIN_UNLOCK_INSTANTIATION; + pend_cbk.invocation = invocation; + goto done; + } + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, + "Internal error, could not send message to avnd"); + } else { + set_admin_state(SA_AMF_ADMIN_LOCKED); + avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); + set_term_state(false); + } + +done: + TRACE_LEAVE(); +} + +void AVD_SU::repaired(SaImmOiHandleT immoi_handle, + SaInvocationT invocation) { + TRACE_ENTER2("'%s'", name.value); + + if (saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED) { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_NO_OP, NULL, + "Admin repair request for '%s', op state already enabled", name.value); + goto done; + } + + if ((saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) && + (su_on_node->saAmfNodeOperState == SA_AMF_OPERATIONAL_DISABLED)) { + /* This means that node on which this su is hosted, is absent. */ + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, + "Admin repair request for '%s', hosting node'%s' is absent", + name.value, su_on_node->name.value); + goto done; + } + + /* forward the admin op req to the node director */ + if (avd_admin_op_msg_snd(&name, AVSV_SA_AMF_SU, SA_AMF_ADMIN_REPAIRED, + su_on_node) == NCSCC_RC_SUCCESS) { + pend_cbk.admin_oper = SA_AMF_ADMIN_REPAIRED; + pend_cbk.invocation = invocation; + } + else { + report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TIMEOUT, NULL, + "Admin op request send failed '%s'", name.value); + } + +done: + TRACE_LEAVE(); +} + /** * Handle admin operations on SaAmfSU objects. * @@ -869,10 +1108,6 @@ static void su_admin_op_cb(SaImmOiHandle AVD_CL_CB *cb = (AVD_CL_CB*) avd_cb; AVD_SU *su, *su_ptr; AVD_AVND *node; - bool is_oper_successful = true; - SaAmfAdminStateT adm_state = static_cast<SaAmfAdminStateT>(SA_AMF_ADMIN_LOCK); - SaAmfReadinessStateT back_red_state; - SaAmfAdminStateT back_admin_state; TRACE_ENTER2("%llu, '%s', %llu", invocation, su_name->value, op_id); @@ -894,8 +1129,8 @@ static void su_admin_op_cb(SaImmOiHandle goto done; } - if ((su->sg_of_su->sg_ncs_spec == true) - && (cb->node_id_avd == su->su_on_node->node_info.nodeId)) { + if ((su->sg_of_su->sg_ncs_spec == true) && + (cb->node_id_avd == su->su_on_node->node_info.nodeId)) { report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_NOT_SUPPORTED, NULL, "Admin operation on Active middleware SU is not allowed"); goto done; @@ -972,222 +1207,22 @@ static void su_admin_op_cb(SaImmOiHandle /* Validation has passed and admin operation should be done. Proceed with it... */ switch (op_id) { case SA_AMF_ADMIN_UNLOCK: - su->set_admin_state(SA_AMF_ADMIN_UNLOCKED); - if ((su->is_in_service() == true) || (su->sg_of_su->sg_ncs_spec == true)) { - /* Reason for adding "su->sg_of_su->sg_ncs_spec == true" is for Middleware component - * node oper state and SU oper state are marked enabled after they gets assignments. - * So, we cann't check compatibility with m_AVD_APP_SU_IS_INSVC for them. - */ - su->set_readiness_state(SA_AMF_READINESS_IN_SERVICE); - if (su->sg_of_su->su_insvc(cb, su) != NCSCC_RC_SUCCESS) - is_oper_successful = false; - - avd_sg_app_su_inst_func(cb, su->sg_of_su); - } else - LOG_IN("SU is not in service"); - - if ( is_oper_successful == true ) { - if ( su->sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_REALIGN ) { - /* Store the callback parameters to send operation result later on. */ - su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(op_id); - su->pend_cbk.invocation = invocation; - goto done; - } else { - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - goto done; - } - } else { - su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); - su->set_admin_state(SA_AMF_ADMIN_LOCKED); - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_FAILED_OPERATION, NULL, - "SG redundancy model specific handler failed"); - goto done; - } - + su->unlock(immoi_handle, invocation); break; - case SA_AMF_ADMIN_SHUTDOWN: - adm_state = SA_AMF_ADMIN_SHUTTING_DOWN; - /* fall-through */ - + su->shutdown(immoi_handle, invocation); + break; case SA_AMF_ADMIN_LOCK: - if (su->list_of_susi == NULL) { - su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); - su->set_admin_state(SA_AMF_ADMIN_LOCKED); - avd_sg_app_su_inst_func(cb, su->sg_of_su); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - goto done; - } - - back_red_state = su->saAmfSuReadinessState; - back_admin_state = su->saAmfSUAdminState; - su->set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); - su->set_admin_state(adm_state); - - if (su->sg_of_su->su_admin_down(cb, su, node) != NCSCC_RC_SUCCESS) - is_oper_successful = false; - - avd_sg_app_su_inst_func(avd_cb, su->sg_of_su); - - if ( is_oper_successful == true ) { - if ( (su->sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_REALIGN) || - (su->sg_of_su->sg_fsm_state == AVD_SG_FSM_SU_OPER) ) { - /* Store the callback parameters to send operation result later on. */ - su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(op_id); - su->pend_cbk.invocation = invocation; - } else { - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - } - } else { - su->set_readiness_state(back_red_state); - su->set_admin_state(back_admin_state); - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_FAILED_OPERATION, NULL, - "SG redundancy model specific handler failed"); - goto done; - } - + su->lock(immoi_handle, invocation); break; - case SA_AMF_ADMIN_LOCK_INSTANTIATION: - - /* For non-preinstantiable SU lock-inst is same as lock */ - if ( su->saAmfSUPreInstantiable == false ) { - su->set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - goto done; - } - - if ( su->list_of_susi != NULL ) { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, - "SIs still assigned to this SU"); - goto done; - } - - if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATING) || - (su->saAmfSUPresenceState == SA_AMF_PRESENCE_TERMINATING) || - (su->saAmfSUPresenceState == SA_AMF_PRESENCE_RESTARTING)) { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, - "'%s' presence state is '%u'", su_name->value, su->saAmfSUPresenceState); - goto done; - } - - if ((su->saAmfSUPresenceState == SA_AMF_PRESENCE_UNINSTANTIATED) || - (su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATION_FAILED) || - (su->saAmfSUPresenceState == SA_AMF_PRESENCE_TERMINATION_FAILED)) { - /* No need to terminate the SUs in Unins/Inst Failed/Term Failed state */ - su->set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - su->set_term_state(true); - LOG_NO("'%s' presence state is '%u'", su_name->value, su->saAmfSUPresenceState); - goto done; - } - - if ( ( node->node_state == AVD_AVND_STATE_PRESENT ) || - ( node->node_state == AVD_AVND_STATE_NO_CONFIG ) || - ( node->node_state == AVD_AVND_STATE_NCS_INIT ) ) { - /* When the SU will terminate then prescence state change message will come - and so store the callback parameters to send response later on. */ - if (avd_snd_presence_msg(cb, su, true) == NCSCC_RC_SUCCESS) { - su->set_term_state(true); - su->set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); - su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(op_id); - su->pend_cbk.invocation = invocation; - - goto done; - } - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, - "Internal error, could not send message to avnd"); - goto done; - } else { - su->set_admin_state(SA_AMF_ADMIN_LOCKED_INSTANTIATION); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - su->set_term_state(true); - } - + su->lock_instantiation(immoi_handle, invocation); break; - case SA_AMF_ADMIN_UNLOCK_INSTANTIATION: - - if (NULL == su->list_of_comp) { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, - "There is no component configured for SU '%s'.", su->name.value); - goto done; - } - - /* For non-preinstantiable SU unlock-inst will not lead to its inst until unlock. */ - if ( su->saAmfSUPreInstantiable == false ) { - /* Adjusting saAmfSGMaxActiveSIsperSU and saAmfSGMaxStandbySIsperSU - is required when SG and SUs/Comps are created in different CCBs. */ - avd_sg_adjust_config(su->sg_of_su); - su->set_admin_state(SA_AMF_ADMIN_LOCKED); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - goto done; - } - - if (su->saAmfSUPresenceState != SA_AMF_PRESENCE_UNINSTANTIATED) { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, - "Can't instantiate '%s', whose presense state is '%u'", su_name->value, - su->saAmfSUPresenceState); - goto done; - } - - /* Middleware sus are not enabled until node joins. During - starting of opensaf, if mw su is locked-in and unlock-in - command is issued, su should get instantiated. */ - if (((node->node_state == AVD_AVND_STATE_PRESENT) || - (node->node_state == AVD_AVND_STATE_NO_CONFIG) || - (node->node_state == AVD_AVND_STATE_NCS_INIT)) && - ((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->sg_ncs_spec == true)) && - (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. */ - if (avd_snd_presence_msg(cb, su, false) == NCSCC_RC_SUCCESS) { - su->set_term_state(false); - su->set_admin_state(SA_AMF_ADMIN_LOCKED); - - su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(op_id); - su->pend_cbk.invocation = invocation; - - goto done; - } - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TRY_AGAIN, NULL, - "Internal error, could not send message to avnd"); - } else { - su->set_admin_state(SA_AMF_ADMIN_LOCKED); - avd_saImmOiAdminOperationResult(immoi_handle, invocation, SA_AIS_OK); - su->set_term_state(false); - } - + su->unlock_instantiation(immoi_handle, invocation); break; case SA_AMF_ADMIN_REPAIRED: - if (su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED) { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_NO_OP, NULL, - "Admin repair request for '%s', op state already enabled", su_name->value); - goto done; - } - - if ((su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) && - (su->su_on_node->saAmfNodeOperState == SA_AMF_OPERATIONAL_DISABLED)) { - /* This means that node on which this su is hosted, is absent. */ - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_BAD_OPERATION, NULL, - "Admin repair request for '%s', hosting node'%s' is absent", - su_name->value, su->su_on_node->name.value); - goto done; - } - - /* forward the admin op req to the node director */ - if (avd_admin_op_msg_snd(su_name, AVSV_SA_AMF_SU, static_cast<SaAmfAdminOperationIdT>(op_id), - su->su_on_node) == NCSCC_RC_SUCCESS) { - su->pend_cbk.admin_oper = static_cast<SaAmfAdminOperationIdT>(op_id); - su->pend_cbk.invocation = invocation; - } - else { - report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_TIMEOUT, NULL, - "Admin op request send failed '%s'", su_name->value); - } + su->repaired(immoi_handle, invocation); break; default: report_admin_op_error(immoi_handle, invocation, SA_AIS_ERR_INVALID_PARAM, NULL, ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/NeoTech _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel