Ack, but I couldn't test it.

Thanks
-Nagu

> -----Original Message-----
> From: Minh Hon Chau [mailto:minh.c...@dektech.com.au]
> Sent: 02 December 2016 17:04
> To: hans.nordeb...@ericsson.com; Nagendra Kumar; Praveen Malviya;
> gary....@dektech.com.au; minh.c...@dektech.com.au
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: [PATCH 1 of 1] AMFD: Do not let non-active AMFD receives CLM
> track callback [#2141] V2
> 
>  osaf/services/saf/amf/amfd/clm.cc       |  35 ++++++++++++++++++++++-----
> -----
>  osaf/services/saf/amf/amfd/include/cb.h |   1 +
>  osaf/services/saf/amf/amfd/role.cc      |  10 ++++++--
>  3 files changed, 32 insertions(+), 14 deletions(-)
> 
> 
> V2 Incorporate comments from Praveen, Nagu: Send saClmResponse_4
> if clm cb is received in non-action amfd, retry to stop clm when switch
> over is done. This V2 does not make amfd exit at second retry, only
> logging error as it should succeed.
> 
> In controller failover/switchover, sometimes active AMFD fails to stop
> CLM track callback. Therefore, when this AMFD become standby, AMFD can
> continue receiving CLM track callback and trigger the operations which
> should only be executed in active AMFD.
> 
> diff --git a/osaf/services/saf/amf/amfd/clm.cc
> b/osaf/services/saf/amf/amfd/clm.cc
> --- a/osaf/services/saf/amf/amfd/clm.cc
> +++ b/osaf/services/saf/amf/amfd/clm.cc
> @@ -220,7 +220,11 @@ static void clm_track_cb(const SaClmClus
>               LOG_ER("ClmTrackCallback received in error");
>               goto done;
>       }
> -
> +     if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) {
> +             LOG_WA("Receive clm track cb with AMFD state(%d)",
> avd_cb->avail_state_avd);
> +             saClmResponse_4(avd_cb->clmHandle, invocation,
> SA_CLM_CALLBACK_RESPONSE_OK);
> +             goto done;
> +     }
>       /*
>       ** The CLM cluster can be larger than the AMF cluster thus it is not
> an
>       ** error if the corresponding AMF node cannot be found.
> @@ -395,6 +399,7 @@ SaAisErrorT avd_clm_init(AVD_CL_CB* cb)
> 
>       cb->clmHandle = 0;
>       cb->clm_sel_obj = 0;
> +     cb->is_clm_track_started = false;
>       TRACE_ENTER();
>       /*
>        * TODO: This CLM initialization thread can be re-factored
> @@ -454,6 +459,8 @@ SaAisErrorT avd_clm_track_start(void)
>               } else {
>                       LOG_ER("Failed to start cluster tracking %u", error);
>               }
> +     } else {
> +             avd_cb->is_clm_track_started = true;
>       }
>       TRACE_LEAVE();
>       return error;
> @@ -461,17 +468,23 @@ SaAisErrorT avd_clm_track_start(void)
> 
>  SaAisErrorT avd_clm_track_stop(void)
>  {
> -        SaAisErrorT error = SA_AIS_OK;
> +     SaAisErrorT error = SA_AIS_OK;
> +     TRACE_ENTER();
> +     error = saClmClusterTrackStop(avd_cb->clmHandle);
> +     if (error != SA_AIS_OK) {
> +             if (error == SA_AIS_ERR_TRY_AGAIN || error ==
> SA_AIS_ERR_TIMEOUT ||
> +                             error == SA_AIS_ERR_UNAVAILABLE) {
> +                     LOG_WA("Failed to stop cluster tracking %u", error);
> +             } else {
> +                     LOG_ER("Failed to stop cluster tracking %u", error);
> +             }
> +     } else {
> +             TRACE("Sucessfully stops cluster tracking");
> +             avd_cb->is_clm_track_started = false;
> +     }
> 
> -        TRACE_ENTER();
> -     error = saClmClusterTrackStop(avd_cb->clmHandle);
> -        if (SA_AIS_OK != error)
> -                LOG_ER("Failed to stop cluster tracking %u", error);
> -     else
> -             TRACE("Sucessfully stops cluster tracking");
> -
> -        TRACE_LEAVE();
> -        return error;
> +     TRACE_LEAVE();
> +     return error;
>  }
> 
>  void clm_node_terminate(AVD_AVND *node)
> diff --git a/osaf/services/saf/amf/amfd/include/cb.h
> b/osaf/services/saf/amf/amfd/include/cb.h
> --- a/osaf/services/saf/amf/amfd/include/cb.h
> +++ b/osaf/services/saf/amf/amfd/include/cb.h
> @@ -215,6 +215,7 @@ typedef struct cl_cb_tag {
>       /* Clm stuff */
>       std::atomic<SaClmHandleT> clmHandle;
>       std::atomic<SaSelectionObjectT> clm_sel_obj;
> +     bool is_clm_track_started;
> 
>       bool fully_initialized;
>       bool swap_switch; /* true - In middle of role switch. */
> diff --git a/osaf/services/saf/amf/amfd/role.cc
> b/osaf/services/saf/amf/amfd/role.cc
> --- a/osaf/services/saf/amf/amfd/role.cc
> +++ b/osaf/services/saf/amf/amfd/role.cc
> @@ -1055,9 +1055,7 @@ uint32_t amfd_switch_actv_qsd(AVD_CL_CB
>       /*  Mark AVD as Quiesced. */
>       cb->avail_state_avd = SA_AMF_HA_QUIESCED;
> 
> -     if (avd_clm_track_stop() != SA_AIS_OK) {
> -             LOG_ER("ClmTrack stop failed");
> -     }
> +     avd_clm_track_stop();
> 
>       /* Go ahead and set mds role as already the NCS SU has been
> switched */
>       if (NCSCC_RC_SUCCESS != (rc = avd_mds_set_vdest_role(cb,
> SA_AMF_HA_QUIESCED))) {
> @@ -1136,6 +1134,12 @@ uint32_t amfd_switch_qsd_stdby(AVD_CL_CB
>               avd_pg_node_csi_del_all(cb, avnd);
>       }
> 
> +     if (cb->is_clm_track_started == true) {
> +             if (avd_clm_track_stop() != SA_AIS_OK) {
> +                     LOG_ER("Failed to stop cluster tracking after switch
> over");
> +             }
> +     }
> +
>       LOG_NO("Controller switch over done");
>       saflog(LOG_NOTICE, amfSvcUsrName, "Controller switch over done
> at %x", cb->node_id_avd);
> 

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to