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 **/ ------------------------------------------------------------------------------ Transform Data into Opportunity. Accelerate data analysis in your applications with Intel Data Analytics Acceleration Library. Click to learn more. http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel