From: Sage Weil Date: Thu, 20 Dec 2012 21:48:06 +0000 (-0800) Subject: log: fix flush/signal race X-Git-Tag: v0.56~35 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=50914e7a429acddb981bc3344f51a793280704e6;p=ceph.git log: fix flush/signal race We need to signal the cond in the same interval where we hold the lock *and* modify the queue. Otherwise, we can have a race like: queue has 1 item, max is 1. A: enter submit_entry, signal cond, wait on condition B: enter submit_entry, signal cond, wait on condition C: flush wakes up, flushes 1 previous item A: retakes lock, enqueues something, exits B: retakes lock, condition fails, waits -> C is never woken up as there are 2 items waiting Signed-off-by: Sage Weil Reviewed-by: Dan Mick --- diff --git a/src/log/Log.cc b/src/log/Log.cc index 32d8be79c455..51a340ffcb17 100644 --- a/src/log/Log.cc +++ b/src/log/Log.cc @@ -136,13 +136,13 @@ void Log::set_stderr_level(int log, int crash) void Log::submit_entry(Entry *e) { pthread_mutex_lock(&m_queue_mutex); - pthread_cond_signal(&m_cond); // wait for flush to catch up while (m_new.m_len > m_max_new) pthread_cond_wait(&m_cond, &m_queue_mutex); m_new.enqueue(e); + pthread_cond_signal(&m_cond); pthread_mutex_unlock(&m_queue_mutex); }