summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-03-21 13:37:13 -0700
committerSamuel Just <sam.just@inktank.com>2013-03-21 18:51:40 -0700
commit022903bf73c85343e01336e104ac444806e33af8 (patch)
tree1b2d426e09874f23ddd000733385420beb70b6c8
parent3ab4a09de22e445711cf1f1e1c9b5c4cfbabb79b (diff)
downloadceph-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.cc35
-rw-r--r--src/osd/PG.h19
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;