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

Reply via email to