]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fix waiting_for_disk assertion
authorSage Weil <sage@inktank.com>
Tue, 28 Aug 2012 22:14:41 +0000 (15:14 -0700)
committerSage Weil <sage@inktank.com>
Tue, 28 Aug 2012 22:14:41 +0000 (15:14 -0700)
If requeue is false, we won't have cleared out waiting_for_ondisk; adjust
assert placement as appropriate.  Also, make sur we handle the requeue
and !op case properly (although I'm not sure offhand if/when it would
come up).

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc

index 2850efb09cde88416e5cc9fa5a59ee37d33bb01a..218afc467993657d5aa80736dbb395fd79687654 100644 (file)
@@ -5727,10 +5727,12 @@ void ReplicatedPG::apply_and_flush_repops(bool requeue)
       apply_repop(repop);
     repop->aborted = true;
 
-    if (requeue && repop->ctx->op) {
-      dout(10) << " requeuing " << *repop->ctx->op->request << dendl;
-      rq.push_back(repop->ctx->op);
-      repop->ctx->op = OpRequestRef();
+    if (requeue) {
+      if (repop->ctx->op) {
+       dout(10) << " requeuing " << *repop->ctx->op->request << dendl;
+       rq.push_back(repop->ctx->op);
+       repop->ctx->op = OpRequestRef();
+      }
 
       // also requeue any dups, interleaved into position
       map<eversion_t, list<OpRequestRef> >::iterator p = waiting_for_ondisk.find(repop->v);
@@ -5746,9 +5748,10 @@ void ReplicatedPG::apply_and_flush_repops(bool requeue)
 
   if (requeue) {
     requeue_ops(rq);
+    assert(waiting_for_ondisk.empty());
   }
 
-  assert(waiting_for_ondisk.empty());
+  waiting_for_ondisk.clear();
   waiting_for_ack.clear();
 }