Home | History | Annotate | Download | only in payload_generator

Lines Matching refs:extent

35 bool ExtentRanges::ExtentsOverlapOrTouch(const Extent& a, const Extent& b) {
47 bool ExtentRanges::ExtentsOverlap(const Extent& a, const Extent& b) {
69 Extent UnionOverlappingExtents(const Extent& first, const Extent& second) {
80 void ExtentRanges::AddExtent(Extent extent) {
81 if (extent.start_block() == kSparseHole || extent.num_blocks() == 0)
89 if (ExtentsOverlapOrTouch(*it, extent)) {
96 extent = UnionOverlappingExtents(extent, *it);
100 extent_set_.insert(extent);
102 blocks_ += extent.num_blocks();
107 ExtentRanges::ExtentSet SubtractOverlappingExtents(const Extent& base,
108 const Extent& subtractee) {
123 void ExtentRanges::SubtractExtent(const Extent& extent) {
124 if (extent.start_block() == kSparseHole || extent.num_blocks() == 0)
133 if (!ExtentsOverlap(*it, extent))
143 ExtentSet subtraction = SubtractOverlappingExtents(*it, extent);
169 void ExtentRanges::AddExtents(const vector<Extent>& extents) {
170 for (vector<Extent>::const_iterator it = extents.begin(), e = extents.end();
176 void ExtentRanges::SubtractExtents(const vector<Extent>& extents) {
177 for (vector<Extent>::const_iterator it = extents.begin(), e = extents.end();
184 const ::google::protobuf::RepeatedPtrField<Extent> &exts) {
191 const ::google::protobuf::RepeatedPtrField<Extent> &exts) {
199 // The block could be on the extent before the one in |lower|.
202 // Any extent starting at block+1 or later is not interesting, so this is the
223 Extent ExtentForRange(uint64_t start_block, uint64_t num_blocks) {
224 Extent ret;
230 vector<Extent> ExtentRanges::GetExtentsForBlockCount(
232 vector<Extent> out;
241 const Extent& extent = *it;
242 out.push_back(extent);
243 out_blocks += extent.num_blocks();
244 if (extent.num_blocks() < blocks_needed)
246 if (extent.num_blocks() == blocks_needed)
248 // If we get here, we just added the last extent needed, but it's too big
249 out_blocks -= extent.num_blocks();
258 vector<Extent> FilterExtentRanges(const vector<Extent>& extents,
260 vector<Extent> result;
262 for (Extent extent : extents) {
264 // Extents in the ExtentSet possibly overlapping the current |extent|. This
265 // is achieved by looking from the extent whose start_block is *lower* than
266 // the extent.start_block() up to the greatest extent whose start_block is
267 // lower than extent.start_block() + extent.num_blocks().
268 auto lower = extent_set.lower_bound(extent);
269 // We need to decrement the lower_bound to look at the extent that could
270 // overlap the beginning of the current |extent|.
274 ExtentForRange(extent.start_block() + extent.num_blocks(), 0));
276 if (!ExtentRanges::ExtentsOverlap(extent, *iter))
278 if (iter->start_block() <= extent.start_block()) {
279 // We need to cut blocks from the beginning of the |extent|.
281 extent.start_block();
282 if (cut_blocks >= extent.num_blocks()) {
283 extent.set_num_blocks(0);
286 extent = ExtentForRange(extent.start_block() + cut_blocks,
287 extent.num_blocks() - cut_blocks);
289 // We need to cut blocks on the middle of the extent, possible up to the
292 ExtentForRange(extent.start_block(),
293 iter->start_block() - extent.start_block()));
295 uint64_t old_end = extent.start_block() + extent.num_blocks();
297 extent.set_num_blocks(0);
300 extent = ExtentForRange(new_start, old_end - new_start);
303 if (extent.num_blocks() > 0)
304 result.push_back(extent);