Hi Praveen,

I see the latest ntfa_api.c code does not reserve SA_AIS_ERR_UNAVAILABLE 
when recovery client/reader/subscriber failed due to non-SA_AIS_OK rc in 
returned msg. Can you check whether this V2 was pushed?

Thanks,
Minh
On 29/03/16 20:02, praveen.malv...@oracle.com wrote:
>   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(&notification_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(&notification_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(&notification_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(&notification_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
>        **/
>   
>


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to