From 766069e40c483b32cf4fd08ca71ad70e16de776d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 5 Jun 2009 10:50:21 -0700 Subject: [PATCH] osd: handle removal of pool snaps Use helper to build effective removed_snaps set (regardless of whether they are explicitly specified in the pg_pool_t or implicity via the pool snaps). Keep a copy of that set in the OSD's PGPool so we can track changes. --- src/TODO | 1 - src/osd/OSD.cc | 17 +++++++++-------- src/osd/PG.h | 3 ++- src/osd/osd_types.h | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/TODO b/src/TODO index ea76d3f4ffbd4..0eadb38bfebfb 100644 --- a/src/TODO +++ b/src/TODO @@ -36,7 +36,6 @@ later rados - snaps - use default pool contexts - - make snap removal work with the default pools (fix new_removed_snaps logic in OSD.cc) - merge pgs - destroy pg_pools - autosize pg_pools? diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index eaf343d2e66ab..c3d734a388ce4 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -576,6 +576,8 @@ PGPool* OSD::_get_pool(int id) const pg_pool_t& pi = osdmap->get_pg_pool(id); p->info = pi; p->snapc = pi.get_snap_context(); + + pi.build_removed_snaps(p->removed_snaps); } dout(10) << "_get_pool " << p->id << " " << p->num_pg << " -> " << (p->num_pg+1) << dendl; p->num_pg++; @@ -1940,11 +1942,10 @@ void OSD::handle_osd_map(MOSDMap *m) const pg_pool_t& pi = osdmap->get_pg_pool(p->first); if (pi.get_snap_epoch() == cur+1) { PGPool *pool = p->second; - pool->new_removed_snaps = pi.removed_snaps; - pool->new_removed_snaps.subtract(pool->info.removed_snaps); - dout(10) << " pool " << p->first << " removed_snaps " << pool->info.removed_snaps - << " -> " << pi.removed_snaps - << ", new is " << pool->new_removed_snaps << ")" + pi.build_removed_snaps(pool->newly_removed_snaps); + pool->newly_removed_snaps.subtract(pool->removed_snaps); + dout(10) << " pool " << p->first << " removed_snaps " << pool->removed_snaps + << ", newly so are " << pool->newly_removed_snaps << ")" << dendl; pool->info = pi; pool->snapc = pi.get_snap_context(); @@ -2081,9 +2082,9 @@ void OSD::advance_map(ObjectStore::Transaction& t) pg->lock(); // adjust removed_snaps? - if (!pg->pool->new_removed_snaps.empty()) { - for (map::iterator p = pg->pool->new_removed_snaps.m.begin(); - p != pg->pool->new_removed_snaps.m.end(); + if (!pg->pool->newly_removed_snaps.empty()) { + for (map::iterator p = pg->pool->newly_removed_snaps.m.begin(); + p != pg->pool->newly_removed_snaps.m.end(); p++) for (snapid_t t = 0; t < p->second; ++t) pg->info.snap_trimq.insert(p->first + t); diff --git a/src/osd/PG.h b/src/osd/PG.h index 91bcc0e19f72f..f7e61f3ad80f8 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -51,7 +51,8 @@ struct PGPool { pg_pool_t info; SnapContext snapc; // the default pool snapc, ready to go. - interval_set new_removed_snaps; // newly removed in the last epoch + interval_set removed_snaps; // current removed_snaps set + interval_set newly_removed_snaps; // newly removed in the last epoch PGPool(int i) : id(i), num_pg(0) {} diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 9ed3ee4852d46..d684b300e7a5b 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -471,6 +471,20 @@ struct pg_pool_t { return snaps.count(s) == 0; return s <= get_snap_seq() && removed_snaps.contains(s); } + /* + * build set of known-removed sets from either pool snaps or + * explicit removed_snaps set. + */ + void build_removed_snaps(interval_set& rs) const { + if (snaps.size()) { + for (snapid_t s = 1; s <= get_snap_seq(); s = s + 1) + if (snaps.count(s) == 0) + rs.insert(s); + } else { + rs = removed_snaps; + } + } + SnapContext get_snap_context() const { vector s(snaps.size()); unsigned i = 0; -- 2.39.5