We should use the enclosing transaction and finisher list here.
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
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<PG::Info> > notify_list; // primary -> list
+ map< int, map<pg_t,PG::Query> > query_map; // peer -> PG -> get_summary_since
+ map<int,MOSDPGInfo*> 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 "
* out while trying to pull.
*/
if (!started && pg->have_unfound()) {
- map< int, map<pg_t,PG::Query> > 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...
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();
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;
}
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();
}
-int ReplicatedPG::start_recovery_ops(int max)
+int ReplicatedPG::start_recovery_ops(int max, RecoveryCtx *prctx)
{
int started = 0;
assert(is_primary());
assert(recovery_ops_active == 0);
- PG::RecoveryCtx rctx(0, 0, 0, 0, 0);
- handle_recovery_complete(&rctx);
+ handle_recovery_complete(prctx);
+
return 0;
}
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);