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<ghobject_t> objects;
store->collection_list(tmp, objects);
// delete them.
- ObjectStore::Transaction t;
unsigned removed = 0;
for (vector<ghobject_t>::iterator p = objects.begin();
p != objects.end();
&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"),
string SnapMapper::to_raw_key(
const pair<snapid_t, hobject_t> &in)
{
- return get_prefix(in.first) + in.second.to_str();
+ return get_prefix(in.first) + shard_prefix + in.second.to_str();
}
pair<string, bufferlist> SnapMapper::to_raw(
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
static std::string get_prefix(snapid_t snap);
- static std::string to_raw_key(
+ std::string to_raw_key(
const std::pair<snapid_t, hobject_t> &to_map);
- static std::pair<std::string, bufferlist> to_raw(
+ std::pair<std::string, bufferlist> to_raw(
const std::pair<snapid_t, hobject_t> &to_map);
static bool is_mapping(const std::string &to_test);
);
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<std::string, bufferlist> *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);
}
) {
assert(new_bits >= mask_bits);
mask_bits = new_bits;
- prefixes = hobject_t::get_prefixes(
+ set<string> _prefixes = hobject_t::get_prefixes(
mask_bits,
match,
pool);
+ prefixes.clear();
+ for (set<string>::iterator i = _prefixes.begin();
+ i != _prefixes.end();
+ ++i) {
+ prefixes.insert(shard_prefix + *i);
+ }
}
/// Update snaps for oid, empty new_snaps removes the mapping
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() {
//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<ghobject_t> objects;
ghobject_t next;
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);