From: Samuel Just Date: Tue, 23 Sep 2014 19:16:55 +0000 (-0700) Subject: PG: check full ratio again post-reservation X-Git-Tag: v0.86~21^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F2602%2Fhead;p=ceph.git PG: check full ratio again post-reservation Otherwise, we might queue 30 pgs for backfill at 0.80 fullness and then never check again filling the osd after pg 11. Fixes: #9574 Backport: dumpling, firefly, giant Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 2c86f3ba2d25..83d03e5203cf 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -5926,14 +5926,33 @@ boost::statechart::result PG::RecoveryState::RepWaitBackfillReserved::react(const RemoteBackfillReserved &evt) { PG *pg = context< RecoveryMachine >().pg; - pg->osd->send_message_osd_cluster( - pg->primary.osd, - new MBackfillReserve( - MBackfillReserve::GRANT, - spg_t(pg->info.pgid.pgid, pg->primary.shard), - pg->get_osdmap()->get_epoch()), - pg->get_osdmap()->get_epoch()); - return transit(); + + double ratio, max_ratio; + if (g_conf->osd_debug_reject_backfill_probability > 0 && + (rand()%1000 < (g_conf->osd_debug_reject_backfill_probability*1000.0))) { + dout(10) << "backfill reservation rejected after reservation: " + << "failure injection" << dendl; + pg->osd->remote_reserver.cancel_reservation(pg->info.pgid); + post_event(RemoteReservationRejected()); + return discard_event(); + } else if (pg->osd->too_full_for_backfill(&ratio, &max_ratio) && + !pg->cct->_conf->osd_debug_skip_full_check_in_backfill_reservation) { + dout(10) << "backfill reservation rejected after reservation: full ratio is " + << ratio << ", which is greater than max allowed ratio " + << max_ratio << dendl; + pg->osd->remote_reserver.cancel_reservation(pg->info.pgid); + post_event(RemoteReservationRejected()); + return discard_event(); + } else { + pg->osd->send_message_osd_cluster( + pg->primary.osd, + new MBackfillReserve( + MBackfillReserve::GRANT, + spg_t(pg->info.pgid.pgid, pg->primary.shard), + pg->get_osdmap()->get_epoch()), + pg->get_osdmap()->get_epoch()); + return transit(); + } } boost::statechart::result