Hi all,
Has anyone had chance to review this patch?
Thanks,
Minh
On 14/11/16 15:27, Minh Hon Chau wrote:
> osaf/services/saf/amf/amfd/clm.cc | 37
> +++++++++++++++++++++++---------
> osaf/services/saf/amf/amfd/include/cb.h | 1 +
> osaf/services/saf/amf/amfd/role.cc | 16 +++++++-------
> 3 files changed, 35 insertions(+), 19 deletions(-)
>
>
> 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
> @@ -219,7 +219,13 @@ 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) {
> + if (avd_cb->is_clm_track_started == true) {
> + LOG_NO("Retry to stop clm track with AMFD state(%d)",
> avd_cb->avail_state_avd);
> + avd_clm_track_stop();
> + }
> + 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.
> @@ -394,6 +400,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
> @@ -453,6 +460,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;
> @@ -460,17 +469,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
> @@ -210,6 +210,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
> @@ -1050,9 +1050,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))) {
> @@ -1260,11 +1258,13 @@ uint32_t amfd_switch_stdby_actv(AVD_CL_C
> if (NCSCC_RC_SUCCESS != avd_rde_set_role(SA_AMF_HA_ACTIVE)) {
> LOG_ER("rde role change failed from stdy -> Active");
> }
> -
> - if(avd_clm_track_start() != SA_AIS_OK) {
> - LOG_ER("Switch Standby --> Active, clm track start failed");
> - avd_d2d_chg_role_rsp(cb, NCSCC_RC_FAILURE, SA_AMF_HA_ACTIVE);
> - return NCSCC_RC_FAILURE;
> + // reuse clm track start
> + if (avd_cb->is_clm_track_started == false) {
> + if(avd_clm_track_start() != SA_AIS_OK) {
> + LOG_ER("Switch Standby --> Active, clm track start
> failed");
> + avd_d2d_chg_role_rsp(cb, NCSCC_RC_FAILURE,
> SA_AMF_HA_ACTIVE);
> + return NCSCC_RC_FAILURE;
> + }
> }
>
> /* Send the message to other avd for role change rsp as success */
>
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel