osaf/services/saf/amf/amfd/imm.cc        |   35 +++---
 osaf/services/saf/amf/amfd/include/imm.h |   26 +++-
 osaf/services/saf/amf/amfd/include/ntf.h |    1 +
 osaf/services/saf/amf/amfd/main.cc       |    6 +-
 osaf/services/saf/amf/amfd/ntf.cc        |  154 ++++++++++++++++++++----------
 osaf/services/saf/amf/amfd/sgproc.cc     |    2 +-
 6 files changed, 145 insertions(+), 79 deletions(-)


V2 version: Includes suggestions given by Gary.

Currently if AMFD gets TRY_AGAIN or TIMEOUT it logs notification and frees it.

AMFD will push the notification in the existing job queue. 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,11 +134,11 @@ Job::~Job()
 }
 
 //
-AvdJobDequeueResultT ImmObjCreate::exec(SaImmOiHandleT immOiHandle)
+AvdJobDequeueResultT ImmObjCreate::exec(const AVD_CL_CB *cb)
 {
        SaAisErrorT rc;
        AvdJobDequeueResultT res;
-       
+       const SaImmOiHandleT immOiHandle = cb->immOiHandle;
        TRACE_ENTER2("Create %s", parentName_.c_str());
 
        const SaNameTWrapper parent_name(parentName_);
@@ -200,11 +200,12 @@ ImmObjCreate::~ImmObjCreate()
 }
 
 //
-AvdJobDequeueResultT ImmObjUpdate::exec(SaImmOiHandleT immOiHandle)
+AvdJobDequeueResultT ImmObjUpdate::exec(const AVD_CL_CB *cb)
 {
        SaAisErrorT rc;
        AvdJobDequeueResultT res;
-       
+       const SaImmOiHandleT immOiHandle = cb->immOiHandle;
+
        SaImmAttrModificationT_2 attrMod;
        const SaImmAttrModificationT_2 *attrMods[] = {&attrMod, nullptr};
        SaImmAttrValueT attrValues[] = {value_};
@@ -253,10 +254,11 @@ ImmObjUpdate::~ImmObjUpdate()
 }
 
 //
-AvdJobDequeueResultT ImmObjDelete::exec(SaImmOiHandleT immOiHandle)
+AvdJobDequeueResultT ImmObjDelete::exec(const AVD_CL_CB *cb)
 {
        SaAisErrorT rc;
        AvdJobDequeueResultT res;
+       const SaImmOiHandleT immOiHandle = cb->immOiHandle;
 
        TRACE_ENTER2("Delete %s", dn.c_str());
 
@@ -290,9 +292,10 @@ ImmObjDelete::~ImmObjDelete()
 }
 
 //
-AvdJobDequeueResultT ImmAdminResponse::exec(const SaImmOiHandleT handle) {
+AvdJobDequeueResultT ImmAdminResponse::exec(const AVD_CL_CB *cb) {
        SaAisErrorT rc;
        AvdJobDequeueResultT res;
+       const SaImmOiHandleT handle = cb->immOiHandle;
 
        TRACE_ENTER2("Admin resp inv:%llu res:%u", invocation_, result_);
 
@@ -331,10 +334,10 @@ Job* Fifo::peek()
 {
        Job* tmp;
        
-       if (imm_job_.empty()) {
+       if (job_.empty()) {
                tmp = 0;
        } else {
-               tmp = imm_job_.front();
+               tmp = job_.front();
        }
        
        return tmp;
@@ -343,7 +346,7 @@ Job* Fifo::peek()
 //
 void Fifo::queue(Job* job)
 {
-       imm_job_.push(job);
+       job_.push(job);
 }
 
 //
@@ -351,11 +354,11 @@ Job* Fifo::dequeue()
 {
        Job* tmp;
        
-       if (imm_job_.empty()) {
+       if (job_.empty()) {
                tmp = 0;
        } else {
-               tmp = imm_job_.front();
-               imm_job_.pop();
+               tmp = job_.front();
+               job_.pop();
        }
        
        return tmp;
@@ -376,7 +379,7 @@ void check_and_flush_job_queue_standby_a
 }
 
 //
-AvdJobDequeueResultT Fifo::execute(SaImmOiHandleT immOiHandle)
+AvdJobDequeueResultT Fifo::execute(const AVD_CL_CB *cb)
 {
        Job *ajob;
        AvdJobDequeueResultT ret;
@@ -395,7 +398,7 @@ AvdJobDequeueResultT Fifo::execute(SaImm
 
        TRACE_ENTER();
 
-       ret = ajob->exec(immOiHandle);
+       ret = ajob->exec(cb);
        
        TRACE_LEAVE2("%d", ret);
 
@@ -418,11 +421,11 @@ void Fifo::empty()
 
 uint32_t Fifo::size()
 {
-       return imm_job_.size();
+       return job_.size();
 }
 
 //
-std::queue<Job*> Fifo::imm_job_;
+std::queue<Job*> Fifo::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
@@ -24,6 +24,7 @@
 #ifndef AVD_IMM_H
 #define AVD_IMM_H
 
+#include "cb.h"
 #include <immutil.h>
 #include <queue>
 #include <string>
@@ -50,9 +51,10 @@ typedef enum {
 } AvdJobDequeueResultT;
 
 // TODO HANO Write comments
+// @todo move this into job.h
 class Job {
 public:
-       virtual AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle) = 0;
+       virtual AvdJobDequeueResultT exec(const AVD_CL_CB *cb) = 0;
        virtual ~Job() = 0;
 };
 
@@ -63,7 +65,7 @@ public:
        std::string parentName_;
        const SaImmAttrValuesT_2 **attrValues_;
        
-       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
+       AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        
        ~ImmObjCreate();
 };
@@ -76,7 +78,7 @@ public:
        SaImmValueTypeT attrValueType_;
        void *value_;
        
-       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
+       AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        
        ~ImmObjUpdate();
 };
@@ -86,7 +88,7 @@ class ImmObjDelete : public Job {
 public:
        std::string dn;
        
-       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
+       AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        
        ~ImmObjDelete();
 };
@@ -98,7 +100,7 @@ class ImmAdminResponse : public Job {
                this->invocation_ = invocation;
                this->result_ = result;
        }
-       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
+       AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        
        ~ImmAdminResponse() {}
  private:
@@ -107,6 +109,16 @@ class ImmAdminResponse : public Job {
        SaAisErrorT result_;
 };
 
+class NtfSend : public Job {
+ public:
+   NtfSend() : already_sent(false) {}
+   AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+   SaNtfNotificationsT myntf;
+   bool already_sent;
+   ~NtfSend();
+};
+
+// @todo move this into job.h
 //
 class Fifo {
 public:
@@ -116,13 +128,13 @@ public:
 
         static Job* dequeue();
     
-        static AvdJobDequeueResultT execute(SaImmOiHandleT immOiHandle);
+        static AvdJobDequeueResultT execute(const AVD_CL_CB *cb);
 
         static void empty();
     
        static uint32_t size();
 private:
-        static std::queue<Job*> imm_job_;
+        static std::queue<Job*> 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
@@ -31,6 +31,7 @@
 #include <comp.h>
 #include <susi.h>
 
+#include "imm.h"
 #define AMF_NTF_SENDER "safApp=safAmfService"
 
 /* All states like oper, readiness etc starts from 1, so defining not 
applicable values */
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));
                        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));
                                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));
        }
 
        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,7 +590,6 @@ uint32_t sendAlarmNotificationAvd(AVD_CL
                               int type)
 {
        uint32_t status = NCSCC_RC_FAILURE;
-       SaNtfAlarmNotificationT myAlarmNotification;
        SaUint16T add_info_items = 0;
        SaUint64T allocation_size = 0;
 
@@ -549,19 +598,19 @@ uint32_t sendAlarmNotificationAvd(AVD_CL
                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{};
 
        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 +631,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,34 +640,21 @@ 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.
+       Fifo::queue(job);
 
        return status;
 
@@ -637,7 +673,6 @@ 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;
@@ -665,9 +700,9 @@ uint32_t sendStateChangeNotificationAvd(
        if (stateId == STATE_ID_NA) {
                num_of_changedStates = 0;
        }
-
+       NtfSend *job = new NtfSend{};
        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 +719,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 +728,26 @@ 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.
+       Fifo::queue(job);
 
        return status;
 
@@ -838,3 +859,32 @@ SaAisErrorT avd_start_ntf_init_bg(void)
 
        return SA_AIS_OK;
 }
+
+AvdJobDequeueResultT NtfSend::exec(const AVD_CL_CB *cb) {
+  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);
 
                                                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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to