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<snapid_t> intersection;
- intersection.intersection_of(newly_removed_snaps, cached_removed_snaps);
- if (intersection == cached_removed_snaps) {
- cached_removed_snaps.swap(newly_removed_snaps);
- newly_removed_snaps = cached_removed_snaps;
- newly_removed_snaps.subtract(intersection);
- } else {
- lgeneric_subdout(cct, osd, 0) << __func__
- << " cached_removed_snaps shrank from " << cached_removed_snaps
- << " to " << newly_removed_snaps << dendl;
- cached_removed_snaps.swap(newly_removed_snaps);
- newly_removed_snaps.clear();
- }
+ if (pi->maybe_updated_removed_snaps(cached_removed_snaps)) {
+ pi->build_removed_snaps(newly_removed_snaps);
+ interval_set<snapid_t> intersection;
+ intersection.intersection_of(newly_removed_snaps, cached_removed_snaps);
+ if (intersection == cached_removed_snaps) {
+ cached_removed_snaps.swap(newly_removed_snaps);
+ newly_removed_snaps = cached_removed_snaps;
+ newly_removed_snaps.subtract(intersection);
+ } else {
+ lgeneric_subdout(cct, osd, 0) << __func__
+ << " cached_removed_snaps shrank from " << cached_removed_snaps
+ << " to " << newly_removed_snaps << dendl;
+ cached_removed_snaps.swap(newly_removed_snaps);
+ newly_removed_snaps.clear();
+ }
+ } else
+ newly_removed_snaps.clear();
snapc = pi->get_snap_context();
} else {
/* 1) map->get_epoch() == cached_epoch + 1 &&
}
}
+bool pg_pool_t::maybe_updated_removed_snaps(const interval_set<snapid_t>& cached) const
+{
+ if (is_unmanaged_snaps_mode()) { // remove_unmanaged_snap increments range_end
+ if (removed_snaps.empty() || cached.empty()) // range_end is undefined
+ return removed_snaps.empty() != cached.empty();
+ return removed_snaps.range_end() != cached.range_end();
+ }
+ return true;
+}
+
snapid_t pg_pool_t::snap_exists(const char *s) const
{
for (map<snapid_t,pool_snap_info_t>::const_iterator p = snaps.begin();
* explicit removed_snaps set.
*/
void build_removed_snaps(interval_set<snapid_t>& rs) const;
+ bool maybe_updated_removed_snaps(const interval_set<snapid_t>& cached) const;
snapid_t snap_exists(const char *s) const;
void add_snap(const char *n, utime_t stamp);
void add_unmanaged_snap(uint64_t& snapid);