diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6b592ff85bf..591c019d969 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8440,6 +8440,11 @@ bool OSD::advance_pg( pg->write_if_dirty(rctx); dispatch_context(rctx, pg, pg->get_osdmap(), &handle); pg->ch->flush(); + // release backoffs explicitly, since the on_shutdown path + // aggressively tears down backoff state. + if (pg->is_primary()) { + pg->release_pg_backoffs(); + } pg->on_shutdown(); OSDShard *sdata = pg->osd_shard; { diff --git a/src/osd/PG.h b/src/osd/PG.h index 1ed490a0a9a..d1d4b124144 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1085,11 +1085,13 @@ protected: hobject_t end = info.pgid.pgid.get_hobj_end(pool.info.get_pg_num()); add_backoff(s, begin, end); } +public: void release_pg_backoffs() { hobject_t begin = info.pgid.pgid.get_hobj_start(); hobject_t end = info.pgid.pgid.get_hobj_end(pool.info.get_pg_num()); release_backoffs(begin, end); } +protected: // -- scrub -- public: