bool BlueStore::ExtentMap::update(Onode *o, KeyValueDB::Transaction t,
bool force)
{
+ assert(!needs_reshard);
if (o->onode.extent_map_shards.empty()) {
if (inline_bl.length() == 0) {
unsigned n;
void BlueStore::ExtentMap::reshard(Onode *o, uint64_t min_alloc_size)
{
+ needs_reshard = false;
+
// un-span all blobs
auto p = spanning_blob_map.begin();
while (p != spanning_blob_map.end()) {
b->ref_map.get(offset, length);
Extent *le = new Extent(logical_offset, offset, length, blob_depth, b);
extent_map.insert(*le);
+ if (!needs_reshard && spans_shard(offset, length)) {
+ needs_reshard = true;
+ }
return le;
}
// finalize onodes
for (auto o : txc->onodes) {
// finalize extent_map shards
- bool reshard = o->extent_map.update(o.get(), t, false);
+ bool reshard = o->extent_map.needs_reshard;
+ if (!reshard) {
+ reshard = o->extent_map.update(o.get(), t, false);
+ }
if (reshard) {
dout(20) << __func__ << " resharding extents for " << o->oid << dendl;
for (auto &s : o->extent_map.shards) {
b->dirty_blob().calc_csum(b_off, padded);
dout(20) << __func__ << " lex old " << *ep << dendl;
Extent *le = o->extent_map.set_lextent(offset, b_off + head_pad, length,
- wctx->blob_depth, b, &wctx->old_extents);
+ wctx->blob_depth, b,
+ &wctx->old_extents);
b->dirty_blob().mark_used(le->blob_offset, le->length);
txc->statfs_delta.stored() += le->length;
dout(20) << __func__ << " lex " << *le << dendl;
bufferlist inline_bl; ///< cached encoded map, if unsharded; empty=>dirty
+ bool needs_reshard = false; ///< true if we must reshard
+
ExtentMap(Onode *o);
~ExtentMap() {
extent_map.clear_and_dispose([&](Extent *e) { delete e; });
return -1; // not found
}
+ /// check if a range spans a shard
+ bool spans_shard(uint32_t offset, uint32_t length) {
+ if (shards.empty()) {
+ return false;
+ }
+ int s = seek_shard(offset);
+ assert(s >= 0);
+ if (s == shards.size() - 1) {
+ return false; // last shard
+ }
+ if (offset + length <= shards[s+1].offset) {
+ return false;
+ }
+ return true;
+ }
+
/// ensure that a range of the map is loaded
void fault_range(KeyValueDB *db,
uint32_t offset, uint32_t length);