Hi again

> On 14 Oct. 2016, at 2:06 pm, Gary Lee <gary....@dektech.com.au> wrote:
> 
> Hi Praveen
> 
> Great idea, some minor comments:
> 
> - It seems a bit messy to add another parameter [ntfHandle] to 
> Job::exec(SaImmOiHandleT immOiHandle). 
> Can we just change the declaration to Job::exec(const AVD_CL_CB *cb)? And 
> ntfHandle wasn’t used anyway.
> Can we can move Job into its own header file?
> 
> - Can we remove NtfSend::already_sent?

Please ignore the above, I see the reason for it now.

> 
> - I think we should just queue up new notifications, instead of trying to 
> send it once. Otherwise, it might be
> possible to get the order of notifications messed up? This would be in line 
> with how IMM updates are done.
> 
> I’ve attached a modified version of your patch to help illustrate the 
> comments.
> 
> 
> 
> Thanks
> Gary
> 
>> On 13 Oct. 2016, at 9:09 pm, praveen.malv...@oracle.com wrote:
>> 
>> osaf/services/saf/amf/amfd/imm.cc        |   28 ++--
>> osaf/services/saf/amf/amfd/include/imm.h |   14 +-
>> osaf/services/saf/amf/amfd/include/ntf.h |    9 +-
>> osaf/services/saf/amf/amfd/main.cc       |    6 +-
>> osaf/services/saf/amf/amfd/ntf.cc        |  182 
>> ++++++++++++++++++++++--------
>> osaf/services/saf/amf/amfd/sgproc.cc     |    2 +-
>> 6 files changed, 164 insertions(+), 77 deletions(-)
>> 
>> 
>> Currently if AMFD gets TRY_AGAIN or TIMEOUT it logs notification and frees 
>> it.
>> 
>> With this patch, AMFD will give one try. AMFD will push the notification in 
>> the existing
>> job queue if hits with TRY_AGAIN or TIMEOUT in this try. Job queue already 
>> handles
>> TRY_AGAIN and TIMEOUT.
>> 
>> diff --git a/osaf/services/saf/amf/amfd/imm.cc 
>> b/osaf/services/saf/amf/amfd/imm.cc
>> --- a/osaf/services/saf/amf/amfd/imm.cc
>> +++ b/osaf/services/saf/amf/amfd/imm.cc
>> @@ -134,7 +134,7 @@ Job::~Job()
>> }
>> 
>> //
>> -AvdJobDequeueResultT ImmObjCreate::exec(SaImmOiHandleT immOiHandle)
>> +AvdJobDequeueResultT ImmObjCreate::exec(SaImmOiHandleT immOiHandle, 
>> SaNtfHandleT ntfHandle)
>> {
>>      SaAisErrorT rc;
>>      AvdJobDequeueResultT res;
>> @@ -200,7 +200,7 @@ ImmObjCreate::~ImmObjCreate()
>> }
>> 
>> //
>> -AvdJobDequeueResultT ImmObjUpdate::exec(SaImmOiHandleT immOiHandle)
>> +AvdJobDequeueResultT ImmObjUpdate::exec(SaImmOiHandleT immOiHandle, 
>> SaNtfHandleT ntfHandle)
>> {
>>      SaAisErrorT rc;
>>      AvdJobDequeueResultT res;
>> @@ -253,7 +253,7 @@ ImmObjUpdate::~ImmObjUpdate()
>> }
>> 
>> //
>> -AvdJobDequeueResultT ImmObjDelete::exec(SaImmOiHandleT immOiHandle)
>> +AvdJobDequeueResultT ImmObjDelete::exec(SaImmOiHandleT immOiHandle, 
>> SaNtfHandleT ntfHandle)
>> {
>>      SaAisErrorT rc;
>>      AvdJobDequeueResultT res;
>> @@ -290,7 +290,7 @@ ImmObjDelete::~ImmObjDelete()
>> }
>> 
>> //
>> -AvdJobDequeueResultT ImmAdminResponse::exec(const SaImmOiHandleT handle) {
>> +AvdJobDequeueResultT ImmAdminResponse::exec(SaImmOiHandleT handle, 
>> SaNtfHandleT ntfHandle) {
>>      SaAisErrorT rc;
>>      AvdJobDequeueResultT res;
>> 
>> @@ -331,10 +331,10 @@ Job* Fifo::peek()
>> {
>>      Job* tmp;
>>      
>> -    if (imm_job_.empty()) {
>> +    if (imm_ntf_job_.empty()) {
>>              tmp = 0;
>>      } else {
>> -            tmp = imm_job_.front();
>> +            tmp = imm_ntf_job_.front();
>>      }
>>      
>>      return tmp;
>> @@ -343,7 +343,7 @@ Job* Fifo::peek()
>> //
>> void Fifo::queue(Job* job)
>> {
>> -    imm_job_.push(job);
>> +    imm_ntf_job_.push(job);
>> }
>> 
>> //
>> @@ -351,11 +351,11 @@ Job* Fifo::dequeue()
>> {
>>      Job* tmp;
>>      
>> -    if (imm_job_.empty()) {
>> +    if (imm_ntf_job_.empty()) {
>>              tmp = 0;
>>      } else {
>> -            tmp = imm_job_.front();
>> -            imm_job_.pop();
>> +            tmp = imm_ntf_job_.front();
>> +            imm_ntf_job_.pop();
>>      }
>>      
>>      return tmp;
>> @@ -376,7 +376,7 @@ void check_and_flush_job_queue_standby_a
>> }
>> 
>> //
>> -AvdJobDequeueResultT Fifo::execute(SaImmOiHandleT immOiHandle)
>> +AvdJobDequeueResultT Fifo::execute(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle)
>> {
>>      Job *ajob;
>>      AvdJobDequeueResultT ret;
>> @@ -395,7 +395,7 @@ AvdJobDequeueResultT Fifo::execute(SaImm
>> 
>>      TRACE_ENTER();
>> 
>> -    ret = ajob->exec(immOiHandle);
>> +    ret = ajob->exec(immOiHandle, ntfHandle);
>>      
>>      TRACE_LEAVE2("%d", ret);
>> 
>> @@ -418,11 +418,11 @@ void Fifo::empty()
>> 
>> uint32_t Fifo::size()
>> {
>> -       return imm_job_.size();
>> +       return imm_ntf_job_.size();
>> }
>> 
>> //
>> -std::queue<Job*> Fifo::imm_job_;
>> +std::queue<Job*> Fifo::imm_ntf_job_;
>> //
>> 
>> extern struct ImmutilWrapperProfile immutilWrapperProfile;
>> diff --git a/osaf/services/saf/amf/amfd/include/imm.h 
>> b/osaf/services/saf/amf/amfd/include/imm.h
>> --- a/osaf/services/saf/amf/amfd/include/imm.h
>> +++ b/osaf/services/saf/amf/amfd/include/imm.h
>> @@ -52,7 +52,7 @@ typedef enum {
>> // TODO HANO Write comments
>> class Job {
>> public:
>> -    virtual AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle) = 0;
>> +    virtual AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, 
>> SaNtfHandleT ntfHandle) = 0;
>>      virtual ~Job() = 0;
>> };
>> 
>> @@ -63,7 +63,7 @@ public:
>>      std::string parentName_;
>>      const SaImmAttrValuesT_2 **attrValues_;
>>      
>> -    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>> +    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle);
>>      
>>      ~ImmObjCreate();
>> };
>> @@ -76,7 +76,7 @@ public:
>>      SaImmValueTypeT attrValueType_;
>>      void *value_;
>>      
>> -    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>> +    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle);
>>      
>>      ~ImmObjUpdate();
>> };
>> @@ -86,7 +86,7 @@ class ImmObjDelete : public Job {
>> public:
>>      std::string dn;
>>      
>> -    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>> +    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle);
>>      
>>      ~ImmObjDelete();
>> };
>> @@ -98,7 +98,7 @@ class ImmAdminResponse : public Job {
>>              this->invocation_ = invocation;
>>              this->result_ = result;
>>      }
>> -    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>> +    AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle);
>>      
>>      ~ImmAdminResponse() {}
>> private:
>> @@ -116,13 +116,13 @@ public:
>> 
>>        static Job* dequeue();
>> 
>> -        static AvdJobDequeueResultT execute(SaImmOiHandleT immOiHandle);
>> +        static AvdJobDequeueResultT execute(SaImmOiHandleT immOiHandle, 
>> SaNtfHandleT ntfHandle);
>> 
>>        static void empty();
>> 
>>      static uint32_t size();
>> private:
>> -        static std::queue<Job*> imm_job_;
>> +        static std::queue<Job*> imm_ntf_job_;
>> };
>> //
>> 
>> diff --git a/osaf/services/saf/amf/amfd/include/ntf.h 
>> b/osaf/services/saf/amf/amfd/include/ntf.h
>> --- a/osaf/services/saf/amf/amfd/include/ntf.h
>> +++ b/osaf/services/saf/amf/amfd/include/ntf.h
>> @@ -30,8 +30,8 @@
>> 
>> #include <comp.h>
>> #include <susi.h>
>> -
>> #define AMF_NTF_SENDER "safApp=safAmfService"
>> +#include "imm.h"
>> 
>> /* All states like oper, readiness etc starts from 1, so defining not 
>> applicable values */
>> #define STATE_ID_NA  0
>> @@ -106,5 +106,12 @@ void avd_send_error_report_ntf(const std
>> 
>> extern SaAisErrorT avd_ntf_init(struct cl_cb_tag*);
>> extern SaAisErrorT avd_start_ntf_init_bg(void);
>> +class NtfSend : public Job {
>> + public:
>> +   AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle);
>> +   SaNtfNotificationsT myntf;
>> +   bool already_sent;
>> +   ~NtfSend();
>> +};
>> 
>> #endif
>> diff --git a/osaf/services/saf/amf/amfd/main.cc 
>> b/osaf/services/saf/amf/amfd/main.cc
>> --- a/osaf/services/saf/amf/amfd/main.cc
>> +++ b/osaf/services/saf/amf/amfd/main.cc
>> @@ -663,7 +663,7 @@ static void main_loop(void)
>> 
>>              if (pollretval == 0) {
>>                      // poll time out, submit some jobs (if any)
>> -                    polltmo = 
>> retval_to_polltmo(Fifo::execute(cb->immOiHandle));
>> +                    polltmo = 
>> retval_to_polltmo(Fifo::execute(cb->immOiHandle, cb->ntfHandle));
>>                      continue;
>>              }
>> 
>> @@ -686,7 +686,7 @@ static void main_loop(void)
>> 
>>                      if (evt->rcv_evt == AVD_IMM_REINITIALIZED) {
>>                              TRACE("Received IMM reinit msg");
>> -                            polltmo = 
>> retval_to_polltmo(Fifo::execute(cb->immOiHandle));
>> +                            polltmo = 
>> retval_to_polltmo(Fifo::execute(cb->immOiHandle, cb->ntfHandle));
>>                              continue;
>>                      }
>> 
>> @@ -748,7 +748,7 @@ static void main_loop(void)
>>              }
>> 
>>              // submit some jobs (if any)
>> -            polltmo = retval_to_polltmo(Fifo::execute(cb->immOiHandle));
>> +            polltmo = retval_to_polltmo(Fifo::execute(cb->immOiHandle, 
>> cb->ntfHandle));
>>      }
>> 
>>      syslog(LOG_CRIT, "AVD Thread Failed");
>> diff --git a/osaf/services/saf/amf/amfd/ntf.cc 
>> b/osaf/services/saf/amf/amfd/ntf.cc
>> --- a/osaf/services/saf/amf/amfd/ntf.cc
>> +++ b/osaf/services/saf/amf/amfd/ntf.cc
>> @@ -26,6 +26,7 @@
>> #include <util.h>
>> #include <ntf.h>
>> #include "osaf_time.h"
>> +#include <queue>
>> 
>> /*****************************************************************************
>>  Name          :  avd_send_comp_inst_failed_alarm
>> @@ -529,6 +530,55 @@ SaAisErrorT fill_ntf_header_part_avd(SaN
>> 
>> }
>> 
>> +/*
>> + * @brief      Tries to send notification if not sent already. If not 
>> successful then
>> + *         does not try to Free() it. Same function will be called from job 
>> queue
>> + *         to complete remaining task. 
>> + * @param[in]  ptr to NtfSend 
>> + * @return     SaAisErrorT.
>> + * TODO:       Make it a member function of NtfSend() when all notification 
>> related handling 
>> + *         is moved in separate thread.
>> + */
>> +SaAisErrorT avd_try_send_notification(NtfSend *job) {
>> +  TRACE_ENTER2("Ntf Type:%x, sent status:%u", job->myntf.notificationType,
>> +    job->already_sent); 
>> +
>> +  SaNtfNotificationsT *myntf = &job->myntf;
>> +  SaAisErrorT rc = SA_AIS_OK;       
>> +  SaNtfNotificationHeaderT *header = nullptr;
>> +  SaNtfNotificationHandleT notificationHandle = 0;
>> +
>> +  if (myntf->notificationType == SA_NTF_TYPE_STATE_CHANGE) {
>> +    header = 
>> &myntf->notification.stateChangeNotification.notificationHeader;
>> +    notificationHandle = 
>> myntf->notification.stateChangeNotification.notificationHandle;
>> +  } else if (myntf->notificationType == SA_NTF_TYPE_ALARM) { 
>> +    header = &myntf->notification.alarmNotification.notificationHeader;
>> +    notificationHandle = 
>> myntf->notification.alarmNotification.notificationHandle;
>> +  }
>> +
>> +  //Try to send the notification if not sent.
>> +  if (job->already_sent == false) {
>> +    rc = saNtfNotificationSend(notificationHandle);
>> +    if ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) {
>> +      TRACE("Notification Send unsuccesful TRY_AGAIN or TIMEOUT rc:%u",rc);
>> +      goto done;
>> +    } else {
>> +      //To remember only Free is pending as NotificationFree() may hit with 
>> TRY AGAIN.
>> +      job->already_sent = true;
>> +    }
>> +    osaf_extended_name_free(header->notificationObject);
>> +    osaf_extended_name_free(header->notifyingObject);
>> +  }
>> +  
>> +  rc = saNtfNotificationFree(notificationHandle);
>> +  if ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) {
>> +    TRACE("Notification Free unsuccesful TRY_AGAIN or TIMEOUT rc:%u", rc);
>> +  }
>> +
>> +done:
>> +  TRACE_LEAVE();
>> +  return rc;
>> +}
>> uint32_t sendAlarmNotificationAvd(AVD_CL_CB *avd_cb,
>>                             const std::string& ntf_object,
>>                             SaUint8T *add_text,
>> @@ -540,28 +590,29 @@ uint32_t sendAlarmNotificationAvd(AVD_CL
>>                             int type)
>> {
>>      uint32_t status = NCSCC_RC_FAILURE;
>> -    SaNtfAlarmNotificationT myAlarmNotification;
>>      SaUint16T add_info_items = 0;
>>      SaUint64T allocation_size = 0;
>> +    SaAisErrorT rc = SA_AIS_OK;
>> 
>>      if (!avd_cb->active_services_exist) {
>>              // TODO #3051
>>              LOG_ER("Alarm lost for %s", ntf_object.c_str());
>>              return status;
>>      }
>> -
>>      if (avd_cb->ntfHandle == 0) {
>>              LOG_ER("NTF handle has not been initialized, alarm notification 
>> "
>>                              "for (%s) will be lost", ntf_object.c_str());
>>              return status;
>>      }
>> +    NtfSend *job = new NtfSend;
>> +    job->already_sent = false;
>> 
>>      if (type != 0) {
>>              add_info_items = 1;
>>              allocation_size = SA_NTF_ALLOC_SYSTEM_LIMIT;
>>      }
>> 
>> -    status = saNtfAlarmNotificationAllocate(avd_cb->ntfHandle, 
>> &myAlarmNotification,
>> +    status = saNtfAlarmNotificationAllocate(avd_cb->ntfHandle, 
>> &job->myntf.notification.alarmNotification,
>>                                              /* numCorrelatedNotifications */
>>                                              0,
>>                                              /* lengthAdditionalText */
>> @@ -582,7 +633,7 @@ uint32_t sendAlarmNotificationAvd(AVD_CL
>>              return NCSCC_RC_FAILURE;
>>      }
>> 
>> -    status = 
>> fill_ntf_header_part_avd(&myAlarmNotification.notificationHeader,
>> +    status = 
>> fill_ntf_header_part_avd(&job->myntf.notification.alarmNotification.notificationHeader,
>>                               SA_NTF_ALARM_PROCESSING,
>>                               ntf_object,
>>                               add_text,
>> @@ -591,33 +642,33 @@ uint32_t sendAlarmNotificationAvd(AVD_CL
>>                               const_cast<SaInt8T*>(AMF_NTF_SENDER),
>>                               add_info,
>>                               type,
>> -                             myAlarmNotification.notificationHandle);
>> +                             
>> job->myntf.notification.alarmNotification.notificationHandle);
>>      
>>      if (status != SA_AIS_OK) {
>>              LOG_ER("%s: fill_ntf_header_part_avd Failed (%u)", 
>> __FUNCTION__, status);
>> -            saNtfNotificationFree(myAlarmNotification.notificationHandle);
>> +            
>> saNtfNotificationFree(job->myntf.notification.alarmNotification.notificationHandle);
>>              return NCSCC_RC_FAILURE;
>>      }
>> 
>> -    *(myAlarmNotification.probableCause) = 
>> static_cast<SaNtfProbableCauseT>(probableCause);
>> -    *(myAlarmNotification.perceivedSeverity) = 
>> static_cast<SaNtfSeverityT>(perceivedSeverity);
>> +    *(job->myntf.notification.alarmNotification.probableCause) = 
>> static_cast<SaNtfProbableCauseT>(probableCause);
>> +    *(job->myntf.notification.alarmNotification.perceivedSeverity) = 
>> static_cast<SaNtfSeverityT>(perceivedSeverity);
>> 
>> -    status = saNtfNotificationSend(myAlarmNotification.notificationHandle);
>> +    job->myntf.notificationType = SA_NTF_TYPE_ALARM; 
>> 
>> -    
>> osaf_extended_name_free(myAlarmNotification.notificationHeader.notificationObject);
>> -    
>> osaf_extended_name_free(myAlarmNotification.notificationHeader.notifyingObject);
>> -
>> -    if (status != SA_AIS_OK) {
>> -            saNtfNotificationFree(myAlarmNotification.notificationHandle);
>> -            LOG_ER("%s: saNtfNotificationSend Failed (%u)", __FUNCTION__, 
>> status);
>> -            return NCSCC_RC_FAILURE;
>> -    }
>> -
>> -    status = saNtfNotificationFree(myAlarmNotification.notificationHandle);
>> -
>> -    if (status != SA_AIS_OK) {
>> -            LOG_ER("%s: saNtfNotificationFree Failed (%u)", __FUNCTION__, 
>> status);
>> -            return NCSCC_RC_FAILURE;
>> +    //Give atleast one try for of Send() and Free() API.
>> +    rc = avd_try_send_notification(job);
>> +        if (rc == SA_AIS_OK) {
>> +            //Notification Send() and Free() both successful.
>> +                delete job; 
>> +        } else if ((rc == SA_AIS_ERR_TRY_AGAIN) || (SA_AIS_ERR_TIMEOUT)) {
>> +            //Either Notification Send() or Free() or both un-successful.
>> +            //Push in the job queue.
>> +                TRACE("TRY-AGAIN/TIMEOUT rc:%u",rc);
>> +            Fifo::queue(job);
>> +    } else {
>> +            //Any other AIS return code. Not handled as of now.
>> +                TRACE("rc:%u",rc);
>> +                delete job; 
>>      }
>> 
>>      return status;
>> @@ -637,10 +688,10 @@ uint32_t sendStateChangeNotificationAvd(
>>                                   int additional_info_is_present)
>> {
>>      uint32_t status = NCSCC_RC_FAILURE;
>> -    SaNtfStateChangeNotificationT myStateNotification;
>>      SaUint16T add_info_items = 0;
>>      SaUint64T allocation_size = 0;
>>      SaUint16T num_of_changedStates = 1;
>> +    SaAisErrorT rc = SA_AIS_OK;
>> 
>>      if (!avd_cb->active_services_exist) {
>>              // TODO #3051
>> @@ -665,9 +716,10 @@ uint32_t sendStateChangeNotificationAvd(
>>      if (stateId == STATE_ID_NA) {
>>              num_of_changedStates = 0;
>>      }
>> -
>> +    NtfSend *job = new NtfSend;
>> +    job->already_sent = false;
>>      status = saNtfStateChangeNotificationAllocate(avd_cb->ntfHandle,/* 
>> handle to Notification Service instance */
>> -                                                  &myStateNotification,
>> +                                                  
>> &job->myntf.notification.stateChangeNotification,
>>                                                    /* number of correlated 
>> notifications */
>>                                                    0,
>>                                                    /* length of additional 
>> text */
>> @@ -684,7 +736,7 @@ uint32_t sendStateChangeNotificationAvd(
>>              return NCSCC_RC_FAILURE;
>>      }
>> 
>> -    status = 
>> fill_ntf_header_part_avd(&myStateNotification.notificationHeader,
>> +    status = 
>> fill_ntf_header_part_avd(&job->myntf.notification.stateChangeNotification.notificationHeader,
>>                               SA_NTF_OBJECT_STATE_CHANGE,
>>                               ntf_object,
>>                               add_text,
>> @@ -693,40 +745,39 @@ uint32_t sendStateChangeNotificationAvd(
>>                               const_cast<SaInt8T*>(AMF_NTF_SENDER),
>>                               add_info,
>>                               additional_info_is_present,
>> -                             myStateNotification.notificationHandle);
>> +                             
>> job->myntf.notification.stateChangeNotification.notificationHandle);
>>      
>>      if (status != SA_AIS_OK) {
>>              LOG_ER("%s: fill_ntf_header_part_avd Failed (%u)", 
>> __FUNCTION__, status);
>> -            saNtfNotificationFree(myStateNotification.notificationHandle);
>> +            
>> saNtfNotificationFree(job->myntf.notification.stateChangeNotification.notificationHandle);
>>              return NCSCC_RC_FAILURE;
>>      }
>> 
>> -    *(myStateNotification.sourceIndicator) = 
>> static_cast<SaNtfSourceIndicatorT>(sourceIndicator);
>> +    *(job->myntf.notification.stateChangeNotification.sourceIndicator) = 
>> static_cast<SaNtfSourceIndicatorT>(sourceIndicator);
>>      
>>      if (num_of_changedStates == 1) {
>> -            myStateNotification.changedStates->stateId = stateId;
>> -            myStateNotification.changedStates->oldStatePresent = SA_TRUE;
>> -            myStateNotification.changedStates->oldState = oldstate;
>> -            myStateNotification.changedStates->newState = newState;
>> +            
>> job->myntf.notification.stateChangeNotification.changedStates->stateId = 
>> stateId;
>> +            
>> job->myntf.notification.stateChangeNotification.changedStates->oldStatePresent
>>  = SA_TRUE;
>> +            
>> job->myntf.notification.stateChangeNotification.changedStates->oldState = 
>> oldstate;
>> +            
>> job->myntf.notification.stateChangeNotification.changedStates->newState = 
>> newState;
>>      }
>> +    job->myntf.notificationType = SA_NTF_TYPE_STATE_CHANGE; 
>> 
>> -    status = saNtfNotificationSend(myStateNotification.notificationHandle);
>> -
>> -    
>> osaf_extended_name_free(myStateNotification.notificationHeader.notificationObject);
>> -    
>> osaf_extended_name_free(myStateNotification.notificationHeader.notifyingObject);
>> -
>> -    if (status != SA_AIS_OK) {
>> -            saNtfNotificationFree(myStateNotification.notificationHandle);
>> -            LOG_ER("%s: saNtfNotificationSend Failed (%u)", __FUNCTION__, 
>> status);
>> -            return NCSCC_RC_FAILURE;
>> -    }
>> -
>> -    status = saNtfNotificationFree(myStateNotification.notificationHandle);
>> -
>> -    if (status != SA_AIS_OK) {
>> -            LOG_ER("%s: saNtfNotificationFree Failed (%u)", __FUNCTION__, 
>> status);
>> -            return NCSCC_RC_FAILURE;
>> -    }
>> +    //Give atleast one try for of Send() and Free() API.
>> +        rc = avd_try_send_notification(job);
>> +        if (rc == SA_AIS_OK) {
>> +                //Notification Send() and Free() both successful.
>> +                delete job;
>> +        } else if ((rc == SA_AIS_ERR_TRY_AGAIN) || (SA_AIS_ERR_TIMEOUT)) {
>> +                //Either Notification Send() or Free() or both 
>> un-successful.
>> +                //Push in the job queue.
>> +                TRACE("TRY-AGAIN/TIMEOUT rc:%u",rc);
>> +                Fifo::queue(job);
>> +        } else {
>> +                //Any other AIS return code. Not handled as of now.
>> +                TRACE("rc:%u",rc);
>> +                delete job;
>> +        }
>> 
>>      return status;
>> 
>> @@ -838,3 +889,32 @@ SaAisErrorT avd_start_ntf_init_bg(void)
>> 
>>      return SA_AIS_OK;
>> }
>> +
>> +AvdJobDequeueResultT NtfSend::exec(SaImmOiHandleT immOiHandle, SaNtfHandleT 
>> ntfHandle) {
>> +  AvdJobDequeueResultT res;
>> +  SaAisErrorT rc = SA_AIS_OK;
>> +  TRACE_ENTER2("Ntf Type:%x, sent status:%u", myntf.notificationType,
>> +    already_sent); 
>> +
>> +  rc = avd_try_send_notification(this);
>> +  if (rc == SA_AIS_OK) {
>> +    delete Fifo::dequeue();
>> +    res = JOB_EXECUTED;
>> +  } else if (rc == SA_AIS_ERR_TRY_AGAIN) {
>> +    TRACE("TRY-AGAIN");
>> +    res = JOB_ETRYAGAIN;
>> +  } else if (rc == SA_AIS_ERR_TIMEOUT) {
>> +    TRACE("TIMEOUT");
>> +    res = JOB_ETRYAGAIN;
>> +  } else {
>> +    delete Fifo::dequeue();
>> +    LOG_ER("%s: Notification Send FAILED %u", __FUNCTION__, rc);
>> +    res = JOB_ERR;
>> +  }
>> +
>> +  TRACE_LEAVE();
>> +  return res;
>> +}
>> +
>> +NtfSend::~NtfSend() {
>> +}
>> diff --git a/osaf/services/saf/amf/amfd/sgproc.cc 
>> b/osaf/services/saf/amf/amfd/sgproc.cc
>> --- a/osaf/services/saf/amf/amfd/sgproc.cc
>> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
>> @@ -801,7 +801,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb
>>                                              */
>>                                              AvdJobDequeueResultT job_res = 
>> JOB_EXECUTED;
>>                                              while (job_res == JOB_EXECUTED)
>> -                                                    job_res = 
>> Fifo::execute(cb->immOiHandle);
>> +                                                    job_res = 
>> Fifo::execute(cb->immOiHandle, cb->ntfHandle);
>> 
>>                                              goto done;
>>                                      } else {
> 
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most 
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> Opensaf-devel mailing list
> Opensaf-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to