From 79d68ae8581141c3fb4cfafd76d5111ff009b762 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 17 Feb 2013 22:35:50 -0800 Subject: [PATCH] osd: requeue pg waiters at the front of the finished queue We could have a sequence like: - op1 - notify - op2 in the finished queue. Op1 gets put on waiting_for_pg, the notify creates the pg and requeues op1 (and the end), op2 is handled, and finally op1 is handled. That breaks ordering; see #2947. Instead, when we wake up a pg, queue the waiting messages at the front of the dispatch queue. Signed-off-by: Sage Weil Reviewed-by: Samuel Just (cherry picked from commit 56c5a07708d52de1699585c9560cff8b4e993d0a) --- src/osd/OSD.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/osd/OSD.h b/src/osd/OSD.h index c3bc0b96839ed..3a4e5117af555 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -617,6 +617,11 @@ private: finished.splice(finished.end(), ls); finished_lock.Unlock(); } + void take_waiters_front(list& ls) { + finished_lock.Lock(); + finished.splice(finished.begin(), ls); + finished_lock.Unlock(); + } void take_waiter(OpRequestRef op) { finished_lock.Lock(); finished.push_back(op); @@ -880,7 +885,7 @@ protected: void wake_pg_waiters(pg_t pgid) { if (waiting_for_pg.count(pgid)) { - take_waiters(waiting_for_pg[pgid]); + take_waiters_front(waiting_for_pg[pgid]); waiting_for_pg.erase(pgid); } } @@ -888,7 +893,7 @@ protected: for (map >::iterator p = waiting_for_pg.begin(); p != waiting_for_pg.end(); p++) - take_waiters(p->second); + take_waiters_front(p->second); waiting_for_pg.clear(); } -- 2.39.5