From: Samuel Just Date: Thu, 19 May 2016 23:00:35 +0000 (-0700) Subject: PG: update PGPool to detect map gaps and reset cached_removed_snaps X-Git-Tag: v0.94.10~41^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5fb8fb4e450949ebc4c724c102a5b2ae6f1d06c8;p=ceph.git PG: update PGPool to detect map gaps and reset cached_removed_snaps Fixes: http://tracker.ceph.com/issues/15943 Signed-off-by: Samuel Just (cherry picked from commit 5798fb3bf6d726d14a9c5cb99dc5902eba5b878a) Conflicts: src/osd/OSD.cc: trivial, fuzz is too big so git prefers to be safe --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index fc9674d099fd..707ef1c46620 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2538,14 +2538,8 @@ PGPool OSD::_get_pool(int id, OSDMapRef createmap) assert(0); } - PGPool p = PGPool(id, createmap->get_pool_name(id), - createmap->get_pg_pool(id)->auid); - - const pg_pool_t *pi = createmap->get_pg_pool(id); - p.info = *pi; - p.snapc = pi->get_snap_context(); + PGPool p = PGPool(createmap, id); - pi->build_removed_snaps(p.cached_removed_snaps); dout(10) << "_get_pool " << p.id << dendl; return p; } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index b8e7f274a8b2..331b270e7e4a 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -156,7 +156,10 @@ void PGPool::update(OSDMapRef map) info = *pi; auid = pi->auid; name = map->get_pool_name(id); - if (pi->get_snap_epoch() == map->get_epoch()) { + bool updated = false; + if ((map->get_epoch() == cached_epoch + 1) && + (pi->get_snap_epoch() == map->get_epoch())) { + updated = true; pi->build_removed_snaps(newly_removed_snaps); interval_set intersection; intersection.intersection_of(newly_removed_snaps, cached_removed_snaps); @@ -174,14 +177,14 @@ void PGPool::update(OSDMapRef map) } else { newly_removed_snaps.clear(); } + cached_epoch = map->get_epoch(); lgeneric_subdout(g_ceph_context, osd, 20) << "PGPool::update cached_removed_snaps " << cached_removed_snaps << " newly_removed_snaps " << newly_removed_snaps << " snapc " << snapc - << (pi->get_snap_epoch() == map->get_epoch() ? - " (updated)":" (no change)") + << (updated ? " (updated)":" (no change)") << dendl; } diff --git a/src/osd/PG.h b/src/osd/PG.h index 935e7444514f..286c5ff3cc6a 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -161,6 +161,7 @@ struct PGRecoveryStats { }; struct PGPool { + epoch_t cached_epoch; int64_t id; string name; uint64_t auid; @@ -171,8 +172,17 @@ struct PGPool { interval_set cached_removed_snaps; // current removed_snaps set interval_set newly_removed_snaps; // newly removed in the last epoch - PGPool(int64_t i, const string& _name, uint64_t au) - : id(i), name(_name), auid(au) { } + PGPool(OSDMapRef map, int64_t i) + : cached_epoch(map->get_epoch()), + id(i), + name(map->get_pool_name(id)), + auid(map->get_pg_pool(id)->auid) { + const pg_pool_t *pi = map->get_pg_pool(id); + assert(pi); + info = *pi; + snapc = pi->get_snap_context(); + pi->build_removed_snaps(cached_removed_snaps); + } void update(OSDMapRef map); };