]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: requeue PG when we skip handling a peering event
authorSage Weil <sage@redhat.com>
Thu, 8 Jan 2015 21:34:52 +0000 (13:34 -0800)
committerSage Weil <sage@redhat.com>
Mon, 12 Jan 2015 16:20:39 +0000 (08:20 -0800)
If we don't handle the event, we need to put the PG back into the peering
queue or else the event won't get processed until the next event is
queued, at which point we'll be processing events with a delay.

The queue_null is not necessary (and is a waste of effort) because the
event is still in pg->peering_queue and the PG is queued.

Note that this only triggers when we exceeed osd_map_max_advance, usually
when there is a lot of peering and recovery activity going on.  A
workaround is to increase that value, but if you exceed osd_map_cache_size
you expose yourself to crache thrashing by the peering work queue, which
can cause serious problems with heavily degraded clusters and bit lots of
people on dumpling.

Backport: giant, firefly
Fixes: #10431
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 492ccc900c3358f36b6b14a207beec071eb06707)

src/osd/OSD.cc

index f45dd6b809d14b978f747234ed9dd40e0ed1a32d..4c8b4da8c1f4a22e64316f39038e5a4a02d265ba 100644 (file)
@@ -8444,7 +8444,9 @@ void OSD::process_peering_events(
       continue;
     }
     if (!advance_pg(curmap->get_epoch(), pg, handle, &rctx, &split_pgs)) {
-      pg->queue_null(curmap->get_epoch(), curmap->get_epoch());
+      // we need to requeue the PG explicitly since we didn't actually
+      // handle an event
+      peering_wq.queue(pg);
     } else if (!pg->peering_queue.empty()) {
       PG::CephPeeringEvtRef evt = pg->peering_queue.front();
       pg->peering_queue.pop_front();