]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: only complete/deregister repop once
authorSage Weil <sage.weil@dreamhost.com>
Sat, 18 Feb 2012 00:23:50 +0000 (16:23 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Sat, 18 Feb 2012 00:24:10 +0000 (16:24 -0800)
It's now possible to send the ack and deregister the repop before the
op_applied() happens.  And when that happens, we'll call eval_repop() once
more.  Don't do anything in that case.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index d88e2a43cf21c52f54b8436a87b7a7b16f98f105..54dd45de99cf30e28dd50fc70ca52a1195daf182 100644 (file)
@@ -2972,10 +2972,16 @@ void ReplicatedPG::eval_repop(RepGather *repop)
   if (m)
     dout(10) << "eval_repop " << *repop
             << " wants=" << (m->wants_ack() ? "a":"") << (m->wants_ondisk() ? "d":"")
+            << (repop->done ? " DONE" : "")
             << dendl;
   else
-    dout(10) << "eval_repop " << *repop << " (no op)" << dendl;
+    dout(10) << "eval_repop " << *repop << " (no op)"
+            << (repop->done ? " DONE" : "")
+            << dendl;
+
+  if (repop->done)
+    return;
+
   // apply?
   if (!repop->applied && !repop->applying &&
       ((mode.is_delayed_mode() &&
@@ -3035,6 +3041,8 @@ void ReplicatedPG::eval_repop(RepGather *repop)
 
   // done.
   if (repop->waitfor_ack.empty() && repop->waitfor_disk.empty()) {
+    repop->done = true;
+
     calc_min_last_complete_ondisk();
 
     // kick snap_trimmer if necessary
index ef7d087a21e61fd193ac2fa9291a0965472a1d14..cc711c492128277952a8c72a67762ad0858ba6f6 100644 (file)
@@ -415,7 +415,7 @@ public:
 
     tid_t rep_tid;
 
-    bool applying, applied, aborted;
+    bool applying, applied, aborted, done;
 
     set<int>  waitfor_ack;
     //set<int>  waitfor_nvram;
@@ -437,7 +437,7 @@ public:
       nref(1),
       ctx(c), obc(pi),
       rep_tid(rt), 
-      applying(false), applied(false), aborted(false),
+      applying(false), applied(false), aborted(false), done(false),
       sent_ack(false),
       //sent_nvram(false),
       sent_disk(false),