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