From 4e06dfd988ec442a063fe518e3de8b31c539518b Mon Sep 17 00:00:00 2001 From: John Spray Date: Wed, 26 Feb 2014 16:29:20 +0000 Subject: [PATCH] msg: Make SimpleMessenger shutdown safer ...in the case where no dispatchers were ever added, previously we would throw an assertion in wait(). Signed-off-by: John Spray --- src/msg/Accepter.cc | 4 +++- src/msg/DispatchQueue.h | 1 + src/msg/SimpleMessenger.cc | 10 ++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/msg/Accepter.cc b/src/msg/Accepter.cc index 5eebb2eec61f..eb578cd9ed82 100644 --- a/src/msg/Accepter.cc +++ b/src/msg/Accepter.cc @@ -247,7 +247,9 @@ void Accepter::stop() // wait for thread to stop before closing the socket, to avoid // racing against fd re-use. - join(); + if (is_started()) { + join(); + } if (listen_sd >= 0) { ::close(listen_sd); diff --git a/src/msg/DispatchQueue.h b/src/msg/DispatchQueue.h index df7313035923..dffd65cc54ef 100644 --- a/src/msg/DispatchQueue.h +++ b/src/msg/DispatchQueue.h @@ -168,6 +168,7 @@ class DispatchQueue { void entry(); void wait(); void shutdown(); + bool is_started() {return dispatch_thread.is_started();} DispatchQueue(CephContext *cct, SimpleMessenger *msgr) : cct(cct), msgr(msgr), diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index 78e0e69835b6..e11783dd0ab5 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -509,10 +509,12 @@ void SimpleMessenger::wait() } lock.Unlock(); - ldout(cct,10) << "wait: waiting for dispatch queue" << dendl; - dispatch_queue.wait(); - ldout(cct,10) << "wait: dispatch queue is stopped" << dendl; - + if(dispatch_queue.is_started()) { + ldout(cct,10) << "wait: waiting for dispatch queue" << dendl; + dispatch_queue.wait(); + ldout(cct,10) << "wait: dispatch queue is stopped" << dendl; + } + // done! clean up. if (did_bind) { ldout(cct,20) << "wait: stopping accepter thread" << dendl; -- 2.47.3