summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2012-07-12 16:45:26 -0700
committerSamuel Just <sam.just@inktank.com>2012-07-12 16:52:37 -0700
commitbcfa573f5f615f3403ff71da0212cd1cee7e7d9c (patch)
tree3e96650933d3dc1f305435d509772f5845282870
parent10ec5926c3e09806b4d75689b9af8781c79a6f9d (diff)
downloadceph-bcfa573f5f615f3403ff71da0212cd1cee7e7d9c.tar.gz
ReplicatedPG: don't mark repop done until apply completes
Consider the following sequence: 1. issue, apply repop 2. replicas and primary commit Here, repop->waitfor_(ack|disk) are empty, so we mark repop->done and remove_repop. 3. interval change, repops still in queue are marked aborted 4. activate, last_update_applied = last_update 5. the repop from one enters apply_repop, is not aborted, and finds that last_update_applied has passed it by. Fixes #2749 Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/osd/ReplicatedPG.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index 54a2a785d85..16af52ea022 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -3584,7 +3584,8 @@ void ReplicatedPG::eval_repop(RepGather *repop)
}
// done.
- if (repop->waitfor_ack.empty() && repop->waitfor_disk.empty()) {
+ if (repop->waitfor_ack.empty() && repop->waitfor_disk.empty() &&
+ repop->applied) {
repop->done = true;
calc_min_last_complete_ondisk();