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