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 */
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel