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;
}
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<snapid_t> intersection;
intersection.intersection_of(newly_removed_snaps, cached_removed_snaps);
} 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;
}
};
struct PGPool {
+ epoch_t cached_epoch;
int64_t id;
string name;
uint64_t auid;
interval_set<snapid_t> cached_removed_snaps; // current removed_snaps set
interval_set<snapid_t> 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);
};