]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: implement the AlignedStreamGetter.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Thu, 24 Nov 2016 11:03:18 +0000 (12:03 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Sun, 2 Apr 2017 13:46:13 +0000 (15:46 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h

index 9cb691059832198b5dd451bc76127792457e737b..fea8872b882cd8eb7c2791c44e72e0a8d5a4b6c3 100644 (file)
@@ -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()
 {
index af44302f2d9f84d341c32c0b0527a2145363d074..c17c4dbe3862da2568046c9fdef97de68314ea93 100644 (file)
@@ -390,6 +390,7 @@ class RGWBulkUploadOp : public RGWOp {
 protected:
   class StreamGetter;
   class DecoratedStreamGetter;
+  class AlignedStreamGetter;
 
   virtual std::unique_ptr<StreamGetter> 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 <typename U>
+  AlignedStreamGetter(const size_t position,
+                      const size_t length,
+                      const size_t alignment,
+                      U&& decoratee)
+    : DecoratedStreamGetter(std::forward<U>(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 {