If we have request A (say, cache-flush) that blocks things, and then
request B that gets blocked on it, and we have an interval change, then we
need to requeue B first, then A, so that the resulting queue will keep
A before B and preserve the order.
This was observed on this firefly run:
ubuntu@teuthology:/a/sage-2015-01-09_21:43:43-rados-firefly-distro-basic-multi/694675
Backport: giant, firefly
Fixes: #10512
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit
11bdfb4131ecac16d4a364d651c6cf5d1d28c702)
osd->objecter->op_cancel(fop->objecter_tid, -ECANCELED);
fop->objecter_tid = 0;
}
+ if (fop->blocking) {
+ fop->obc->stop_block();
+ kick_object_context_blocked(fop->obc);
+ }
if (requeue) {
if (fop->op)
requeue_op(fop->op);
requeue_ops(fop->dup_ops);
}
- if (fop->blocking) {
- fop->obc->stop_block();
- kick_object_context_blocked(fop->obc);
- }
if (fop->on_flush) {
Context *on_flush = fop->on_flush;
fop->on_flush = NULL;