summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-07-17 15:04:10 -0700
committerSamuel Just <sam.just@inktank.com>2013-07-17 18:11:39 -0700
commitb41f1ba48563d1d3fd17c2f62d10103b5d63f305 (patch)
treefec3973ad1063a0befeb95eb8ed828f1266bca55
parent278c7b59228f614addf830cb0afff4988c9bc8cb (diff)
downloadceph-b41f1ba48563d1d3fd17c2f62d10103b5d63f305.tar.gz
PG: start flush on primary only after we process the master log
Once we start serving reads, stray objects must have already been removed. Therefore, we have to flush all operations up to the transaction writing out the authoritative log. On replicas, we flush in Stray() if we will not eventually be activated and in ReplicaActive if we are in the acting set. This way a replica won't serve a replica read until the store is consistent. Signed-off-by: Samuel Just <sam.just@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/osd/PG.cc20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc
index 0663b86665d..bf522c8d9e1 100644
--- a/src/osd/PG.cc
+++ b/src/osd/PG.cc
@@ -5163,11 +5163,6 @@ PG::RecoveryState::Started::Started(my_context ctx)
{
state_name = "Started";
context< RecoveryMachine >().log_enter(state_name);
- PG *pg = context< RecoveryMachine >().pg;
- pg->start_flush(
- context< RecoveryMachine >().get_cur_transaction(),
- context< RecoveryMachine >().get_on_applied_context_list(),
- context< RecoveryMachine >().get_on_safe_context_list());
}
boost::statechart::result
@@ -6131,6 +6126,12 @@ PG::RecoveryState::ReplicaActive::ReplicaActive(my_context ctx)
state_name = "Started/ReplicaActive";
context< RecoveryMachine >().log_enter(state_name);
+
+ PG *pg = context< RecoveryMachine >().pg;
+ pg->start_flush(
+ context< RecoveryMachine >().get_cur_transaction(),
+ context< RecoveryMachine >().get_on_applied_context_list(),
+ context< RecoveryMachine >().get_on_safe_context_list());
}
@@ -6219,6 +6220,11 @@ PG::RecoveryState::Stray::Stray(my_context ctx)
assert(!pg->is_active());
assert(!pg->is_peering());
assert(!pg->is_primary());
+ if (!pg->is_replica()) // stray, need to flush for pulls
+ pg->start_flush(
+ context< RecoveryMachine >().get_cur_transaction(),
+ context< RecoveryMachine >().get_on_applied_context_list(),
+ context< RecoveryMachine >().get_on_safe_context_list());
}
boost::statechart::result PG::RecoveryState::Stray::react(const MLogRec& logevt)
@@ -6565,6 +6571,10 @@ boost::statechart::result PG::RecoveryState::GetLog::react(const GotLog&)
msg->info, msg->log, msg->missing,
newest_update_osd);
}
+ pg->start_flush(
+ context< RecoveryMachine >().get_cur_transaction(),
+ context< RecoveryMachine >().get_on_applied_context_list(),
+ context< RecoveryMachine >().get_on_safe_context_list());
return transit< GetMissing >();
}