In handle_event_in_failover_state(), we iterate through
queue_evt in a while loop, but process_event() can insert
items into the queue inside the loop, and we may end
up never exiting the while loop.
---
 src/amf/amfd/cb.h      |  3 ++-
 src/amf/amfd/main.cc   | 13 +++++++++----
 src/amf/amfd/ndfsm.cc  |  4 ++--
 src/amf/amfd/ndproc.cc |  4 ++--
 4 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/amf/amfd/cb.h b/src/amf/amfd/cb.h
index 89cf15d..4418db6 100644
--- a/src/amf/amfd/cb.h
+++ b/src/amf/amfd/cb.h
@@ -38,6 +38,7 @@
 #include <saClm.h>
 
 #include <atomic>
+#include <deque>
 #include <list>
 #include <map>
 #include <memory>
@@ -166,7 +167,7 @@ typedef struct cl_cb_tag {
   std::queue<AVSV_ND_MSG_QUEUE *> nd_msg_queue_list{};
 
   /* Event Queue to hold the events during fail-over */
-  std::queue<AVD_EVT_QUEUE *> evt_queue{};
+  std::deque<AVD_EVT_QUEUE *> evt_queue{};
   /*
    * MBCSv related variables.
    */
diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index 50daa59..d22bcb6 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -395,7 +395,7 @@ static void handle_event_in_failover_state(AVD_EVT *evt) {
     /* Enqueue this event */
     queue_evt = new AVD_EVT_QUEUE();
     queue_evt->evt = evt;
-    cb->evt_queue.push(queue_evt);
+    cb->evt_queue.push_back(queue_evt);
   }
 
   std::map<uint32_t, AVD_FAIL_OVER_NODE *>::const_iterator it =
@@ -407,9 +407,14 @@ static void handle_event_in_failover_state(AVD_EVT *evt) {
     /* Dequeue, all the messages from the queue
        and process them now */
 
-    while (!cb->evt_queue.empty()) {
-      AVD_EVT_QUEUE *queue_evt = cb->evt_queue.front();
-      cb->evt_queue.pop();
+    // get ref to end of queue, to make sure we don't get stuck
+    // iterating through the deque, as events may be added into
+    // evt_queue inside the loop (to be refactored?)
+    auto end_iter = cb->evt_queue.end();
+    auto iter = cb->evt_queue.begin();
+    while (iter != end_iter) {
+      AVD_EVT_QUEUE *queue_evt = *iter++;
+      cb->evt_queue.pop_front();
       process_event(cb, queue_evt->evt);
       delete queue_evt;
     }
diff --git a/src/amf/amfd/ndfsm.cc b/src/amf/amfd/ndfsm.cc
index 8c8f3c5..b763c79 100644
--- a/src/amf/amfd/ndfsm.cc
+++ b/src/amf/amfd/ndfsm.cc
@@ -69,7 +69,7 @@ void avd_process_state_info_queue(AVD_CL_CB *cb) {
   for (i = 0; i < queue_size; i++) {
     queue_evt = cb->evt_queue.front();
     osafassert(queue_evt->evt);
-    cb->evt_queue.pop();
+    cb->evt_queue.pop_front();
 
     TRACE("rcv_evt: %u", queue_evt->evt->rcv_evt);
 
@@ -95,7 +95,7 @@ void avd_process_state_info_queue(AVD_CL_CB *cb) {
       delete queue_evt->evt;
       delete queue_evt;
     } else {
-      cb->evt_queue.push(queue_evt);
+      cb->evt_queue.push_back(queue_evt);
     }
   }
 
diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc
index 5f5cbcd..433b00a 100644
--- a/src/amf/amfd/ndproc.cc
+++ b/src/amf/amfd/ndproc.cc
@@ -350,7 +350,7 @@ void avd_nd_sisu_state_info_evh(AVD_CL_CB *cb, AVD_EVT 
*evt) {
     state_info_evt->evt = new AVD_EVT{};
     state_info_evt->evt->rcv_evt = evt->rcv_evt;
     state_info_evt->evt->info.avnd_msg = n2d_msg;
-    cb->evt_queue.push(state_info_evt);
+    cb->evt_queue.push_back(state_info_evt);
   } else {
     LOG_WA(
         "Ignore this sisu_state_info message since node sync window has 
closed");
@@ -392,7 +392,7 @@ void avd_nd_compcsi_state_info_evh(AVD_CL_CB *cb, AVD_EVT 
*evt) {
     state_info_evt->evt = new AVD_EVT{};
     state_info_evt->evt->rcv_evt = evt->rcv_evt;
     state_info_evt->evt->info.avnd_msg = n2d_msg;
-    cb->evt_queue.push(state_info_evt);
+    cb->evt_queue.push_back(state_info_evt);
   } else {
     LOG_WA(
         "Ignore this compcsi_state_info message since node sync window has 
closed");
-- 
2.7.4



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

Reply via email to