From 02e5c1fca7787f266098e7e05f1dd9ffa9a78797 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 9 Sep 2013 16:08:30 -0700 Subject: [PATCH] ReplicatedPG: correctly handle backfill Signed-off-by: Samuel Just --- src/osd/ReplicatedBackend.cc | 1 - src/osd/ReplicatedPG.cc | 33 +++++++++++++++++---------------- src/osd/ReplicatedPG.h | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 59ce9bbcceb77..9868e7af2c877 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -61,7 +61,6 @@ void ReplicatedBackend::recover_object( return; } else { assert(obc); - assert(head); int started = start_pushes( hoid, obc, diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 1f688f97aa2e7..350186af3e08d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -223,10 +223,9 @@ void ReplicatedPG::on_peer_recover( info.stats.stats.sum.add(stat); publish_stats_to_osd(); // done! + peer_missing[peer].got(soid, recovery_info.version); if (peer == backfill_target && backfills_in_flight.count(soid)) backfills_in_flight.erase(soid); - else - peer_missing[peer].got(soid, recovery_info.version); } void ReplicatedPG::begin_peer_recover( @@ -8053,16 +8052,16 @@ int ReplicatedPG::recover_backfill( send_remove_op(i->first, i->second, backfill_target); } + PGBackend::RecoveryHandle *h = pgbackend->open_recovery_op(); map > pushes; for (map >::iterator i = to_push.begin(); i != to_push.end(); ++i) { handle.reset_tp_timeout(); prep_backfill_object_push( - i->first, i->second.first, i->second.second, backfill_target, &pushes); + i->first, i->second.first, i->second.second, backfill_target, h); } - // TODOSAM: replace - //send_pushes(g_conf->osd_recovery_op_priority, pushes); + pgbackend->run_recovery_op(h, cct->_conf->osd_recovery_op_priority); release_waiting_for_backfill_pos(); dout(5) << "backfill_pos is " << backfill_pos << " and pinfo.last_backfill is " @@ -8108,23 +8107,25 @@ int ReplicatedPG::recover_backfill( void ReplicatedPG::prep_backfill_object_push( hobject_t oid, eversion_t v, eversion_t have, int peer, - map > *pushes) + PGBackend::RecoveryHandle *h) { dout(10) << "push_backfill_object " << oid << " v " << v << " to osd." << peer << dendl; backfills_in_flight.insert(oid); + map::iterator bpm = peer_missing.find(backfill_target); + assert(bpm != peer_missing.end()); + bpm->second.add(oid, eversion_t(), eversion_t()); + + assert(!recovering.count(oid)); - if (!recovering.count(oid)) - start_recovery_op(oid); + start_recovery_op(oid); + recovering.insert(oid); ObjectContextRef obc = get_object_context(oid, false); -// TODOSAM: fix -#if 0 - obc->ondisk_read_lock(); - (*pushes)[peer].push_back(PushOp()); - prep_push_to_replica(obc, oid, peer, cct->_conf->osd_recovery_op_priority, - &((*pushes)[peer].back())); - obc->ondisk_read_unlock(); -#endif + pgbackend->recover_object( + oid, + ObjectContextRef(), + obc, + h); } void ReplicatedPG::scan_range( diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index cdd57e1581a08..54413c6aca07b 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -629,7 +629,7 @@ protected: void prep_backfill_object_push( hobject_t oid, eversion_t v, eversion_t have, int peer, - map > *pushes); + PGBackend::RecoveryHandle *h); void send_remove_op(const hobject_t& oid, eversion_t v, int peer); -- 2.39.5