From: Samuel Just Date: Wed, 17 Jul 2013 22:04:10 +0000 (-0700) Subject: PG: start flush on primary only after we process the master log X-Git-Tag: v0.67-rc1~39 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b41f1ba48563d1d3fd17c2f62d10103b5d63f305;p=ceph.git 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 Reviewed-by: Sage Weil --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 0663b86665dc..bf522c8d9e15 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 >(); }