Ack with minor comment to add header in some new functions in all the series.
Thanks -Nagu > -----Original Message----- > From: Praveen Malviya > Sent: 10 September 2015 19:34 > To: hans.nordeb...@ericsson.com; Nagendra Kumar; > gary....@dektech.com.au > Cc: opensaf-devel@lists.sourceforge.net > Subject: [PATCH 2 of 3] amf: support RESTART admin op on non-restartable > component [#334] > > osaf/services/saf/amf/amfd/comp.cc | 57 ++++++++++++++++++------ > osaf/services/saf/amf/amfd/include/su.h | 3 + > osaf/services/saf/amf/amfd/ndproc.cc | 73 > +++++++++++++++++++++++++------- > osaf/services/saf/amf/amfd/sgproc.cc | 45 ++++++++++++++++++-- > osaf/services/saf/amf/amfd/su.cc | 30 +++++++++++++- > 5 files changed, 171 insertions(+), 37 deletions(-) > > > AMF currently support admin restart operation on a restartable > component(for which saAmfDisableRestart=false). > > Patch supports it on a non-restartable component. > Patch for #315 contains changes in amfnd and amfd which are common > for all the three tickets viz. #315, #334 and #1455. > > TODO: To take care of controller role change when operation in > progress. > > diff --git a/osaf/services/saf/amf/amfd/comp.cc > b/osaf/services/saf/amf/amfd/comp.cc > --- a/osaf/services/saf/amf/amfd/comp.cc > +++ b/osaf/services/saf/amf/amfd/comp.cc > @@ -783,13 +783,14 @@ static void comp_admin_op_cb(SaImmOiHand > switch (opId) { > /* Valid B.04 AMF comp admin operations */ > case SA_AMF_ADMIN_RESTART: > - if (comp->comp_info.comp_restart == true) { > - report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_NOT_SUPPORTED, NULL, > - "Component Restart disabled '%s'", > objectName->value); > - } > - else if (comp->admin_pend_cbk.invocation != 0) { > + if (comp->admin_pend_cbk.invocation != 0) { > report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_TRY_AGAIN, NULL, > "Component undergoing admin > operation '%s'", objectName->value); > + } else if ((comp->su->sg_of_su->sg_ncs_spec == true) && > + (comp->su->sg_of_su- > >sg_redundancy_model == SA_AMF_2N_REDUNDANCY_MODEL)) { > + report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_BAD_OPERATION, NULL, > + "Not allowed on comp of middleware > 2N SU : %s, > op_id: %llu", > + objectName->value, opId); > } > else if (comp->su->pend_cbk.invocation != 0) { > report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_TRY_AGAIN, NULL, > @@ -803,16 +804,42 @@ static void comp_admin_op_cb(SaImmOiHand > report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_BAD_OPERATION, NULL, > "Component not instantiated '%s'", > objectName->value); > } > - else { > - /* prepare the admin op req message and queue it */ > - if (avd_admin_op_msg_snd(&comp- > >comp_info.name, AVSV_SA_AMF_COMP, > - > static_cast<SaAmfAdminOperationIdT>(opId), comp->su- > >su_on_node) == NCSCC_RC_SUCCESS) { > - comp->admin_pend_cbk.admin_oper = > static_cast<SaAmfAdminOperationIdT>(opId); > - comp->admin_pend_cbk.invocation = > invocation; > - } > - else { > - report_admin_op_error(immOiHandle, > invocation, SA_AIS_ERR_TIMEOUT, NULL, > - "Admin op request send > failed '%s'", objectName->value); > + else if (comp->saAmfCompOperState == > SA_AMF_OPERATIONAL_DISABLED) { > + report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_BAD_OPERATION, NULL, > + "Component disabled, first repair su > or check node status'%s'", objectName->value); > + } else { > + comp->admin_pend_cbk.admin_oper = > static_cast<SaAmfAdminOperationIdT>(opId); > + comp->admin_pend_cbk.invocation = invocation; > + > + if ((comp->comp_info.comp_restart == true) && > + (is_comp_assigned_any_csi(comp) > == true)) { > + /* Atleast one non-restartable > (saAmfCompDisableRestart or > + saAmfCtDefDisableRestart is true) comp is > assigned. > + First gracefully switch-over its assignments > to comp in > + other SU. At present assignment of whole > SU will be gracefully > + reassigned. > + Thus PI applications modeled on NWay and > Nway Active model > + this is spec deviation. > + */ > + if (comp->su->saAmfSUPreInstantiable == > true) { > + TRACE("surestart flag in '%s' is set to > true",comp->su->name.value); > + comp->su->surestart = true; > + } > + comp->su- > >set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); > + comp->su->sg_of_su->su_fault(avd_cb, > comp->su); > + } else { > + /* For a non restartable comp, amfd has no > role in reassignment. > + AMFND will take care of reassignment.*/ > + > + /* prepare the admin op req message and > queue it */ > + if (avd_admin_op_msg_snd(&comp- > >comp_info.name, AVSV_SA_AMF_COMP, > + > static_cast<SaAmfAdminOperationIdT>(opId), > + comp->su- > >su_on_node) != NCSCC_RC_SUCCESS) { > + > report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_TIMEOUT, NULL, > + "Admin op request > send failed '%s'", objectName->value); > + comp->admin_pend_cbk.admin_oper > = static_cast<SaAmfAdminOperationIdT>(0); > + comp->admin_pend_cbk.invocation > = 0; > + } > } > } > break; > 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 > @@ -138,6 +138,9 @@ class AVD_SU { > bool any_susi_fsm_in_unasgn(); > bool any_susi_fsm_in_modify(); > SaAisErrorT check_su_stability(); > + bool su_any_comp_undergoing_restart_admin_op(); > + AVD_COMP *su_get_comp_undergoing_restart_admin_op(); > + > private: > void initialize(); > void send_attribute_update(AVSV_AMF_SU_ATTR_ID attrib_id); > diff --git a/osaf/services/saf/amf/amfd/ndproc.cc > b/osaf/services/saf/amf/amfd/ndproc.cc > --- a/osaf/services/saf/amf/amfd/ndproc.cc > +++ b/osaf/services/saf/amf/amfd/ndproc.cc > @@ -286,28 +286,69 @@ void avd_oper_req_evh(AVD_CL_CB *cb, AVD > */ > static void comp_admin_op_report_to_imm(AVD_COMP *comp, > SaAmfPresenceStateT pres) > { > - AVD_CL_CB *cb = (AVD_CL_CB *)avd_cb; > - TRACE_ENTER2("%u", pres); > - > - if (comp->admin_pend_cbk.admin_oper == > SA_AMF_ADMIN_RESTART) { > + TRACE_ENTER2("%s", avd_pres_state_name[pres]); > + SaAisErrorT rc = SA_AIS_OK; > + > + if (comp->admin_pend_cbk.admin_oper != > SA_AMF_ADMIN_RESTART) { > + TRACE_LEAVE2("(%llu)", comp- > >admin_pend_cbk.invocation); > + return; > + } > + if (comp->comp_info.comp_restart == false) { > if ((comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_INSTANTIATED) && > - (pres != SA_AMF_PRESENCE_RESTARTING)) { > - report_admin_op_error(cb->immOiHandle, comp- > >admin_pend_cbk.invocation, > - SA_AIS_ERR_BAD_OPERATION, > &comp->admin_pend_cbk, > - "Couldn't restart Comp '%s'", comp- > >comp_info.name.value); > - } > + (pres != SA_AMF_PRESENCE_RESTARTING)) > + rc = SA_AIS_ERR_BAD_OPERATION; > else if (comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_RESTARTING) { > if (pres == SA_AMF_PRESENCE_INSTANTIATED) > - avd_saImmOiAdminOperationResult(cb- > >immOiHandle,comp->admin_pend_cbk.invocation, SA_AIS_OK); > + rc = SA_AIS_OK; > else > - report_admin_op_error(cb->immOiHandle, > comp->admin_pend_cbk.invocation, > - > SA_AIS_ERR_REPAIR_PENDING, &comp->admin_pend_cbk, > - "Couldn't restart Comp '%s'", > comp->comp_info.name.value); > - > - comp->admin_pend_cbk.admin_oper = > static_cast<SaAmfAdminOperationIdT>(0); > - comp->admin_pend_cbk.invocation = 0; > + rc = SA_AIS_ERR_REPAIR_PENDING; > + } else if (pres == SA_AMF_PRESENCE_RESTARTING) { > + TRACE("Valid state transition is taking place, wait for > final transition."); > + goto done; > + } > + } else { > + if ((comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_INSTANTIATED) && > + (pres != SA_AMF_PRESENCE_TERMINATING)) > + rc = SA_AIS_ERR_BAD_OPERATION; > + else if ((comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_TERMINATING) && > + (pres != > SA_AMF_PRESENCE_UNINSTANTIATED)) > + rc = SA_AIS_ERR_BAD_OPERATION; > + else if ((comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED) && > + (pres != > SA_AMF_PRESENCE_INSTANTIATING)) > + rc = SA_AIS_ERR_BAD_OPERATION; > + else if (comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_INSTANTIATING) { > + if (pres == SA_AMF_PRESENCE_INSTANTIATED) > + rc = SA_AIS_OK; > + else > + rc = SA_AIS_ERR_REPAIR_PENDING; > + } else if ((pres == SA_AMF_PRESENCE_TERMINATING) || > + (pres == > SA_AMF_PRESENCE_UNINSTANTIATED) || > + (pres == > SA_AMF_PRESENCE_INSTANTIATING)) { > + if ((comp->su->saAmfSUPreInstantiable == false) && > + (pres == > SA_AMF_PRESENCE_UNINSTANTIATED)) { > + /* > + All assignment are deleted. For a non- > restartable comp in NPI > + SU, there will not be instantiation as a part > of comp restart > + admin operation. > + */ > + rc = SA_AIS_OK; > + } else { > + TRACE("Valid state transition is taking place, > wait for final transition."); > + goto done; > + } > } > } > + > + if (rc == SA_AIS_OK) { > + avd_saImmOiAdminOperationResult(avd_cb- > >immOiHandle,comp->admin_pend_cbk.invocation, rc); > + } else { > + report_admin_op_error(avd_cb->immOiHandle, comp- > >admin_pend_cbk.invocation, > + rc, &comp->admin_pend_cbk, "Couldn't > restart Comp '%s'", > + comp->comp_info.name.value); > + } > + comp->admin_pend_cbk.admin_oper = > static_cast<SaAmfAdminOperationIdT>(0); > + comp->admin_pend_cbk.invocation = 0; > +done: > TRACE_LEAVE2("(%llu)", comp->admin_pend_cbk.invocation); > } > > diff --git a/osaf/services/saf/amf/amfd/sgproc.cc > b/osaf/services/saf/amf/amfd/sgproc.cc > --- a/osaf/services/saf/amf/amfd/sgproc.cc > +++ b/osaf/services/saf/amf/amfd/sgproc.cc > @@ -622,7 +622,6 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb > AVD_DND_MSG *n2d_msg = evt->info.avnd_msg; > AVD_AVND *node; > AVD_SU *su; > - SaAmfReadinessStateT old_state; > bool node_reboot_req = true; > > TRACE_ENTER2("id:%u, node:%x, '%s' state:%u", n2d_msg- > >msg_info.n2d_opr_state.msg_id, > @@ -856,8 +855,6 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb > } > } > } else { /* if(su->sg_of_su->sg_ncs_spec == true) */ > - old_state = su->saAmfSuReadinessState; > - > /* If oper state of Uninstantiated SU got ENABLED so > try to instantiate it > after evaluating SG. */ > if (su->saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED) { > @@ -867,7 +864,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb > > if (su->is_in_service() == true) { > su- > >set_readiness_state(SA_AMF_READINESS_IN_SERVICE); > - if ((cb->init_state == AVD_APP_STATE) && > (old_state == SA_AMF_READINESS_OUT_OF_SERVICE)) { > + if (cb->init_state == AVD_APP_STATE) { > /* An application SU has become in > service call SG FSM */ > if (su->sg_of_su->su_insvc(cb, su) == > NCSCC_RC_FAILURE) { > /* Bad situation. Free the > message and return since > @@ -898,6 +895,42 @@ static void susi_assign_msg_dump(const c > } > > > +void process_su_si_response_for_comp(AVD_SU *su) > +{ > + TRACE_ENTER(); > + if (su->list_of_susi != NULL) { > + TRACE_LEAVE(); > + return; > + } > + AVD_COMP *comp = su- > >su_get_comp_undergoing_restart_admin_op(); > + AVD_COMP_TYPE *comptype = comptype_db- > >find(Amf::to_string(&comp->saAmfCompType)); > + osafassert(comptype); > + if ((comp->su->saAmfSUPreInstantiable == true) && > + (comptype->saAmfCtCompCategory != > SA_AMF_COMP_SA_AWARE) && > + (comp->saAmfCompPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED)) { > + /* > + All assignment are deleted. For a non-restartable > NPI comp in PI SU, > + there will be instantiation only when assignments > are given. > + */ > + comp_complete_admin_op(comp, SA_AIS_OK); > + TRACE("surestart flag is set falsefor '%s'",comp->su- > >name.value); > + comp->su->surestart = false; > + comp->su- > >set_readiness_state(SA_AMF_READINESS_IN_SERVICE); > + comp->su->sg_of_su->su_insvc(avd_cb, su); > + TRACE_LEAVE(); > + return; > + } > + uint32_t rc = avd_admin_op_msg_snd(&comp->comp_info.name, > AVSV_SA_AMF_COMP, > + SA_AMF_ADMIN_RESTART, comp->su- > >su_on_node); > + if (rc != NCSCC_RC_SUCCESS) { > + report_admin_op_error(avd_cb->immOiHandle, comp- > >admin_pend_cbk.invocation, > + SA_AIS_ERR_TIMEOUT, NULL, > + "Admin op request send failed '%s'", comp- > >comp_info.name.value); > + comp->admin_pend_cbk.admin_oper = > static_cast<SaAmfAdminOperationIdT>(0); > + comp->admin_pend_cbk.invocation = 0; > + } > + TRACE_LEAVE(); > +} > > /************************************************************* > **************** > * Function: avd_su_si_assign_func > * > @@ -914,7 +947,7 @@ static void susi_assign_msg_dump(const c > * NOTES: None. > * > * > - > ************************************************************** > ************/ > + > ************************************************************** > ***********/ > > void avd_su_si_assign_evh(AVD_CL_CB *cb, AVD_EVT *evt) > { > @@ -1385,6 +1418,8 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb, > su->su_on_node->name.value,su- > >su_on_node->su_cnt_admin_oper); > } > process_su_si_response_for_ng(su, SA_AIS_OK); > + } else if (su->su_any_comp_undergoing_restart_admin_op() > == true) { > + process_su_si_response_for_comp(su); > } else { > if (n2d_msg->msg_info.n2d_su_si_assign.error == > NCSCC_RC_SUCCESS) { > if ((su->sg_of_su->sg_redundancy_model == > SA_AMF_N_WAY_REDUNDANCY_MODEL) && > 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 > @@ -767,10 +767,20 @@ void AVD_SU::set_pres_state(SaAmfPresenc > avd_saImmOiRtObjectUpdate(&name, "saAmfSUPresenceState", > SA_IMM_ATTR_SAUINT32T, &saAmfSUPresenceState); > m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(avd_cb, this, > AVSV_CKPT_SU_PRES_STATE); > - if ((saAmfSUPresenceState == > SA_AMF_PRESENCE_UNINSTANTIATED) && (surestart == true)) { > + if ((saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED) > && (surestart == true)) { > TRACE("setting surestart flag to false"); > surestart = false; > } > + //Section 3.2.1.4 Readiness State: presence state affects readiness > state of a PI SU. > + if (saAmfSUPreInstantiable == true) { > + if (((saAmfSUPresenceState == > SA_AMF_PRESENCE_INSTANTIATED) || > + (saAmfSUPresenceState == > SA_AMF_PRESENCE_RESTARTING)) && > + (is_in_service() == true)) > + > set_readiness_state(SA_AMF_READINESS_IN_SERVICE); > + else { > + > set_readiness_state(SA_AMF_READINESS_OUT_OF_SERVICE); > + } > + } > TRACE_LEAVE(); > } > > @@ -2174,3 +2184,21 @@ SaAisErrorT AVD_SU::check_su_stability() > done: > return rc; > } > + > +bool AVD_SU::su_any_comp_undergoing_restart_admin_op() > +{ > + for (AVD_COMP *comp = list_of_comp; comp; comp = comp- > >su_comp_next) { > + if (comp->admin_pend_cbk.admin_oper == > SA_AMF_ADMIN_RESTART) > + return true; > + } > + return false; > +} > + > +AVD_COMP *AVD_SU::su_get_comp_undergoing_restart_admin_op() > +{ > + for (AVD_COMP *comp = list_of_comp; comp; comp = comp- > >su_comp_next) { > + if (comp->admin_pend_cbk.admin_oper == > SA_AMF_ADMIN_RESTART) > + return comp; > + } > + return NULL; > +} ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel