} else {
struct dirty_shard_t{
- string* key = nullptr;
+ uint32_t offset = 0;
bufferlist bl;
boost::intrusive::list_member_hook<> dirty_list_item;
};
p->shard_info->bytes = len;
p->shard_info->extents = nn;
- encoded_shards[pos].key = &p->key;
+ encoded_shards[pos].offset = p->offset;
dirty_shards.push_back(encoded_shards[pos]);
p->dirty = false;
}
}
//schedule DB update for dirty shards
auto it = dirty_shards.begin();
- while(it != dirty_shards.end()) {
- t->set(PREFIX_OBJ, *(it->key), it->bl);
+ while (it != dirty_shards.end()) {
+ string key;
+ get_extent_shard_key(onode->key, it->offset, &key);
+ t->set(PREFIX_OBJ, key, it->bl);
++it;
}
}
shards.resize(onode->onode.extent_map_shards.size());
unsigned i = 0;
for (auto &s : onode->onode.extent_map_shards) {
- get_extent_shard_key(onode->key, s.offset, &shards[i].key);
shards[i].offset = s.offset;
shards[i].shard_info = &s;
shards[i].loaded = loaded;
}
for (auto& s : o->extent_map.shards) {
dout(20) << __func__ << " shard " << *s.shard_info << dendl;
- expecting_shards.push_back(s.key);
+ expecting_shards.push_back(string());
+ get_extent_shard_key(o->key, s.offset, &expecting_shards.back());
}
// lextents
uint64_t pos = 0;
if (reshard) {
dout(20) << __func__ << " resharding extents for " << o->oid << dendl;
for (auto &s : o->extent_map.shards) {
- t->rmkey(PREFIX_OBJ, s.key);
+ string key;
+ get_extent_shard_key(o->key, s.offset, &key);
+ t->rmkey(PREFIX_OBJ, key);
}
o->extent_map.fault_range(db, 0, o->onode.size);
o->extent_map.reshard(min_alloc_size);
o->onode = bluestore_onode_t();
txc->removed(o);
for (auto &s : o->extent_map.shards) {
- txc->t->rmkey(PREFIX_OBJ, s.key);
+ string key;
+ get_extent_shard_key(o->key, s.offset, &key);
+ txc->t->rmkey(PREFIX_OBJ, key);
}
txc->t->rmkey(PREFIX_OBJ, o->key);
o->extent_map.clear();
oldo->extent_map.fault_range(db, 0, oldo->onode.size);
get_object_key(new_oid, &new_okey);
for (auto &s : oldo->extent_map.shards) {
- txc->t->rmkey(PREFIX_OBJ, s.key);
- get_extent_shard_key(new_okey, s.offset, &s.key);
+ string key;
+ get_extent_shard_key(oldo->key, s.offset, &key);
+ txc->t->rmkey(PREFIX_OBJ, key);
s.dirty = true;
}