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: v10.2.3~138^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b7f0e73223687035e470fcd7ffc7b851c04aba00;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) --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6d01fe8d6773..23d167591e8b 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2885,14 +2885,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); + PGPool p = PGPool(createmap, id); - const pg_pool_t *pi = createmap->get_pg_pool(id); - p.info = *pi; - p.snapc = pi->get_snap_context(); - - 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 e7e644298bd3..37737172a4cb 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -157,7 +157,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); @@ -175,14 +178,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 50a8d72f06fa..925e8bd87c9c 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -165,6 +165,7 @@ struct PGRecoveryStats { }; struct PGPool { + epoch_t cached_epoch; int64_t id; string name; uint64_t auid; @@ -175,8 +176,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); };