|
10 | 10 | #include "librbd/internal.h" |
11 | 11 | #include "librbd/io/AioCompletion.h" |
12 | 12 | #include "librbd/io/ImageDispatchSpec.h" |
| 13 | +#include "librbd/io/Utils.h" |
13 | 14 | #include "librbd/object_map/DiffRequest.h" |
14 | 15 | #include "include/rados/librados.hpp" |
15 | 16 | #include "include/interval_set.h" |
@@ -275,15 +276,15 @@ std::pair<uint64_t, uint64_t> DiffIterate<I>::calc_object_diff_range() { |
275 | 276 | if (first_period_off != last_period_off) { |
276 | 277 | // map only the tail of the first period and the front of the last |
277 | 278 | // period instead of the entire range for efficiency |
278 | | - Striper::file_to_extents(m_image_ctx.cct, &m_image_ctx.layout, |
279 | | - m_offset, first_period_off + period - m_offset, |
280 | | - 0, 0, &object_extents); |
281 | | - Striper::file_to_extents(m_image_ctx.cct, &m_image_ctx.layout, |
282 | | - last_period_off, m_offset + m_length - last_period_off, |
283 | | - 0, 0, &object_extents); |
| 279 | + io::util::area_to_object_extents(&m_image_ctx, m_offset, |
| 280 | + first_period_off + period - m_offset, |
| 281 | + io::ImageArea::DATA, 0, &object_extents); |
| 282 | + io::util::area_to_object_extents(&m_image_ctx, last_period_off, |
| 283 | + m_offset + m_length - last_period_off, |
| 284 | + io::ImageArea::DATA, 0, &object_extents); |
284 | 285 | } else { |
285 | | - Striper::file_to_extents(m_image_ctx.cct, &m_image_ctx.layout, m_offset, |
286 | | - m_length, 0, 0, &object_extents); |
| 286 | + io::util::area_to_object_extents(&m_image_ctx, m_offset, m_length, |
| 287 | + io::ImageArea::DATA, 0, &object_extents); |
287 | 288 | } |
288 | 289 | return {object_extents.front().object_no, object_extents.back().object_no + 1}; |
289 | 290 | } |
@@ -380,47 +381,43 @@ int DiffIterate<I>::execute() { |
380 | 381 | uint64_t read_len = std::min(period_off + period - off, left); |
381 | 382 |
|
382 | 383 | if (fast_diff_enabled) { |
383 | | - // map to extents |
384 | | - std::map<object_t,std::vector<ObjectExtent> > object_extents; |
385 | | - Striper::file_to_extents(cct, m_image_ctx.format_string, |
386 | | - &m_image_ctx.layout, off, read_len, 0, |
387 | | - object_extents, 0); |
| 384 | + // map to objects (there would be one extent per object) |
| 385 | + striper::LightweightObjectExtents object_extents; |
| 386 | + io::util::area_to_object_extents(&m_image_ctx, off, read_len, |
| 387 | + io::ImageArea::DATA, 0, &object_extents); |
388 | 388 |
|
389 | 389 | // get diff info for each object and merge adjacent stripe units |
390 | 390 | // into an aggregate (this also sorts them) |
391 | 391 | io::SparseExtents aggregate_sparse_extents; |
392 | | - for (auto& [object, extents] : object_extents) { |
393 | | - const uint64_t object_no = extents.front().objectno; |
394 | | - ceph_assert(object_no >= start_object_no && object_no < end_object_no); |
395 | | - uint8_t diff_state = object_diff_state[object_no - start_object_no]; |
396 | | - ldout(cct, 20) << "object " << object << ": diff_state=" |
397 | | - << (int)diff_state << dendl; |
| 392 | + for (const auto& oe : object_extents) { |
| 393 | + ceph_assert(oe.object_no >= start_object_no && |
| 394 | + oe.object_no < end_object_no); |
| 395 | + uint8_t diff_state = object_diff_state[oe.object_no - start_object_no]; |
| 396 | + ldout(cct, 20) << "object " |
| 397 | + << util::data_object_name(&m_image_ctx, oe.object_no) |
| 398 | + << ": diff_state=" << (int)diff_state << dendl; |
398 | 399 |
|
399 | 400 | if (diff_state == object_map::DIFF_STATE_HOLE && |
400 | 401 | from_snap_id == 0 && !parent_diff.empty()) { |
401 | 402 | // no data in child object -- report parent diff instead |
402 | | - for (auto& oe : extents) { |
403 | | - for (auto& be : oe.buffer_extents) { |
404 | | - interval_set<uint64_t> o; |
405 | | - o.insert(off + be.first, be.second); |
406 | | - o.intersection_of(parent_diff); |
407 | | - ldout(cct, 20) << " reporting parent overlap " << o << dendl; |
408 | | - for (auto e = o.begin(); e != o.end(); ++e) { |
409 | | - aggregate_sparse_extents.insert(e.get_start(), e.get_len(), |
410 | | - {io::SPARSE_EXTENT_STATE_DATA, |
411 | | - e.get_len()}); |
412 | | - } |
| 403 | + for (const auto& be : oe.buffer_extents) { |
| 404 | + interval_set<uint64_t> o; |
| 405 | + o.insert(off + be.first, be.second); |
| 406 | + o.intersection_of(parent_diff); |
| 407 | + ldout(cct, 20) << " reporting parent overlap " << o << dendl; |
| 408 | + for (auto e = o.begin(); e != o.end(); ++e) { |
| 409 | + aggregate_sparse_extents.insert(e.get_start(), e.get_len(), |
| 410 | + {io::SPARSE_EXTENT_STATE_DATA, |
| 411 | + e.get_len()}); |
413 | 412 | } |
414 | 413 | } |
415 | 414 | } else if (diff_state == object_map::DIFF_STATE_HOLE_UPDATED || |
416 | 415 | diff_state == object_map::DIFF_STATE_DATA_UPDATED) { |
417 | 416 | auto state = (diff_state == object_map::DIFF_STATE_HOLE_UPDATED ? |
418 | 417 | io::SPARSE_EXTENT_STATE_ZEROED : io::SPARSE_EXTENT_STATE_DATA); |
419 | | - for (auto& oe : extents) { |
420 | | - for (auto& be : oe.buffer_extents) { |
421 | | - aggregate_sparse_extents.insert(off + be.first, be.second, |
422 | | - {state, be.second}); |
423 | | - } |
| 418 | + for (const auto& be : oe.buffer_extents) { |
| 419 | + aggregate_sparse_extents.insert(off + be.first, be.second, |
| 420 | + {state, be.second}); |
424 | 421 | } |
425 | 422 | } |
426 | 423 | } |
|
0 commit comments