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>
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() &&
// done.
if (repop->waitfor_ack.empty() && repop->waitfor_disk.empty()) {
+ repop->done = true;
+
calc_min_last_complete_ondisk();
// kick snap_trimmer if necessary
tid_t rep_tid;
- bool applying, applied, aborted;
+ bool applying, applied, aborted, done;
set<int> waitfor_ack;
//set<int> waitfor_nvram;
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),