src/amf/amfd/imm.cc   |  59 ++++++++++++++++++++++++++++++++++++++++++++------
 src/amf/amfd/imm.h    |  36 ++++++++++++++++++++++--------
 src/amf/amfd/ndfsm.cc |  14 +++++------
 3 files changed, 83 insertions(+), 26 deletions(-)


amfd needs to prioritize to execute IMM updates jobs in its queue.
This patch makes a differentiation of job type in amfd's queue so
that amfd can know to execute IMM jobs first

diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc
--- a/src/amf/amfd/imm.cc
+++ b/src/amf/amfd/imm.cc
@@ -134,6 +134,21 @@ Job::~Job()
 }
 
 //
+bool ImmJob::isRunnable(const AVD_CL_CB *cb) {
+       TRACE_ENTER();
+       bool rc = true;
+       if ((!avd_cb->is_implementer) && (avd_cb->avail_state_avd == 
SA_AMF_HA_STANDBY)) {
+               rc = false;
+       }
+
+       if (avd_cb->avd_imm_status == AVD_IMM_INIT_ONGOING) {
+               TRACE("Already IMM init is going, try again after sometime");
+               rc = false;
+       }
+       TRACE_LEAVE();
+       return rc;
+}
+//
 AvdJobDequeueResultT ImmObjCreate::exec(const AVD_CL_CB *cb)
 {
        SaAisErrorT rc;
@@ -398,17 +413,13 @@ AvdJobDequeueResultT Fifo::execute(const
        if (!avd_cb->active_services_exist)
                return JOB_ETRYAGAIN;
 
-       if ((!avd_cb->is_implementer) && (avd_cb->avail_state_avd == 
SA_AMF_HA_STANDBY)) {
-               return JOB_EINVH;
-       }
-
-       if (avd_cb->avd_imm_status == AVD_IMM_INIT_ONGOING) {
-               TRACE("Already IMM init is going, try again after sometime");
-               return JOB_ETRYAGAIN;
-       }
        if ((ajob = peek()) == nullptr)
                return JOB_ENOTEXIST;
 
+       if (ajob->isRunnable(cb) == false)
+               return JOB_ETRYAGAIN;
+
+
        TRACE_ENTER();
 
        ret = ajob->exec(cb);
@@ -421,6 +432,38 @@ AvdJobDequeueResultT Fifo::execute(const
 
        return ret;
 }
+AvdJobDequeueResultT Fifo::executeAll(const AVD_CL_CB *cb, AvdJobTypeT 
job_type) {
+
+       Job *ajob, *firstjob;
+       AvdJobDequeueResultT ret = JOB_EXECUTED;
+
+       TRACE_ENTER();
+       firstjob = nullptr;
+
+       while ((ajob = peek()) != nullptr) {
+               if (job_type == JOB_TYPE_ANY || ajob->getJobType() == job_type) 
{
+                       ret = ajob->exec(cb);
+                       if (ret != JOB_EXECUTED)
+                               break;
+               } else {
+                       // push back
+                       ajob = Fifo::dequeue();
+                       Fifo::queue(ajob);
+
+                       // check if we have gone through all jobs of queue
+                       if (firstjob == nullptr) {
+                               firstjob = ajob;
+                       } else {
+                               if (firstjob == ajob)
+                                       break;
+                       }
+               }
+       }
+
+       TRACE_LEAVE2("%d", ret);
+
+       return ret;
+}
 
 AvdJobDequeueResultT Fifo::executeAdminResp(const AVD_CL_CB *cb)
 {
diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h
--- a/src/amf/amfd/imm.h
+++ b/src/amf/amfd/imm.h
@@ -51,25 +51,38 @@ typedef enum {
 
 } AvdJobDequeueResultT;
 
+typedef enum {
+       JOB_TYPE_IMM = 1,  /* A IMM job */
+       JOB_TYPE_NTF = 2, /* A NTF job */
+       JOB_TYPE_ANY
+} AvdJobTypeT;
+
 // TODO HANO Write comments
 // @todo move this into job.h
 class Job {
 public:
-       bool implementer;
-
-       Job():implementer(true) {};
        virtual AvdJobDequeueResultT exec(const AVD_CL_CB *cb) = 0;
        virtual ~Job() = 0;
+       virtual AvdJobTypeT getJobType() = 0;
+       virtual bool isRunnable(const AVD_CL_CB *cb) = 0;
 };
 
+
+class ImmJob : public Job {
+public:
+       bool implementer;
+       ImmJob():implementer(true) {};
+       AvdJobTypeT getJobType() { return JOB_TYPE_IMM; }
+       bool isRunnable(const AVD_CL_CB *cb);
+};
 //
-class ImmObjCreate : public Job {
+class ImmObjCreate : public ImmJob {
 public:
        SaImmClassNameT className_;
        std::string parentName_;
        const SaImmAttrValuesT_2 **attrValues_;
 
-       ImmObjCreate():Job() {};
+       ImmObjCreate():ImmJob() {};
        bool immobj_update_required();
        AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        
@@ -77,14 +90,14 @@ public:
 };
 
 //
-class ImmObjUpdate : public Job {
+class ImmObjUpdate : public ImmJob {
 public:
        std::string dn;
        SaImmAttrNameT attributeName_;
        SaImmValueTypeT attrValueType_;
        void *value_;
 
-       ImmObjUpdate():Job() {};
+       ImmObjUpdate():ImmJob() {};
        bool immobj_update_required();
        AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
        bool si_get_attr_value();
@@ -97,11 +110,11 @@ public:
 };
 
 //
-class ImmObjDelete : public Job {
+class ImmObjDelete : public ImmJob {
 public:
        std::string dn;
 
-       ImmObjDelete():Job() {};
+       ImmObjDelete():ImmJob() {};
        bool immobj_update_required();
        bool is_csiass_exist();
        bool is_siass_exist();
@@ -110,7 +123,7 @@ public:
        ~ImmObjDelete();
 };
 
-class ImmAdminResponse : public Job {
+class ImmAdminResponse : public ImmJob {
  public:
        ImmAdminResponse(const SaInvocationT invocation,
                const SaAisErrorT result) {
@@ -130,6 +143,8 @@ class NtfSend : public Job {
  public:
    NtfSend() : already_sent(false) {}
    AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+   AvdJobTypeT getJobType() { return JOB_TYPE_NTF; }
+   bool isRunnable(const AVD_CL_CB *cb) { return true;}
    SaNtfNotificationsT myntf;
    bool already_sent;
    ~NtfSend();
@@ -146,6 +161,7 @@ public:
         static Job* dequeue();
     
         static AvdJobDequeueResultT execute(const AVD_CL_CB *cb);
+        static AvdJobDequeueResultT executeAll(const AVD_CL_CB *cb, 
AvdJobTypeT job_type = JOB_TYPE_ANY);
 
         static AvdJobDequeueResultT executeAdminResp(const AVD_CL_CB *cb);
 
diff --git a/src/amf/amfd/ndfsm.cc b/src/amf/amfd/ndfsm.cc
--- a/src/amf/amfd/ndfsm.cc
+++ b/src/amf/amfd/ndfsm.cc
@@ -569,15 +569,13 @@ void avd_node_down_evh(AVD_CL_CB *cb, AV
                m_AVD_SET_AVND_RCV_ID(cb, node, 
(n2d_msg->msg_info.n2d_node_down_info.msg_id));
 
        // try to execute all pending jobs
-       AvdJobDequeueResultT ret = JOB_EXECUTED;
-       while (Fifo::size() > 0) {
-               ret = Fifo::execute(cb);
-               if (ret != JOB_EXECUTED) {
-                       LOG_WA("AMFD has (%d) pending jobs not being executed", 
Fifo::size());
-                       break;
-               }
+       // Pritority: Run all IMM jobs first, NTF jobs second
+       if (Fifo::executeAll(cb, JOB_TYPE_IMM) != JOB_EXECUTED ||
+               Fifo::executeAll(cb, JOB_TYPE_NTF) != JOB_EXECUTED) {
+               LOG_WA("AMFD has (%d) pending jobs not being executed", 
Fifo::size());
        }
-       if (ret == JOB_EXECUTED) {
+
+       if (Fifo::size() == 0) {
                // send ack for node_down message to amfnd, so amfnd can 
continue termination phase
                if (avd_snd_node_ack_msg(cb, node, 
n2d_msg->msg_info.n2d_node_down_info.msg_id) != NCSCC_RC_SUCCESS) {
                        /* log error that the director is not able to send the 
message */

------------------------------------------------------------------------------
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