Skip to content

Commit 314971d

Browse files
authored
Merge pull request ceph#58201 from idryomov/wip-66570
librbd: make diff-iterate in fast-diff mode aware of encryption Reviewed-by: Ramana Raja <[email protected]>
2 parents 92f82d6 + cdeb0ef commit 314971d

File tree

2 files changed

+545
-377
lines changed

2 files changed

+545
-377
lines changed

src/librbd/api/DiffIterate.cc

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "librbd/internal.h"
1111
#include "librbd/io/AioCompletion.h"
1212
#include "librbd/io/ImageDispatchSpec.h"
13+
#include "librbd/io/Utils.h"
1314
#include "librbd/object_map/DiffRequest.h"
1415
#include "include/rados/librados.hpp"
1516
#include "include/interval_set.h"
@@ -275,15 +276,15 @@ std::pair<uint64_t, uint64_t> DiffIterate<I>::calc_object_diff_range() {
275276
if (first_period_off != last_period_off) {
276277
// map only the tail of the first period and the front of the last
277278
// 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);
284285
} 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);
287288
}
288289
return {object_extents.front().object_no, object_extents.back().object_no + 1};
289290
}
@@ -380,47 +381,43 @@ int DiffIterate<I>::execute() {
380381
uint64_t read_len = std::min(period_off + period - off, left);
381382

382383
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);
388388

389389
// get diff info for each object and merge adjacent stripe units
390390
// into an aggregate (this also sorts them)
391391
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;
398399

399400
if (diff_state == object_map::DIFF_STATE_HOLE &&
400401
from_snap_id == 0 && !parent_diff.empty()) {
401402
// 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()});
413412
}
414413
}
415414
} else if (diff_state == object_map::DIFF_STATE_HOLE_UPDATED ||
416415
diff_state == object_map::DIFF_STATE_DATA_UPDATED) {
417416
auto state = (diff_state == object_map::DIFF_STATE_HOLE_UPDATED ?
418417
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});
424421
}
425422
}
426423
}

0 commit comments

Comments
 (0)