SnapshotDelta* assembled_image_snapshot_delta) {
for (auto& [key, object_extents] : object_snapshot_delta) {
for (auto& object_extent : object_extents) {
- Extents image_extents;
- io::util::extent_to_file(image_ctx, object_no, object_extent.get_off(),
- object_extent.get_len(), image_extents);
+ auto [image_extents, _] = io::util::object_to_area_extents(
+ image_ctx, object_no,
+ {{object_extent.get_off(), object_extent.get_len()}});
auto& intervals = (*image_snapshot_delta)[key];
auto& assembled_intervals = (*assembled_image_snapshot_delta)[key];
return;
}
- uint64_t image_size = ictx->get_effective_image_size(ictx->snap_id);
+ uint64_t data_size = ictx->get_area_size(ImageArea::DATA);
ictx->image_lock.unlock_shared();
- auto readahead_extent = ictx->readahead.update(image_extents, image_size);
+ auto readahead_extent = ictx->readahead.update(image_extents, data_size);
uint64_t readahead_offset = readahead_extent.first;
uint64_t readahead_length = readahead_extent.second;
ldout(ictx->cct, 20) << "(readahead logical) " << readahead_offset << "~"
<< readahead_length << dendl;
LightweightObjectExtents readahead_object_extents;
- io::util::file_to_extents(ictx, readahead_offset, readahead_length, 0,
- &readahead_object_extents);
+ io::util::area_to_object_extents(ictx, readahead_offset, readahead_length,
+ ImageArea::DATA, 0,
+ &readahead_object_extents);
for (auto& object_extent : readahead_object_extents) {
ldout(ictx->cct, 20) << "(readahead) "
<< data_object_name(ictx,
template <typename I>
void ImageRequest<I>::aio_read(I *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
ReadResult &&read_result, IOContext io_context,
int op_flags, int read_flags,
const ZTracer::Trace &parent_trace) {
- ImageReadRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageReadRequest<I> req(*ictx, c, std::move(image_extents), area,
std::move(read_result), io_context, op_flags,
read_flags, parent_trace);
req.send();
template <typename I>
void ImageRequest<I>::aio_write(I *ictx, AioCompletion *c,
- Extents &&image_extents, bufferlist &&bl,
- IOContext io_context, int op_flags,
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&bl, int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageWriteRequest<I> req(*ictx, c, std::move(image_extents), std::move(bl),
- io_context, op_flags, parent_trace);
+ ImageWriteRequest<I> req(*ictx, c, std::move(image_extents), area,
+ std::move(bl), op_flags, parent_trace);
req.send();
}
template <typename I>
void ImageRequest<I>::aio_discard(I *ictx, AioCompletion *c,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
uint32_t discard_granularity_bytes,
- IOContext io_context,
const ZTracer::Trace &parent_trace) {
- ImageDiscardRequest<I> req(*ictx, c, std::move(image_extents),
- discard_granularity_bytes, io_context,
- parent_trace);
+ ImageDiscardRequest<I> req(*ictx, c, std::move(image_extents), area,
+ discard_granularity_bytes, parent_trace);
req.send();
}
template <typename I>
void ImageRequest<I>::aio_writesame(I *ictx, AioCompletion *c,
- Extents &&image_extents,
- bufferlist &&bl, IOContext io_context,
- int op_flags,
+ Extents &&image_extents, ImageArea area,
+ bufferlist &&bl, int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageWriteSameRequest<I> req(*ictx, c, std::move(image_extents),
- std::move(bl), io_context, op_flags,
- parent_trace);
+ ImageWriteSameRequest<I> req(*ictx, c, std::move(image_extents), area,
+ std::move(bl), op_flags, parent_trace);
req.send();
}
template <typename I>
void ImageRequest<I>::aio_compare_and_write(I *ictx, AioCompletion *c,
Extents &&image_extents,
+ ImageArea area,
bufferlist &&cmp_bl,
bufferlist &&bl,
uint64_t *mismatch_offset,
- IOContext io_context, int op_flags,
+ int op_flags,
const ZTracer::Trace &parent_trace) {
- ImageCompareAndWriteRequest<I> req(*ictx, c, std::move(image_extents),
+ ImageCompareAndWriteRequest<I> req(*ictx, c, std::move(image_extents), area,
std::move(cmp_bl), std::move(bl),
- mismatch_offset, io_context, op_flags,
- parent_trace);
+ mismatch_offset, op_flags, parent_trace);
req.send();
}
template <typename I>
ImageReadRequest<I>::ImageReadRequest(I &image_ctx, AioCompletion *aio_comp,
- Extents &&image_extents,
+ Extents &&image_extents, ImageArea area,
ReadResult &&read_result,
IOContext io_context, int op_flags,
int read_flags,
const ZTracer::Trace &parent_trace)
- : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents),
- io_context, "read", parent_trace),
- m_op_flags(op_flags), m_read_flags(read_flags) {
+ : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents), area,
+ "read", parent_trace),
+ m_io_context(io_context), m_op_flags(op_flags), m_read_flags(read_flags) {
aio_comp->read_result = std::move(read_result);
}
CephContext *cct = image_ctx.cct;
auto &image_extents = this->m_image_extents;
- if (image_ctx.cache && image_ctx.readahead_max_bytes > 0 &&
+ if (this->m_image_area == ImageArea::DATA &&
+ image_ctx.cache && image_ctx.readahead_max_bytes > 0 &&
!(m_op_flags & LIBRADOS_OP_FLAG_FADVISE_RANDOM)) {
- readahead(get_image_ctx(&image_ctx), image_extents, this->m_io_context);
+ readahead(get_image_ctx(&image_ctx), image_extents, m_io_context);
}
// map image extents to object extents
continue;
}
- util::file_to_extents(&image_ctx, extent.first, extent.second, buffer_ofs,
- &object_extents);
+ util::area_to_object_extents(&image_ctx, extent.first, extent.second,
+ this->m_image_area, buffer_ofs,
+ &object_extents);
buffer_ofs += extent.second;
}
aio_comp, {{oe.offset, oe.length, std::move(oe.buffer_extents)}});
auto req = ObjectDispatchSpec::create_read(
&image_ctx, OBJECT_DISPATCH_LAYER_NONE, oe.object_no,
- &req_comp->extents, this->m_io_context, m_op_flags, m_read_flags,
+ &req_comp->extents, m_io_context, m_op_flags, m_read_flags,
this->m_trace, nullptr, req_comp);
req->send();
}
}
// map to object extents
- io::util::file_to_extents(&image_ctx, extent.first, extent.second, clip_len,
- &object_extents);
+ io::util::area_to_object_extents(&image_ctx, extent.first, extent.second,
+ this->m_image_area, clip_len,
+ &object_extents);
clip_len += extent.second;
}
if (ret == 1) {
this->m_image_extents.clear();
for (auto& object_extent : object_extents) {
- io::Extents image_extents;
- io::util::extent_to_file(&image_ctx, object_extent.object_no,
- object_extent.offset, object_extent.length,
- image_extents);
+ auto [image_extents, _] = io::util::object_to_area_extents(
+ &image_ctx, object_extent.object_no,
+ {{object_extent.offset, object_extent.length}});
this->m_image_extents.insert(this->m_image_extents.end(),
image_extents.begin(), image_extents.end());
}
journal_tid = append_journal_event(m_synchronous);
}
- send_object_requests(object_extents, this->m_io_context, journal_tid);
+ // it's very important that IOContext is captured here instead of
+ // e.g. at the API layer so that an up-to-date snap context is used
+ // when owning the exclusive lock
+ send_object_requests(object_extents, image_ctx.get_data_io_context(),
+ journal_tid);
}
update_stats(clip_len);
template <typename I>
ImageListSnapsRequest<I>::ImageListSnapsRequest(
I& image_ctx, AioCompletion* aio_comp, Extents&& image_extents,
- SnapIds&& snap_ids, int list_snaps_flags, SnapshotDelta* snapshot_delta,
- const ZTracer::Trace& parent_trace)
- : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents),
- image_ctx.get_data_io_context(), "list-snaps",
- parent_trace),
+ ImageArea area, SnapIds&& snap_ids, int list_snaps_flags,
+ SnapshotDelta* snapshot_delta, const ZTracer::Trace& parent_trace)
+ : ImageRequest<I>(image_ctx, aio_comp, std::move(image_extents), area,
+ "list-snaps", parent_trace),
m_snap_ids(std::move(snap_ids)), m_list_snaps_flags(list_snaps_flags),
m_snapshot_delta(snapshot_delta) {
}
}
striper::LightweightObjectExtents object_extents;
- io::util::file_to_extents(&image_ctx, image_extent.first,
- image_extent.second, 0, &object_extents);
+ io::util::area_to_object_extents(&image_ctx, image_extent.first,
+ image_extent.second, this->m_image_area, 0,
+ &object_extents);
for (auto& object_extent : object_extents) {
object_number_extents[object_extent.object_no].emplace_back(
object_extent.offset, object_extent.length);