#include "librbd/cache/ObjectCacherWriteback.h"
#include "librbd/io/ObjectDispatchSpec.h"
#include "librbd/io/ObjectDispatcher.h"
+#include "librbd/io/Types.h"
#include "librbd/io/Utils.h"
#include "osd/osd_types.h"
#include "osdc/WritebackHandler.h"
template <typename I>
bool ObjectCacherObjectDispatch<I>::write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
<< object_len << dendl;
// ObjectCacher doesn't support write-same so convert to regular write
- ObjectExtent extent(data_object_name(m_image_ctx, object_no), object_no,
- object_off, object_len, 0);
+ io::LightweightObjectExtent extent(object_no, object_off, object_len, 0);
extent.buffer_extents = std::move(buffer_extents);
bufferlist ws_data;
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
template <typename I>
bool WriteAroundObjectDispatch<I>::write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
namespace librbd {
namespace io {
+using librbd::util::data_object_name;
using librbd::util::get_image_ctx;
namespace {
template <typename I>
struct C_RBD_Readahead : public Context {
I *ictx;
- object_t oid;
+ uint64_t object_no;
uint64_t offset;
uint64_t length;
bufferlist read_data;
io::ExtentMap extent_map;
- C_RBD_Readahead(I *ictx, object_t oid, uint64_t offset, uint64_t length)
- : ictx(ictx), oid(oid), offset(offset), length(length) {
+ C_RBD_Readahead(I *ictx, uint64_t object_no, uint64_t offset, uint64_t length)
+ : ictx(ictx), object_no(object_no), offset(offset), length(length) {
ictx->readahead.inc_pending();
}
void finish(int r) override {
- ldout(ictx->cct, 20) << "C_RBD_Readahead on " << oid << ": "
+ ldout(ictx->cct, 20) << "C_RBD_Readahead on "
+ << data_object_name(ictx, object_no) << ": "
<< offset << "~" << length << dendl;
ictx->readahead.dec_pending();
}
if (readahead_length > 0) {
ldout(ictx->cct, 20) << "(readahead logical) " << readahead_offset << "~"
<< readahead_length << dendl;
- std::map<object_t, std::vector<ObjectExtent> > readahead_object_extents;
- Striper::file_to_extents(ictx->cct, ictx->format_string, &ictx->layout,
- readahead_offset, readahead_length, 0,
- readahead_object_extents);
- for (auto& readahead_object_extent : readahead_object_extents) {
- for (auto& object_extent : readahead_object_extent.second) {
- ldout(ictx->cct, 20) << "(readahead) oid " << object_extent.oid << " "
- << object_extent.offset << "~"
- << object_extent.length << dendl;
-
- auto req_comp = new C_RBD_Readahead<I>(ictx, object_extent.oid,
- object_extent.offset,
- object_extent.length);
- auto req = io::ObjectDispatchSpec::create_read(
- ictx, io::OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
- object_extent.offset, object_extent.length, snap_id, 0, {},
- &req_comp->read_data, &req_comp->extent_map, req_comp);
- req->send();
- }
+ LightweightObjectExtents readahead_object_extents;
+ Striper::file_to_extents(ictx->cct, &ictx->layout,
+ readahead_offset, readahead_length, 0, 0,
+ &readahead_object_extents);
+ for (auto& object_extent : readahead_object_extents) {
+ ldout(ictx->cct, 20) << "(readahead) "
+ << data_object_name(ictx,
+ object_extent.object_no) << " "
+ << object_extent.offset << "~"
+ << object_extent.length << dendl;
+
+ auto req_comp = new C_RBD_Readahead<I>(ictx, object_extent.object_no,
+ object_extent.offset,
+ object_extent.length);
+ auto req = io::ObjectDispatchSpec::create_read(
+ ictx, io::OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
+ object_extent.offset, object_extent.length, snap_id, 0, {},
+ &req_comp->read_data, &req_comp->extent_map, req_comp);
+ req->send();
}
ictx->perfcounter->inc(l_librbd_readahead);
readahead(get_image_ctx(&image_ctx), image_extents);
}
- AioCompletion *aio_comp = this->m_aio_comp;
librados::snap_t snap_id;
- map<object_t,vector<ObjectExtent> > object_extents;
uint64_t buffer_ofs = 0;
{
// prevent image size from changing between computing clip and recording
// pending async operation
RWLock::RLocker image_locker(image_ctx.image_lock);
snap_id = image_ctx.snap_id;
+ }
- // map image extents to object extents
- for (auto &extent : image_extents) {
- if (extent.second == 0) {
- continue;
- }
-
- Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout,
- extent.first, extent.second, 0, object_extents,
- buffer_ofs);
- buffer_ofs += extent.second;
+ // map image extents to object extents
+ LightweightObjectExtents object_extents;
+ for (auto &extent : image_extents) {
+ if (extent.second == 0) {
+ continue;
}
- }
- // pre-calculate the expected number of read requests
- uint32_t request_count = 0;
- for (auto &object_extent : object_extents) {
- request_count += object_extent.second.size();
+ Striper::file_to_extents(cct, &image_ctx.layout, extent.first,
+ extent.second, 0, buffer_ofs, &object_extents);
+ buffer_ofs += extent.second;
}
- aio_comp->set_request_count(request_count);
// issue the requests
- for (auto &object_extent : object_extents) {
- for (auto &extent : object_extent.second) {
- ldout(cct, 20) << "oid " << extent.oid << " " << extent.offset << "~"
- << extent.length << " from " << extent.buffer_extents
- << dendl;
-
- auto req_comp = new io::ReadResult::C_ObjectReadRequest(
- aio_comp, extent.offset, extent.length,
- std::move(extent.buffer_extents));
- auto req = ObjectDispatchSpec::create_read(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, extent.objectno, extent.offset,
- extent.length, snap_id, m_op_flags, this->m_trace, &req_comp->bl,
- &req_comp->extent_map, req_comp);
- req->send();
- }
+ AioCompletion *aio_comp = this->m_aio_comp;
+ aio_comp->set_request_count(object_extents.size());
+ for (auto &oe : object_extents) {
+ ldout(cct, 20) << data_object_name(&image_ctx, oe.object_no) << " "
+ << oe.offset << "~" << oe.length << " from "
+ << oe.buffer_extents << dendl;
+
+ auto req_comp = new io::ReadResult::C_ObjectReadRequest(
+ 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, oe.offset,
+ oe.length, snap_id, m_op_flags, this->m_trace, &req_comp->bl,
+ &req_comp->extent_map, req_comp);
+ req->send();
}
image_ctx.perfcounter->inc(l_librbd_rd);
bool journaling = false;
AioCompletion *aio_comp = this->m_aio_comp;
- uint64_t clip_len = 0;
- ObjectExtents object_extents;
::SnapContext snapc;
{
// prevent image size from changing between computing clip and recording
return;
}
- for (auto &extent : this->m_image_extents) {
- if (extent.second == 0) {
- continue;
- }
-
- // map to object extents
- Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout,
- extent.first, extent.second, 0, object_extents);
- clip_len += extent.second;
- }
-
snapc = image_ctx.snapc;
journaling = (image_ctx.journal != nullptr &&
image_ctx.journal->is_journal_appending());
}
+ uint64_t clip_len = 0;
+ LightweightObjectExtents object_extents;
+ for (auto &extent : this->m_image_extents) {
+ if (extent.second == 0) {
+ continue;
+ }
+
+ // map to object extents
+ Striper::file_to_extents(cct, &image_ctx.layout, extent.first,
+ extent.second, 0, clip_len, &object_extents);
+ clip_len += extent.second;
+ }
+
int ret = prune_object_extents(&object_extents);
if (ret < 0) {
aio_comp->fail(ret);
return;
}
+ aio_comp->set_request_count(object_extents.size());
if (!object_extents.empty()) {
uint64_t journal_tid = 0;
if (journaling) {
journal_tid = append_journal_event(m_synchronous);
}
- aio_comp->set_request_count(object_extents.size());
send_object_requests(object_extents, snapc, journal_tid);
- } else {
- // no IO to perform -- fire completion
- aio_comp->set_request_count(0);
}
update_stats(clip_len);
template <typename I>
void AbstractImageWriteRequest<I>::send_object_requests(
- const ObjectExtents &object_extents, const ::SnapContext &snapc,
+ const LightweightObjectExtents &object_extents, const ::SnapContext &snapc,
uint64_t journal_tid) {
I &image_ctx = this->m_image_ctx;
CephContext *cct = image_ctx.cct;
AioCompletion *aio_comp = this->m_aio_comp;
- for (ObjectExtents::const_iterator p = object_extents.begin();
- p != object_extents.end(); ++p) {
- ldout(cct, 20) << "oid " << p->oid << " " << p->offset << "~" << p->length
- << " from " << p->buffer_extents << dendl;
+ for (auto& oe : object_extents) {
+ ldout(cct, 20) << data_object_name(&image_ctx, oe.object_no) << " "
+ << oe.offset << "~" << oe.length << " from "
+ << oe.buffer_extents << dendl;
C_AioRequest *req_comp = new C_AioRequest(aio_comp);
- auto request = create_object_request(*p, snapc, journal_tid, req_comp);
+ auto request = create_object_request(oe, snapc, journal_tid, req_comp);
// if journaling, stash the request for later; otherwise send
if (request != NULL) {
}
template <typename I>
-void ImageWriteRequest<I>::assemble_extent(const ObjectExtent &object_extent,
- bufferlist *bl) {
+void ImageWriteRequest<I>::assemble_extent(
+ const LightweightObjectExtent &object_extent, bufferlist *bl) {
for (auto q = object_extent.buffer_extents.begin();
q != object_extent.buffer_extents.end(); ++q) {
bufferlist sub_bl;
template <typename I>
ObjectDispatchSpec *ImageWriteRequest<I>::create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) {
I &image_ctx = this->m_image_ctx;
bufferlist bl;
assemble_extent(object_extent, &bl);
auto req = ObjectDispatchSpec::create_write(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
+ &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
object_extent.offset, std::move(bl), snapc, m_op_flags, journal_tid,
this->m_trace, on_finish);
return req;
template <typename I>
ObjectDispatchSpec *ImageDiscardRequest<I>::create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) {
I &image_ctx = this->m_image_ctx;
auto req = ObjectDispatchSpec::create_discard(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
+ &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
object_extent.offset, object_extent.length, snapc,
OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, journal_tid, this->m_trace,
on_finish);
template <typename I>
int ImageDiscardRequest<I>::prune_object_extents(
- ObjectExtents* object_extents) const {
+ LightweightObjectExtents* object_extents) const {
if (m_discard_granularity_bytes == 0) {
return 0;
}
object_size);
auto xform_lambda =
[discard_granularity_bytes, object_size, &prune_required]
- (ObjectExtent& object_extent) {
+ (LightweightObjectExtent& object_extent) {
auto& offset = object_extent.offset;
auto& length = object_extent.length;
auto next_offset = offset + length;
if (prune_required) {
// one or more object extents were skipped
auto remove_lambda =
- [](const ObjectExtent& object_extent) {
+ [](const LightweightObjectExtent& object_extent) {
return (object_extent.length == 0);
};
object_extents->erase(
template <typename I>
ObjectDispatchSpec *ImageWriteSameRequest<I>::create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) {
I &image_ctx = this->m_image_ctx;
ObjectDispatchSpec *req;
if (util::assemble_write_same_extent(object_extent, m_data_bl, &bl, false)) {
- Extents buffer_extents{object_extent.buffer_extents};
+ auto buffer_extents{object_extent.buffer_extents};
req = ObjectDispatchSpec::create_write_same(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
+ &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
object_extent.offset, object_extent.length, std::move(buffer_extents),
std::move(bl), snapc, m_op_flags, journal_tid,
this->m_trace, on_finish);
return req;
}
req = ObjectDispatchSpec::create_write(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
+ &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
object_extent.offset, std::move(bl), snapc, m_op_flags, journal_tid,
this->m_trace, on_finish);
return req;
template <typename I>
void ImageCompareAndWriteRequest<I>::assemble_extent(
- const ObjectExtent &object_extent, bufferlist *bl) {
+ const LightweightObjectExtent &object_extent, bufferlist *bl) {
for (auto q = object_extent.buffer_extents.begin();
q != object_extent.buffer_extents.end(); ++q) {
bufferlist sub_bl;
template <typename I>
ObjectDispatchSpec *ImageCompareAndWriteRequest<I>::create_object_request(
- const ObjectExtent &object_extent,
+ const LightweightObjectExtent &object_extent,
const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) {
I &image_ctx = this->m_image_ctx;
bufferlist bl;
assemble_extent(object_extent, &bl);
auto req = ObjectDispatchSpec::create_compare_and_write(
- &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno,
+ &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
object_extent.offset, std::move(m_cmp_bl), std::move(bl), snapc,
m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish);
return req;
template <typename I>
int ImageCompareAndWriteRequest<I>::prune_object_extents(
- ObjectExtents* object_extents) const {
+ LightweightObjectExtents* object_extents) const {
if (object_extents->size() > 1)
return -EINVAL;
I &image_ctx = this->m_image_ctx;
uint64_t sector_size = 512ULL;
uint64_t su = image_ctx.layout.stripe_unit;
- ObjectExtent object_extent = object_extents->front();
+ auto& object_extent = object_extents->front();
if (object_extent.offset % sector_size + object_extent.length > sector_size ||
(su != 0 && (object_extent.offset % su + object_extent.length > su)))
return -EINVAL;
using typename ImageRequest<ImageCtxT>::ObjectRequests;
using typename ImageRequest<ImageCtxT>::Extents;
- typedef std::vector<ObjectExtent> ObjectExtents;
-
AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents &&image_extents, const char *trace_name,
const ZTracer::Trace &parent_trace)
void send_request() override;
- virtual int prune_object_extents(ObjectExtents* object_extents) const {
+ virtual int prune_object_extents(
+ LightweightObjectExtents* object_extents) const {
return 0;
}
- void send_object_requests(const ObjectExtents &object_extents,
+ void send_object_requests(const LightweightObjectExtents &object_extents,
const ::SnapContext &snapc, uint64_t journal_tid);
virtual ObjectDispatchSpec *create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) = 0;
virtual uint64_t append_journal_event(bool synchronous) = 0;
protected:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- using typename AbstractImageWriteRequest<ImageCtxT>::ObjectExtents;
aio_type_t get_aio_type() const override {
return AIO_TYPE_WRITE;
return "aio_write";
}
- void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl);
+ void assemble_extent(const LightweightObjectExtent &object_extent,
+ bufferlist *bl);
void send_image_cache_request() override;
ObjectDispatchSpec *create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
protected:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- using typename AbstractImageWriteRequest<ImageCtxT>::ObjectExtents;
aio_type_t get_aio_type() const override {
return AIO_TYPE_DISCARD;
void send_image_cache_request() override;
ObjectDispatchSpec *create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
void update_stats(size_t length) override;
- int prune_object_extents(ObjectExtents* object_extents) const override;
+ int prune_object_extents(
+ LightweightObjectExtents* object_extents) const override;
private:
uint32_t m_discard_granularity_bytes;
protected:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- using typename AbstractImageWriteRequest<ImageCtxT>::ObjectExtents;
aio_type_t get_aio_type() const override {
return AIO_TYPE_WRITESAME;
void send_image_cache_request() override;
ObjectDispatchSpec *create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
class ImageCompareAndWriteRequest : public AbstractImageWriteRequest<ImageCtxT> {
public:
using typename ImageRequest<ImageCtxT>::ObjectRequests;
- using typename AbstractImageWriteRequest<ImageCtxT>::ObjectExtents;
ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp,
Extents &&image_extents, bufferlist &&cmp_bl,
protected:
void send_image_cache_request() override;
- void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl);
+ void assemble_extent(const LightweightObjectExtent &object_extent,
+ bufferlist *bl);
ObjectDispatchSpec *create_object_request(
- const ObjectExtent &object_extent, const ::SnapContext &snapc,
+ const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
uint64_t journal_tid, Context *on_finish) override;
uint64_t append_journal_event(bool synchronous) override;
return "aio_compare_and_write";
}
- int prune_object_extents(ObjectExtents* object_extents) const override;
+ int prune_object_extents(
+ LightweightObjectExtents* object_extents) const override;
private:
bufferlist m_cmp_bl;
template <typename I>
bool ObjectDispatch<I>::write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, DispatchResult* dispatch_result,
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, DispatchResult* dispatch_result,
virtual bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, DispatchResult* dispatch_result,
struct WriteSameRequest : public WriteRequestBase {
uint64_t object_len;
- Extents buffer_extents;
+ LightweightBufferExtents buffer_extents;
ceph::bufferlist data;
WriteSameRequest(uint64_t object_no, uint64_t object_off,
- uint64_t object_len, Extents&& buffer_extents,
+ uint64_t object_len,
+ LightweightBufferExtents&& buffer_extents,
ceph::bufferlist&& data, const ::SnapContext& snapc,
uint64_t journal_tid)
: WriteRequestBase(object_no, object_off, snapc, journal_tid),
static ObjectDispatchSpec* create_write_same(
ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags, uint64_t journal_tid,
const ZTracer::Trace &parent_trace, Context *on_finish) {
return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
ReadResult::C_ObjectReadRequest::C_ObjectReadRequest(
AioCompletion *aio_completion, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents)
+ LightweightBufferExtents&& buffer_extents)
: aio_completion(aio_completion), object_off(object_off),
object_len(object_len), buffer_extents(std::move(buffer_extents)) {
aio_completion->add_request();
AioCompletion *aio_completion;
uint64_t object_off;
uint64_t object_len;
- Extents buffer_extents;
+ LightweightBufferExtents buffer_extents;
bufferlist bl;
ExtentMap extent_map;
C_ObjectReadRequest(AioCompletion *aio_completion, uint64_t object_off,
- uint64_t object_len, Extents&& buffer_extents);
+ uint64_t object_len,
+ LightweightBufferExtents&& buffer_extents);
void finish(int r) override;
};
}
});
- auto req = io::ObjectDispatchSpec::create_write(
- image_ctx, io::OBJECT_DISPATCH_LAYER_SCHEDULER,
+ auto req = ObjectDispatchSpec::create_write(
+ image_ctx, OBJECT_DISPATCH_LAYER_SCHEDULER,
m_object_no, offset, std::move(merged_requests.data), m_snapc,
m_op_flags, 0, {}, ctx);
bool SimpleSchedulerObjectDispatch<I>::read(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
- ceph::bufferlist* read_data, io::ExtentMap* extent_map,
- int* object_dispatch_flags, io::DispatchResult* dispatch_result,
+ ceph::bufferlist* read_data, ExtentMap* extent_map,
+ int* object_dispatch_flags, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
uint64_t object_no, uint64_t object_off, uint64_t object_len,
const ::SnapContext &snapc, int discard_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
Mutex::Locker locker(m_lock);
if (try_delay_write(object_no, object_off, std::move(data), snapc, op_flags,
*object_dispatch_flags, on_dispatched)) {
- *dispatch_result = io::DISPATCH_RESULT_COMPLETE;
+ *dispatch_result = DISPATCH_RESULT_COMPLETE;
return true;
}
template <typename I>
bool SimpleSchedulerObjectDispatch<I>::write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
int* object_dispatch_flags, uint64_t* journal_tid,
- io::DispatchResult* dispatch_result, Context** on_finish,
+ DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " "
template <typename I>
bool SimpleSchedulerObjectDispatch<I>::flush(
- io::FlushSource flush_source, const ZTracer::Trace &parent_trace,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ FlushSource flush_source, const ZTracer::Trace &parent_trace,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) {
auto cct = m_image_ctx->cct;
ldout(cct, 20) << dendl;
* Simple scheduler plugin for object dispatcher layer.
*/
template <typename ImageCtxT = ImageCtx>
-class SimpleSchedulerObjectDispatch : public io::ObjectDispatchInterface {
+class SimpleSchedulerObjectDispatch : public ObjectDispatchInterface {
private:
// mock unit testing support
typedef ::librbd::io::TypeTraits<ImageCtxT> TypeTraits;
SimpleSchedulerObjectDispatch(ImageCtxT* image_ctx);
~SimpleSchedulerObjectDispatch() override;
- io::ObjectDispatchLayer get_object_dispatch_layer() const override {
- return io::OBJECT_DISPATCH_LAYER_SCHEDULER;
+ ObjectDispatchLayer get_object_dispatch_layer() const override {
+ return OBJECT_DISPATCH_LAYER_SCHEDULER;
}
void init();
uint64_t object_no, uint64_t object_off, uint64_t object_len,
librados::snap_t snap_id, int op_flags,
const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
- io::ExtentMap* extent_map, int* object_dispatch_flags,
- io::DispatchResult* dispatch_result, Context** on_finish,
+ ExtentMap* extent_map, int* object_dispatch_flags,
+ DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
bool discard(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
const ::SnapContext &snapc, int discard_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) override;
bool write(
uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) override;
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) override;
bool compare_and_write(
ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
int* object_dispatch_flags, uint64_t* journal_tid,
- io::DispatchResult* dispatch_result, Context** on_finish,
+ DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
bool flush(
- io::FlushSource flush_source, const ZTracer::Trace &parent_trace,
- uint64_t* journal_tid, io::DispatchResult* dispatch_result,
+ FlushSource flush_source, const ZTracer::Trace &parent_trace,
+ uint64_t* journal_tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched) override;
bool invalidate_cache(Context* on_finish) override {
#define CEPH_LIBRBD_IO_TYPES_H
#include "include/int_types.h"
+#include "osdc/StriperTypes.h"
#include <map>
#include <vector>
OBJECT_DISPATCH_FLAG_WILL_RETRY_ON_ERROR = 1UL << 1
};
+using striper::LightweightBufferExtents;
+using striper::LightweightObjectExtent;
+using striper::LightweightObjectExtents;
+
typedef std::vector<std::pair<uint64_t, uint64_t> > Extents;
typedef std::map<uint64_t, uint64_t> ExtentMap;
namespace util {
bool assemble_write_same_extent(
- const ObjectExtent &object_extent, const ceph::bufferlist& data,
+ const LightweightObjectExtent &object_extent, const ceph::bufferlist& data,
ceph::bufferlist *ws_data, bool force_write) {
size_t data_len = data.length();
#include "include/int_types.h"
#include "include/buffer_fwd.h"
+#include "librbd/io/Types.h"
#include <map>
class ObjectExtent;
namespace io {
namespace util {
-bool assemble_write_same_extent(const ObjectExtent &object_extent,
+bool assemble_write_same_extent(const LightweightObjectExtent &object_extent,
const ceph::bufferlist& data,
ceph::bufferlist *ws_data,
bool force_write);
template <typename I>
bool ObjectDispatch<I>::write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- io::Extents&& buffer_extents, ceph::bufferlist&& data,
+ io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
uint64_t* journal_tid, io::DispatchResult* dispatch_result,
MockSimpleSchedulerObjectDispatch
mock_simple_scheduler_object_dispatch(&mock_image_ctx);
- io::Extents buffer_extents;
+ io::LightweightBufferExtents buffer_extents;
ceph::bufferlist data;
C_SaferCond cond;
Context *on_finish = &cond;
}
MOCK_METHOD10(execute_write_same,
- bool(uint64_t, uint64_t, uint64_t, const Extents&,
+ bool(uint64_t, uint64_t, uint64_t,
+ const LightweightBufferExtents&,
const ceph::bufferlist&, const ::SnapContext &, int*,
uint64_t*, DispatchResult*, Context *));
bool write_same(
uint64_t object_no, uint64_t object_off, uint64_t object_len,
- Extents&& buffer_extents, ceph::bufferlist&& data,
+ LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
const ::SnapContext &snapc, int op_flags,
const ZTracer::Trace &parent_trace, int* dispatch_flags,
uint64_t* journal_tid, DispatchResult* dispatch_result,