osaf/libs/agents/saf/ntfa/ntfa.h | 2 +
osaf/libs/agents/saf/ntfa/ntfa_api.c | 226
++++++++++++++++++++++++++++++++-
osaf/libs/agents/saf/ntfa/ntfa_mds.c | 52 +++++++
osaf/libs/agents/saf/ntfa/ntfa_util.c | 3 +
4 files changed, 272 insertions(+), 11 deletions(-)
V2 changes:
-Rebased over #1180 (Cloud resilience patch).
-During headless state, OpenSAF may get stopped on payload with NTF
app running.
Since OpenSAF is not running on the payload, any A.01.02 NTF client
should not be served on
this node and this client should not be recovered. After first
controller comes up, A.01.02
client will not be recovered and application will get
SA_AIS_ERR_UNAVAILABLE upon which an
app can call saNtfFinalize() for freeing the resources.
Changes include:
-maintain SAF version.
-minor version is updated from 01 to 02.
-ntfa will get NTFSV_CLM_NODE_STATUS_CALLBACK from NTFS for membership
status of node.
-check is included in all apis, excluding saNTfFinalize(), to return
SA_AIS_ERR_UNAVAILABLE
if node loses CLM membership.
diff --git a/osaf/libs/agents/saf/ntfa/ntfa.h
b/osaf/libs/agents/saf/ntfa/ntfa.h
--- a/osaf/libs/agents/saf/ntfa/ntfa.h
+++ b/osaf/libs/agents/saf/ntfa/ntfa.h
@@ -120,6 +120,7 @@ typedef struct ntfa_client_hdl_rec {
SYSF_MBX mbx; /* priority q mbx b/w MDS & Library */
struct ntfa_client_hdl_rec *next; /* next pointer for the
list in ntfa_cb_t */
bool valid; /* handle is valid if it's known by NTF
server, used for headless hydra */
+ bool is_stale_client; /* Status of client based on the CLM
status of node.*/
SaVersionT version; /* the API version is being used by client,
used for recover after headless */
} ntfa_client_hdl_rec_t;
@@ -148,6 +149,7 @@ typedef struct {
SaUint32T ntf_var_data_limit; /* max allowed variableDataSize */
/* NTF Server state */
ntfa_ntfsv_state_t ntfa_ntfsv_state;
+ SaClmClusterChangesT clm_node_state; /*Reflects CLM status of
this node(for future use).*/
} ntfa_cb_t;
/* ntfa_saf_api.c */
diff --git a/osaf/libs/agents/saf/ntfa/ntfa_api.c
b/osaf/libs/agents/saf/ntfa/ntfa_api.c
--- a/osaf/libs/agents/saf/ntfa/ntfa_api.c
+++ b/osaf/libs/agents/saf/ntfa/ntfa_api.c
@@ -966,7 +966,8 @@ SaAisErrorT reinitializeClient(ntfa_clie
}
if ((rc = o_msg->info.api_resp_info.rc) != SA_AIS_OK) {
TRACE("info.api_resp_info.rc:%u",
o_msg->info.api_resp_info.rc);
- rc = SA_AIS_ERR_BAD_HANDLE;
+ if (rc != SA_AIS_ERR_UNAVAILABLE)
+ rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
@@ -1033,7 +1034,8 @@ SaAisErrorT recoverReader(ntfa_client_hd
osafassert(o_msg != NULL);
if ((rc = o_msg->info.api_resp_info.rc) != SA_AIS_OK) {
TRACE("o_msg->info.api_resp_info.rc:%u",
o_msg->info.api_resp_info.rc);
- rc = SA_AIS_ERR_BAD_HANDLE;
+ if (rc != SA_AIS_ERR_UNAVAILABLE)
+ rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
@@ -1108,7 +1110,8 @@ SaAisErrorT recoverSubscriber(ntfa_clien
if ((rc = o_msg->info.api_resp_info.rc) != SA_AIS_OK) {
TRACE("o_msg->info.api_resp_info.rc:%u",
o_msg->info.api_resp_info.rc);
- rc = SA_AIS_ERR_BAD_HANDLE;
+ if (rc != SA_AIS_ERR_UNAVAILABLE)
+ rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
@@ -1229,7 +1232,8 @@ SaAisErrorT saNtfInitialize(SaNtfHandleT
if ((version->releaseCode == NTF_RELEASE_CODE) &&
(version->majorVersion <= NTF_MAJOR_VERSION) &&
(0 < version->majorVersion)) {
version->majorVersion = NTF_MAJOR_VERSION;
- version->minorVersion = NTF_MINOR_VERSION;
+ if (version->minorVersion != NTF_MINOR_VERSION_0)
+ version->minorVersion = NTF_MINOR_VERSION;
} else {
TRACE("version FAILED, required: %c.%u.%u, supported:
%c.%u.%u\n",
version->releaseCode, version->majorVersion,
version->minorVersion,
@@ -1276,6 +1280,10 @@ SaAisErrorT saNtfInitialize(SaNtfHandleT
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE("NTFS return FAILED");
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto err;
}
@@ -1357,7 +1365,13 @@ SaAisErrorT saNtfSelectionObjectGet(SaNt
rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
-
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ ncshm_give_hdl(ntfHandle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done;
+ }
/* Obtain the selection object from the IPC queue */
sel_obj = m_NCS_IPC_GET_SEL_OBJ(&hdl_rec->mbx);
@@ -1434,8 +1448,22 @@ SaAisErrorT saNtfDispatch(SaNtfHandleT n
ntfa_shutdown(false);
goto done;
}
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ ncshm_give_hdl(ntfHandle);
+ goto done;
+ }
}
}
+
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ ncshm_give_hdl(ntfHandle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done;
+ }
+
if ((rc = ntfa_hdl_cbk_dispatch(&ntfa_cb, hdl_rec,
dispatchFlags)) != SA_AIS_OK)
TRACE("NTFA_DISPATCH_FAILURE");
@@ -1601,6 +1629,14 @@ SaAisErrorT saNtfAlarmNotificationAlloca
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
+
/** Allocate an ntfa_LOG_STREAM_HDL_REC structure and insert this
* into the list of channel hdl record.
**/
@@ -1683,6 +1719,13 @@ SaAisErrorT saNtfNotificationFree(SaNtfN
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ ncshm_give_hdl(client_handle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
/* free the resources allocated by
saNtf<ntfType>NotificationAllocate */
ntfa_notification_destructor(notification_hdl_rec);
@@ -1753,6 +1796,14 @@ SaAisErrorT saNtfNotificationSend(SaNtfN
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ ncshm_give_hdl(client_handle);
+ goto done_give_hdl;
+ }
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
/* Check NTF server availability */
@@ -1862,6 +1913,10 @@ SaAisErrorT saNtfNotificationSend(SaNtfN
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE("Bad return status!!! rc = %d", rc);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto done_give_hdls;
}
/* Return the notificationId to client from right notification */
@@ -2037,7 +2092,12 @@ SaAisErrorT saNtfNotificationSubscribe(c
goto done;
}
}
-
+ /*Check CLM membership of node.*/
+ if (client_hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done;
+ }
tmpHandle = ntfHandleGet(subscriptionId);
if (tmpHandle != 0) {
rc = SA_AIS_ERR_EXIST;
@@ -2079,6 +2139,10 @@ SaAisErrorT saNtfNotificationSubscribe(c
if (rc != SA_AIS_OK) {
subscriberListItemRemove(subscriptionId);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
}
if (o_msg)
ntfa_msg_destroy(o_msg);
@@ -2097,13 +2161,12 @@ SaAisErrorT saNtfNotificationSubscribe(c
if (notificationFilterHandles->alarmFilterHandle)
ncshm_give_hdl(notificationFilterHandles->alarmFilterHandle);
}
- if (recovery_failed && rc == SA_AIS_ERR_BAD_HANDLE) {
+ if (recovery_failed && (rc == SA_AIS_ERR_BAD_HANDLE)) {
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
ntfa_hdl_rec_force_del(&ntfa_cb.client_list, client_hdl_rec);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
ntfa_shutdown(false);
}
-
TRACE_LEAVE();
return rc;
}
@@ -2155,7 +2218,13 @@ saNtfObjectCreateDeleteNotificationAlloc
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
-
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
notification_hdl_rec = ntfa_notification_hdl_rec_add(&hdl_rec,
variableDataSize, &rc);
if (notification_hdl_rec == NULL) {
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -2229,7 +2298,13 @@ saNtfAttributeChangeNotificationAllocate
}
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
-
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
notification_hdl_rec = ntfa_notification_hdl_rec_add(&hdl_rec,
variableDataSize, &rc);
if (notification_hdl_rec == NULL) {
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -2302,6 +2377,13 @@ saNtfStateChangeNotificationAllocate(SaN
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
notification_hdl_rec = ntfa_notification_hdl_rec_add(&hdl_rec,
variableDataSize, &rc);
if (notification_hdl_rec == NULL) {
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -2372,6 +2454,13 @@ SaAisErrorT saNtfSecurityAlarmNotificati
}
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
notification_hdl_rec = ntfa_notification_hdl_rec_add(&hdl_rec,
variableDataSize, &rc);
if (notification_hdl_rec == NULL) {
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -2444,6 +2533,14 @@ SaAisErrorT saNtfPtrValAllocate(SaNtfNot
}
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ ncshm_give_hdl(client_handle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
rc = ntfsv_ptr_val_alloc(¬ification_hdl_rec->variable_data,
value, dataSize, dataPtr);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
ncshm_give_hdl(client_handle);
@@ -2484,6 +2581,14 @@ SaAisErrorT saNtfArrayValAllocate(SaNtfN
goto done_give_hdl;
}
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ ncshm_give_hdl(client_handle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
rc = ntfsv_array_val_alloc(¬ification_hdl_rec->variable_data,
value, numElements, elementSize, arrayPtr);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
ncshm_give_hdl(client_handle);
@@ -2569,6 +2674,14 @@ SaAisErrorT saNtfPtrValGet(SaNtfNotifica
}
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ ncshm_give_hdl(client_handle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
rc = ntfsv_ptr_val_get(¬ification_hdl_rec->variable_data,
value, dataPtr, dataSize);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
ncshm_give_hdl(client_handle);
@@ -2616,6 +2729,14 @@ SaAisErrorT saNtfArrayValGet(SaNtfNotifi
}
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ ncshm_give_hdl(client_handle);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
rc = ntfsv_array_val_get(¬ification_hdl_rec->variable_data,
value, arrayPtr, numElements, elementSize);
ncshm_give_hdl(client_handle);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -2656,6 +2777,13 @@ SaAisErrorT saNtfObjectCreateDeleteNotif
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
filter_hdl_rec = ntfa_filter_hdl_rec_add(&client_rec);
if (filter_hdl_rec == NULL) {
@@ -2736,6 +2864,13 @@ SaAisErrorT saNtfAttributeChangeNotifica
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
filter_hdl_rec = ntfa_filter_hdl_rec_add(&client_rec);
if (filter_hdl_rec == NULL) {
@@ -2818,6 +2953,13 @@ SaAisErrorT saNtfStateChangeNotification
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
filter_hdl_rec = ntfa_filter_hdl_rec_add(&client_rec);
if (filter_hdl_rec == NULL) {
@@ -2899,6 +3041,13 @@ SaAisErrorT saNtfAlarmNotificationFilter
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
filter_hdl_rec = ntfa_filter_hdl_rec_add(&client_rec);
if (filter_hdl_rec == NULL) {
@@ -2983,6 +3132,13 @@ SaAisErrorT saNtfSecurityAlarmNotificati
/** Lock ntfa_CB **/
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
filter_hdl_rec = ntfa_filter_hdl_rec_add(&client_rec);
if (filter_hdl_rec == NULL) {
@@ -3065,6 +3221,14 @@ SaAisErrorT saNtfNotificationFilterFree(
goto done_give_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ ncshm_give_hdl(client_handle);
+ goto done_give_hdl;
+ }
/* free the resources allocated by saNtf<ntfType>FilterAllocate */
ntfa_filter_destructor(filter_hdl_rec);
@@ -3128,6 +3292,12 @@ SaAisErrorT saNtfNotificationUnsubscribe
rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
+ /*Check CLM membership of node.*/
+ if (client_hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdl;
+ }
if (client_hdl_rec->valid) {
/**
@@ -3153,6 +3323,10 @@ SaAisErrorT saNtfNotificationUnsubscribe
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE_1("Bad return status! rc = %d", rc);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto done_give_hdl;
}
}
@@ -3256,6 +3430,12 @@ SaAisErrorT saNtfNotificationReadInitial
TRACE("getFilters failed");
goto done_give_client_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_client_hdl;
+ }
/* Check NTF server availability */
if ((rc = checkNtfServerState()) != SA_AIS_OK)
@@ -3292,6 +3472,10 @@ SaAisErrorT saNtfNotificationReadInitial
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE("Bad return status!!! rc = %d", rc);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto done_give_client_hdl;
}
@@ -3341,7 +3525,7 @@ done_give_client_hdl:
}
ncshm_give_hdl(notificationFilterHandles->alarmFilterHandle);
- if (recovery_failed && rc == SA_AIS_ERR_BAD_HANDLE) {
+ if (recovery_failed && (rc == SA_AIS_ERR_BAD_HANDLE)) {
osafassert(pthread_mutex_lock(&ntfa_cb.cb_lock) == 0);
ntfa_hdl_rec_force_del(&ntfa_cb.client_list, client_hdl_rec);
osafassert(pthread_mutex_unlock(&ntfa_cb.cb_lock) == 0);
@@ -3387,6 +3571,12 @@ SaAisErrorT saNtfNotificationReadFinaliz
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_read_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdls;
+ }
TRACE_1("reader_hdl_rec = %u", reader_hdl_rec->reader_hdl);
if (client_hdl_rec->valid) {
@@ -3412,6 +3602,10 @@ SaAisErrorT saNtfNotificationReadFinaliz
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE("Bad return status!!! rc = %d", rc);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto done_give_hdls;
}
@@ -3497,6 +3691,12 @@ SaAisErrorT saNtfNotificationReadNext(Sa
rc = SA_AIS_ERR_BAD_HANDLE;
goto done_give_read_hdl;
}
+ /*Check CLM membership of node.*/
+ if (client_hdl_rec->is_stale_client == true) {
+ TRACE("Node not CLM member or stale client");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto done_give_hdls;
+ }
TRACE_1("reader_hdl_rec = %u", reader_hdl_rec->reader_hdl);
/* Check NTF server availability */
@@ -3539,6 +3739,10 @@ SaAisErrorT saNtfNotificationReadNext(Sa
if (SA_AIS_OK != o_msg->info.api_resp_info.rc) {
rc = o_msg->info.api_resp_info.rc;
TRACE("error: response msg rc = %d", rc);
+ /*Check CLM membership of node.*/
+ if (rc == SA_AIS_ERR_UNAVAILABLE) {
+ TRACE("Node not CLM member or stale client");
+ }
goto done_give_hdls;
}
if (o_msg->info.api_resp_info.type != NTFSV_READ_NEXT_RSP) {
diff --git a/osaf/libs/agents/saf/ntfa/ntfa_mds.c
b/osaf/libs/agents/saf/ntfa/ntfa_mds.c
--- a/osaf/libs/agents/saf/ntfa/ntfa_mds.c
+++ b/osaf/libs/agents/saf/ntfa/ntfa_mds.c
@@ -270,6 +270,33 @@ uint32_t ntfa_ntfs_msg_proc(ntfa_cb_t *c
switch (ntfsv_msg->type) {
case NTFSV_NTFS_CBK_MSG:
switch (ntfsv_msg->info.cbk_info.type) {
+ case NTFSV_CLM_NODE_STATUS_CALLBACK:
+ {
+ ntfa_client_hdl_rec_t *ntfa_hdl_rec;
+ ntfsv_ntfa_clm_status_cbk_t *param =
&ntfsv_msg->info.cbk_info.param.clm_node_status_cbk;
+ TRACE_2("NTFSV_CLM_NODE_STATUS_CALLBACK: "
+ "subscriptionId = %d,"
+ " client_id = %d",
+ (int)ntfsv_msg->info.cbk_info.subscriptionId,
+ (int)ntfsv_msg->info.cbk_info.ntfs_client_id);
+ cb->clm_node_state = (SaClmClusterChangesT)
param->clm_node_status;
+ TRACE_2("CLM Membership of local node changed to : %u",
+ cb->clm_node_state);
+ //Search client.
+ if (NULL == (ntfa_hdl_rec =
+ ntfa_find_hdl_rec_by_client_id(cb,
+
ntfsv_msg->info.cbk_info.ntfs_client_id))) {
+ TRACE("client_id not found");
+ ntfa_msg_destroy(ntfsv_msg);
+ TRACE_LEAVE();
+ return NCSCC_RC_FAILURE;
+ }
+ //A client becomes stale if Node loses CLM Membership.
+ if (cb->clm_node_state != SA_CLM_NODE_JOINED)
+ ntfa_hdl_rec->is_stale_client = true;
+ ntfa_msg_destroy(ntfsv_msg);
+ }
+ break;
case NTFSV_NOTIFICATION_CALLBACK:
{
ntfa_client_hdl_rec_t *ntfa_hdl_rec;
@@ -620,6 +647,27 @@ static uint32_t ntfa_dec_not_discard_cbk
return ntfsv_dec_discard_msg(uba, param);
}
+/**
+ * @brief Decodes CLM node status callback msg.
+ *
+ * @param ptr to NCS_UBAID.
+ * @param ptr to ntfsv_msg_t.
+ *
+ * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ */
+static uint32_t ntfa_dec_clm_node_status_cbk_msg(NCS_UBAID *uba,
ntfsv_msg_t *msg)
+{
+ uint8_t *p8;
+ ntfsv_ntfa_clm_status_cbk_t *param =
&msg->info.cbk_info.param.clm_node_status_cbk;
+ uint8_t local_data[2];
+
+ osafassert(uba != NULL);
+
+ p8 = ncs_dec_flatten_space(uba, local_data, 2);
+ param->clm_node_status = ncs_decode_16bit(&p8);
+ ncs_dec_skip_space(uba, 2);
+ return NCSCC_RC_SUCCESS;
+}
/****************************************************************************
Name : ntfa_dec_subscribe_rsp_msg
@@ -862,6 +910,10 @@ static uint32_t ntfa_mds_dec(struct ncsm
TRACE_2("decode discarded cbk message");
rc = ntfa_dec_not_discard_cbk_msg(uba, msg);
break;
+ case NTFSV_CLM_NODE_STATUS_CALLBACK:
+ TRACE_2("decode clm node status cbk message");
+ rc = ntfa_dec_clm_node_status_cbk_msg(uba, msg);
+ break;
default:
TRACE_2("Unknown callback type = %d!",
msg->info.cbk_info.type);
rc = NCSCC_RC_FAILURE;
diff --git a/osaf/libs/agents/saf/ntfa/ntfa_util.c
b/osaf/libs/agents/saf/ntfa/ntfa_util.c
--- a/osaf/libs/agents/saf/ntfa/ntfa_util.c
+++ b/osaf/libs/agents/saf/ntfa/ntfa_util.c
@@ -53,6 +53,8 @@ static unsigned int ntfa_create(void)
pthread_mutex_lock(&ntfa_cb.cb_lock);
ntfa_cb.ntfs_sync_awaited = 0;
+ ntfa_cb.clm_node_state = SA_CLM_NODE_JOINED;
+
pthread_mutex_unlock(&ntfa_cb.cb_lock);
/* No longer needed */
@@ -1149,6 +1151,7 @@ ntfa_client_hdl_rec_t *ntfa_hdl_rec_add(
**/
rec->ntfs_client_id = client_id;
rec->valid = true;
+ rec->is_stale_client = false;
/** Initialize and attach the IPC/Priority queue
**/