return true;
}
-int BlueStore::ExtentMap::compress_extent_map()
+int BlueStore::ExtentMap::compress_extent_map(uint64_t offset, uint64_t length)
{
if (extent_map.empty())
return 0;
int removed = 0;
- auto p = extent_map.begin();
+ auto p = seek_lextent(offset);
+ if (p != extent_map.begin()) {
+ --p; // start to the left of offset
+ }
auto n = p;
for (++n; n != extent_map.end(); p = n++) {
+ if (n->logical_offset > offset + length) {
+ break; // stop after end
+ }
while (n != extent_map.end() &&
p->logical_offset + p->length == n->logical_offset &&
p->blob == n->blob &&
}
}
}
-
- o->extent_map.compress_extent_map();
}
int BlueStore::_do_write(
_wctx_finish(txc, c, o, &wctx);
+ o->extent_map.compress_extent_map(offset, length);
+
o->extent_map.dirty_range(txc->t, offset, length);
if (end > o->onode.size) {
bool has_any_lextents(uint64_t offset, uint64_t length);
/// consolidate adjacent lextents in extent_map
- int compress_extent_map();
+ int compress_extent_map(uint64_t offset, uint64_t length);
/// punch a logical hole. add lextents to deref to target list.
void punch_hole(uint64_t offset, uint64_t length,