diff options
author | Samuel Just <sam.just@inktank.com> | 2013-03-21 13:37:13 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-03-21 18:51:40 -0700 |
commit | 022903bf73c85343e01336e104ac444806e33af8 (patch) | |
tree | 1b2d426e09874f23ddd000733385420beb70b6c8 | |
parent | 3ab4a09de22e445711cf1f1e1c9b5c4cfbabb79b (diff) | |
download | ceph-022903bf73c85343e01336e104ac444806e33af8.tar.gz |
PG: add helper for adding a timer event to retry backfill
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/osd/PG.cc | 35 | ||||
-rw-r--r-- | src/osd/PG.h | 19 |
2 files changed, 30 insertions, 24 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc index cc131163e61..27376179762 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3305,6 +3305,16 @@ void PG::reject_reservation() get_osdmap()->get_epoch()); } +void PG::schedule_backfill_full_retry() +{ + Mutex::Locker lock(osd->backfill_request_lock); + osd->backfill_request_timer.add_event_after( + g_conf->osd_backfill_retry_interval, + new QueuePeeringEvt<RequestBackfill>( + this, get_osdmap()->get_epoch(), + RequestBackfill())); +} + void PG::clear_scrub_reserved() { osd->scrub_wq.dequeue(this); @@ -5913,24 +5923,6 @@ void PG::RecoveryState::Backfilling::exit() pg->state_clear(PG_STATE_BACKFILL); } -template <class EVT> -struct QueuePeeringEvt : Context { - boost::intrusive_ptr<PG> pg; - epoch_t epoch; - EVT evt; - QueuePeeringEvt(PG *pg, epoch_t epoch, EVT evt) : - pg(pg), epoch(epoch), evt(evt) {} - void finish(int r) { - pg->lock(); - pg->queue_peering_event(PG::CephPeeringEvtRef( - new PG::CephPeeringEvt( - epoch, - epoch, - evt))); - pg->unlock(); - } -}; - /*--WaitRemoteBackfillReserved--*/ PG::RecoveryState::WaitRemoteBackfillReserved::WaitRemoteBackfillReserved(my_context ctx) @@ -5977,12 +5969,7 @@ PG::RecoveryState::WaitRemoteBackfillReserved::react(const RemoteReservationReje pg->state_clear(PG_STATE_BACKFILL_WAIT); pg->state_set(PG_STATE_BACKFILL_TOOFULL); - Mutex::Locker lock(pg->osd->backfill_request_lock); - pg->osd->backfill_request_timer.add_event_after( - g_conf->osd_backfill_retry_interval, - new QueuePeeringEvt<RequestBackfill>( - pg, pg->get_osdmap()->get_epoch(), - RequestBackfill())); + pg->schedule_backfill_full_retry(); return transit<NotBackfilling>(); } diff --git a/src/osd/PG.h b/src/osd/PG.h index 684266558c7..c8dd11a7ab3 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1051,9 +1051,28 @@ public: void sub_op_scrub_stop(OpRequestRef op); void reject_reservation(); + void schedule_backfill_full_retry(); // -- recovery state -- + template <class EVT> + struct QueuePeeringEvt : Context { + boost::intrusive_ptr<PG> pg; + epoch_t epoch; + EVT evt; + QueuePeeringEvt(PG *pg, epoch_t epoch, EVT evt) : + pg(pg), epoch(epoch), evt(evt) {} + void finish(int r) { + pg->lock(); + pg->queue_peering_event(PG::CephPeeringEvtRef( + new PG::CephPeeringEvt( + epoch, + epoch, + evt))); + pg->unlock(); + } + }; + class CephPeeringEvt { epoch_t epoch_sent; epoch_t epoch_requested; |