From: Radoslaw Zarzynski Date: Thu, 24 Nov 2016 11:03:18 +0000 (+0100) Subject: rgw: implement the AlignedStreamGetter. X-Git-Tag: v12.0.2~214^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6c1bb7a10eae8376d1a01ae79e7aaae793ee3207;p=ceph.git rgw: implement the AlignedStreamGetter. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 9cb691059832..fea8872b882c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5583,6 +5583,34 @@ void RGWBulkUploadOp::execute() return; } +RGWBulkUploadOp::AlignedStreamGetter::~AlignedStreamGetter() +{ + const size_t aligned_legnth = length + (-length % alignment); + ceph::bufferlist junk; + + DecoratedStreamGetter::get_exactly(aligned_legnth - position, junk); +} + +ssize_t RGWBulkUploadOp::AlignedStreamGetter::get_at_most(const size_t want, + ceph::bufferlist& dst) +{ + const size_t max_to_read = std::min(want, length - position); + const auto len = DecoratedStreamGetter::get_at_most(max_to_read, dst); + if (len > 0) { + position += len; + } + return len; +} + +ssize_t RGWBulkUploadOp::AlignedStreamGetter::get_exactly(const size_t want, + ceph::bufferlist& dst) +{ + const auto len = DecoratedStreamGetter::get_exactly(want, dst); + if (len > 0) { + position += len; + } + return len; +} int RGWSetAttrs::verify_permission() { diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index af44302f2d9f..c17c4dbe3862 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -390,6 +390,7 @@ class RGWBulkUploadOp : public RGWOp { protected: class StreamGetter; class DecoratedStreamGetter; + class AlignedStreamGetter; virtual std::unique_ptr create_stream() = 0; virtual void send_response() = 0; @@ -447,6 +448,29 @@ public: }; /* RGWBulkUploadOp::DecoratedStreamGetter */ +class RGWBulkUploadOp::AlignedStreamGetter + : public RGWBulkUploadOp::DecoratedStreamGetter { + size_t position; + size_t length; + size_t alignment; + +public: + template + AlignedStreamGetter(const size_t position, + const size_t length, + const size_t alignment, + U&& decoratee) + : DecoratedStreamGetter(std::forward(decoratee)), + position(position), + length(length), + alignment(alignment) { + } + virtual ~AlignedStreamGetter(); + ssize_t get_at_most(size_t want, ceph::bufferlist& dst) override; + ssize_t get_exactly(size_t want, ceph::bufferlist& dst) override; +}; /* RGWBulkUploadOp::AlignedStreamGetter */ + + #define RGW_LIST_BUCKETS_LIMIT_MAX 10000 class RGWListBuckets : public RGWOp {