]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: release backoffs during merge 31822/head
authorSage Weil <sage@redhat.com>
Thu, 14 Nov 2019 14:49:32 +0000 (08:49 -0600)
committerNeha Ojha <nojha@redhat.com>
Fri, 22 Nov 2019 19:49:13 +0000 (11:49 -0800)
When we merge PGs, ensure that backoffs release messages are sent to
the client before the victim PG is destroyed.  This is /almost/ handled
by on_shutdown(), except that the shutdown code is aggressive about
tearing down backoff state in order to manage the PGRef lifecycle
carefully--and because in the shutdown (or normal PG/pool deletion) case
it doesn't matter what (if anything) we tell the client.

Fix this by simply queuing the backoff release prior to shutting down the
merge source PG.

An alternative appraoch would be to rejigger the PGRef release timing, but
that code is very fragile and this is a more targetted fix for this issue.
We might consider a more careful look in the future... or not!

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit f75d8327277012db70c2ca00991decacf29b1b6a)

src/osd/OSD.cc
src/osd/PG.h

index a3e26a06c325e29bb808ce55dbc7294aaa5d10d5..3cf724f221c8135fde273d7be17a47f3d1115f11 100644 (file)
@@ -8941,6 +8941,11 @@ bool OSD::advance_pg(
          pg->write_if_dirty(rctx);
          dispatch_context_transaction(*rctx, pg, &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;
          {
index a4245b749f11c1ca4d57aaac9218d2a7bb770e97..e14291f7653fa206656b3c198601f5ab125ebe99 100644 (file)
@@ -1673,11 +1673,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: