]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: add helper for adding a timer event to retry backfill
authorSamuel Just <sam.just@inktank.com>
Thu, 21 Mar 2013 20:37:13 +0000 (13:37 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 22 Mar 2013 01:51:40 +0000 (18:51 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/PG.h

index cc131163e619290f59a5193eeda9efd772837682..273761797629d50c4854808125bf20ae6b47cb0c 100644 (file)
@@ -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>();
 }
index 684266558c79ea4e0be60011db972828fdb0d88a..c8dd11a7ab3e33e6cae412da3e1e3a4a0fa707f4 100644 (file)
@@ -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;