From 747b3d467834ac60aa1384897a4a63a02a2656e9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 31 Jan 2012 07:23:10 -0800 Subject: [PATCH] osd: use RecoveryContext transaction, finishers on recovery completion We should use the enclosing transaction and finisher list here. Signed-off-by: Sage Weil --- src/osd/OSD.cc | 26 +++++++++++++++++++++----- src/osd/PG.cc | 8 ++------ src/osd/PG.h | 2 +- src/osd/ReplicatedPG.cc | 6 +++--- src/osd/ReplicatedPG.h | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 64b6e59f248bf..42de018907ecb 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -5005,7 +5005,14 @@ void OSD::do_recovery(PG *pg) dout(20) << " active was " << recovery_oids[pg->info.pgid] << dendl; #endif - int started = pg->start_recovery_ops(max); + ObjectStore::Transaction *t = new ObjectStore::Transaction; + C_Contexts *fin = new C_Contexts(g_ceph_context); + map< int, vector > notify_list; // primary -> list + map< int, map > query_map; // peer -> PG -> get_summary_since + map info_map; // peer -> message + PG::RecoveryCtx rctx(&query_map, &info_map, 0, &fin->contexts, t); + + int started = pg->start_recovery_ops(max, &rctx); dout(10) << "do_recovery started " << started << " (" << recovery_ops_active << "/" << g_conf->osd_recovery_max_active << " rops) on " @@ -5018,11 +5025,8 @@ void OSD::do_recovery(PG *pg) * out while trying to pull. */ if (!started && pg->have_unfound()) { - map< int, map > query_map; pg->discover_all_missing(query_map); - if (query_map.size()) - do_queries(query_map); - else { + if (!query_map.size()) { dout(10) << "do_recovery no luck, giving up on this pg for now" << dendl; recovery_wq.lock(); pg->recovery_item.remove_myself(); // sigh... @@ -5036,6 +5040,18 @@ void OSD::do_recovery(PG *pg) recovery_wq.unlock(); } + do_notifies(notify_list, pg->get_osdmap()->get_epoch()); // notify? (residual|replica) + do_queries(query_map); + do_infos(info_map); + + if (!t->empty()) { + int tr = store->queue_transaction(&pg->osr, t, new ObjectStore::C_DeleteTransaction(t), fin); + assert(tr == 0); + } else { + delete t; + delete fin; + } + pg->unlock(); } pg->put(); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index c35c14685c203..df11a3aa74523 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -4058,12 +4058,8 @@ boost::statechart::result PG::RecoveryState::Active::react(const RecoveryComplet if (pg->is_all_uptodate()) { dout(10) << "recovery complete" << dendl; pg->log.reset_recovery_pointers(); - ObjectStore::Transaction *t = new ObjectStore::Transaction; - C_Contexts *fin = new C_Contexts(g_ceph_context); - pg->finish_recovery(*t, fin->contexts); - int tr = pg->osd->store->queue_transaction(&pg->osr, t, - new ObjectStore::C_DeleteTransaction(t), fin); - assert(tr == 0); + pg->finish_recovery(*context< RecoveryMachine >().get_cur_transaction(), + *context< RecoveryMachine >().get_context_list()); } else { dout(10) << "recovery not yet complete: some osds not up to date" << dendl; } diff --git a/src/osd/PG.h b/src/osd/PG.h index 526f0aae06968..4908904b7cee3 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1589,7 +1589,7 @@ public: virtual void clean_up_local(ObjectStore::Transaction& t) = 0; - virtual int start_recovery_ops(int max) = 0; + virtual int start_recovery_ops(int max, RecoveryCtx *prctx) = 0; void purge_strays(); diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index ddab37feb24bb..c8d11186c2ab2 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -5127,7 +5127,7 @@ void ReplicatedPG::check_recovery_op_pulls(const OSDMapRef osdmap) } -int ReplicatedPG::start_recovery_ops(int max) +int ReplicatedPG::start_recovery_ops(int max, RecoveryCtx *prctx) { int started = 0; assert(is_primary()); @@ -5166,8 +5166,8 @@ int ReplicatedPG::start_recovery_ops(int max) assert(recovery_ops_active == 0); - PG::RecoveryCtx rctx(0, 0, 0, 0, 0); - handle_recovery_complete(&rctx); + handle_recovery_complete(prctx); + return 0; } diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 830fae1706838..dc93168185f4a 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -638,7 +638,7 @@ protected: void _clear_recovery_state(); void queue_for_recovery(); - int start_recovery_ops(int max); + int start_recovery_ops(int max, RecoveryCtx *prctx); int recover_primary(int max); int recover_replicas(int max); int recover_backfill(int max); -- 2.39.5