summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-08-16 02:19:22 +0200
committerSage Weil <sage@inktank.com>2012-08-16 22:15:11 +0200
commitda210bee091705fc488cc7c839c32d46280c1719 (patch)
tree6a3a8f562d8b21d30d8cf228e95ed1e07b62afc6 /src
parentosd: simplify how in-progress ops are requeued (diff)
downloadceph-da210bee091705fc488cc7c839c32d46280c1719.tar.xz
ceph-da210bee091705fc488cc7c839c32d46280c1719.zip
osd: explicitly requeue waiting_for_map in on_change()
Since we are requeuing stuff anyway, do it all in the correct order. This fixes a bug where take_waiters() comes along later (at activate_map time) and puts waiting_for_map events at the front of the queue, in front of e.g. waiting_for_missing. This breaks ordering from the client's perspective. The convention should be: whenever you requeue, requeuing everything that logically follows it first. Fixes: #2947 Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Samuel Just <sam.just@inktank.com>
Diffstat (limited to 'src')
-rw-r--r--src/osd/ReplicatedPG.cc4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index 3e1b0dfbd0e..3396511d374 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -5772,6 +5772,10 @@ void ReplicatedPG::on_change()
{
dout(10) << "on_change" << dendl;
+ // requeue everything in the reverse order they should be
+ // reexamined.
+ requeue_ops(waiting_for_map);
+
clear_scrub_reserved();
scrub_clear_state();