if (it->blob_end() <= mapmust_end) continue;
}
return it;
- break;
};
return map.end();
}
return blob;
}
+inline void BlueStore::Writer::_place_extent_in_blob(
+ Extent* ex,
+ uint32_t map_begin,
+ uint32_t map_end,
+ uint32_t in_blob_offset)
+{
+ if (ex->logical_end() <= map_begin) {
+ // we are adding to right side of the target
+ if (ex->logical_end() == map_begin) {
+ // we can just expand existing Extent
+ ex->length += map_end - map_begin;
+ dout(20) << __func__ << " expanded extent " << ex->print(pp_mode) << dendl;
+ } else {
+ // disjointed, new extent needed
+ Extent *le = new Extent(
+ map_begin, in_blob_offset, map_end - map_begin, ex->blob);
+ dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
+ onode->extent_map.extent_map.insert(*le);
+ }
+ } else if (ex->logical_offset >= map_end) {
+ // we are adding to left side of target
+ if (ex->logical_offset == map_end) {
+ // we can just expand existing Extent
+ //ceph_assert(ref_end == want_subau_end);
+ ex->logical_offset -= (map_end - map_begin);
+ ex->blob_offset -= (map_end - map_begin);
+ ex->length += (map_end - map_begin);
+ dout(20) << __func__ << " expanded extent " << ex->print(pp_mode) << dendl;
+ } else {
+ // disjointed, new extent needed
+ Extent *le = new Extent(
+ map_begin, in_blob_offset, map_end - map_begin, ex->blob);
+ dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
+ onode->extent_map.extent_map.insert(*le);
+ }
+ }
+}
+
/**
* Note from developer
* This module tries to keep naming convention:
uint32_t ref_end = std::min(ref_end_offset, want_subau_end);
//fixme/improve - need something without stupid extras - that is without coll
b->get_ref(onode->c, in_blob_offset, ref_end - want_subau_begin);
- Extent *le = new Extent(
- want_subau_begin, in_blob_offset, ref_end - want_subau_begin, it->blob);
- dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
- emap.extent_map.insert(*le);
-
+ _place_extent_in_blob(&*it, want_subau_begin, ref_end, in_blob_offset);
logical_offset += data_size;
break;
}
uint32_t ref_end = std::min(ref_end_offset, want_subau_end);
//fixme/improve - need something without stupid extras - that is without coll
b->get_ref(onode->c, in_blob_offset, ref_end - want_subau_begin);
- Extent *le = new Extent(
- want_subau_begin, in_blob_offset, ref_end - want_subau_begin, it->blob);
- dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
- emap.extent_map.insert(*le);
-
+ _place_extent_in_blob(&*it, want_subau_begin, ref_end, in_blob_offset);
end_offset -= data_size;
break;
}
uint32_t ref_end = std::min(ref_end_offset, data_end_offset);
//fixme/improve - need something without stupid extras - that is without coll
left_b->blob->get_ref(coll, in_blob_offset, ref_end - logical_offset);
- Extent *le = new Extent(
- logical_offset, in_blob_offset, ref_end - logical_offset, left_b->blob);
- dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
- emap.insert(*le);
+ _place_extent_in_blob(&*left_b, logical_offset, ref_end, in_blob_offset);
+ bstore->logger->inc(l_bluestore_write_small);
+ bstore->logger->inc(l_bluestore_write_small_bytes, ref_end - logical_offset);
logical_offset = ref_end;
++bd_it;
- bstore->logger->inc(l_bluestore_write_small);
- bstore->logger->inc(l_bluestore_write_small_bytes, le->length);
} else {
// it is still possible to use first bd and put it into
// blob after punch_hole
uint32_t ref_end = std::min(ref_end_offset, data_begin_offset + back_it->disk_data.length());
//fixme - need something without stupid extras
right_b->blob->get_ref(coll, in_blob_offset, ref_end - data_begin_offset);
- Extent *le = new Extent(
- data_begin_offset, in_blob_offset, ref_end - data_begin_offset, right_b->blob);
- dout(20) << __func__ << " new extent " << le->print(pp_mode) << dendl;
- emap.insert(*le);
+ _place_extent_in_blob(&*right_b, data_begin_offset, ref_end, in_blob_offset);
bd.erase(back_it); //TODO - or other way of limiting end
bstore->logger->inc(l_bluestore_write_small);
- bstore->logger->inc(l_bluestore_write_small_bytes, le->length);
+ bstore->logger->inc(l_bluestore_write_small_bytes, ref_end - data_begin_offset);
}
}
}
_collect_released_allocated();
// update statfs
txc->statfs_delta += statfs_delta;
- onode->extent_map.compress_extent_map(location, data_end - location);
onode->extent_map.dirty_range(location, data_end-location);
onode->extent_map.maybe_reshard(location, data_end);
+ // note: compress extent is not needed; _try_reuse_allocated_* joins extents if possible
+ // in other cases new blobs cannot be joined with existing ones
dout(25) << "result: " << std::endl << onode->print(pp_mode) << dendl;
}