From 1c93e03f04e42c59b739fecf84f36c554541e320 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 5 Feb 2014 18:42:34 -0800 Subject: [PATCH] osd/: Add a shard parameter to SnapMapper to handle multiple pg shards Signed-off-by: Samuel Just --- src/osd/OSD.cc | 8 ++++++-- src/osd/PG.cc | 3 ++- src/osd/SnapMapper.cc | 4 ++-- src/osd/SnapMapper.h | 28 +++++++++++++++++++++++----- src/test/test_snap_mapper.cc | 3 ++- src/tools/ceph-filestore-dump.cc | 8 ++++++-- 6 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e2b8353fff21c..22b1ad4215b3c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1698,13 +1698,17 @@ void OSD::recursive_remove_collection(ObjectStore *store, coll_t tmp) store, coll_t(), make_snapmapper_oid()); - SnapMapper mapper(&driver, 0, 0, 0); + + spg_t pg; + tmp.is_pg_prefix(pg); + + ObjectStore::Transaction t; + SnapMapper mapper(&driver, 0, 0, 0, pg.shard); vector objects; store->collection_list(tmp, objects); // delete them. - ObjectStore::Transaction t; unsigned removed = 0; for (vector::iterator p = objects.begin(); p != objects.end(); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 0ba7cadc652ab..7046a6fcdcf7d 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -148,7 +148,8 @@ PG::PG(OSDService *o, OSDMapRef curmap, &osdriver, p.m_seed, p.get_split_bits(curmap->get_pg_num(_pool.id)), - _pool.id), + _pool.id, + p.shard), map_lock("PG::map_lock"), osdmap_ref(curmap), last_persisted_osdmap_ref(curmap), pool(_pool), _lock("PG::_lock"), diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 315e2e2fe8698..870fdd059829b 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -80,7 +80,7 @@ string SnapMapper::get_prefix(snapid_t snap) string SnapMapper::to_raw_key( const pair &in) { - return get_prefix(in.first) + in.second.to_str(); + return get_prefix(in.first) + shard_prefix + in.second.to_str(); } pair SnapMapper::to_raw( @@ -110,7 +110,7 @@ bool SnapMapper::is_mapping(const string &to_test) string SnapMapper::to_object_key(const hobject_t &hoid) { - return OBJECT_PREFIX + hoid.to_str(); + return OBJECT_PREFIX + shard_prefix + hoid.to_str(); } void SnapMapper::object_snaps::encode(bufferlist &bl) const diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index f0d0baa219082..5565e175bd120 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -115,10 +115,10 @@ private: static std::string get_prefix(snapid_t snap); - static std::string to_raw_key( + std::string to_raw_key( const std::pair &to_map); - static std::pair to_raw( + std::pair to_raw( const std::pair &to_map); static bool is_mapping(const std::string &to_test); @@ -150,17 +150,29 @@ private: ); public: + static string make_shard_prefix(shard_id_t shard) { + if (shard == ghobject_t::NO_SHARD) + return string(); + char buf[20]; + int r = snprintf(buf, sizeof(buf), ".%x", (int)shard); + assert(r < (int)sizeof(buf)); + return string(buf, r) + '_'; + } uint32_t mask_bits; const uint32_t match; string last_key_checked; const int64_t pool; + const shard_id_t shard; + const string shard_prefix; SnapMapper( MapCacher::StoreDriver *driver, uint32_t match, ///< [in] pgid uint32_t bits, ///< [in] current split bits - int64_t pool ///< [in] pool + int64_t pool, ///< [in] pool + shard_id_t shard ///< [in] shard ) - : backend(driver), mask_bits(bits), match(match), pool(pool) { + : backend(driver), mask_bits(bits), match(match), pool(pool), + shard(shard), shard_prefix(make_shard_prefix(shard)) { update_bits(mask_bits); } @@ -171,10 +183,16 @@ public: ) { assert(new_bits >= mask_bits); mask_bits = new_bits; - prefixes = hobject_t::get_prefixes( + set _prefixes = hobject_t::get_prefixes( mask_bits, match, pool); + prefixes.clear(); + for (set::iterator i = _prefixes.begin(); + i != _prefixes.end(); + ++i) { + prefixes.insert(shard_prefix + *i); + } } /// Update snaps for oid, empty new_snaps removes the mapping diff --git a/src/test/test_snap_mapper.cc b/src/test/test_snap_mapper.cc index eaf308cbb5f9f..04db762b1a900 100644 --- a/src/test/test_snap_mapper.cc +++ b/src/test/test_snap_mapper.cc @@ -453,7 +453,8 @@ public: uint32_t mask, uint32_t bits) : driver(driver), - mapper(new SnapMapper(driver, mask, bits, 0)), mask(mask), bits(bits), + mapper(new SnapMapper(driver, mask, bits, 0, 1)), + mask(mask), bits(bits), lock("lock") {} hobject_t random_hobject() { diff --git a/src/tools/ceph-filestore-dump.cc b/src/tools/ceph-filestore-dump.cc index b4220bae30727..60f4809500869 100644 --- a/src/tools/ceph-filestore-dump.cc +++ b/src/tools/ceph-filestore-dump.cc @@ -374,11 +374,13 @@ int get_log(ObjectStore *fs, coll_t coll, pg_t pgid, const pg_info_t &info, //Based on RemoveWQ::_process() void remove_coll(ObjectStore *store, const coll_t &coll) { + spg_t pg; + coll.is_pg_prefix(pg); OSDriver driver( store, coll_t(), OSD::make_snapmapper_oid()); - SnapMapper mapper(&driver, 0, 0, 0); + SnapMapper mapper(&driver, 0, 0, 0, pg.shard); vector objects; ghobject_t next; @@ -856,7 +858,9 @@ int get_object(ObjectStore *store, coll_t coll, bufferlist &bl) store, coll_t(), OSD::make_snapmapper_oid()); - SnapMapper mapper(&driver, 0, 0, 0); + spg_t pg; + coll.is_pg_prefix(pg); + SnapMapper mapper(&driver, 0, 0, 0, pg.shard); t->touch(coll, ob.hoid); -- 2.39.5