]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: use move-semantics for object IO data payloads
authorJason Dillaman <dillaman@redhat.com>
Thu, 15 Feb 2018 17:19:28 +0000 (12:19 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 26 Feb 2018 17:31:58 +0000 (12:31 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/LibrbdWriteback.cc
src/librbd/io/ImageRequest.cc
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/librbd/operation/FlattenRequest.cc
src/test/librbd/io/test_mock_ObjectRequest.cc

index 7bc90cadefb856075b4583004c67aa6244cf2668..bcb71298cd1590bc82cf0f30b8bf5f60189214fb 100644 (file)
@@ -100,6 +100,7 @@ namespace librbd {
     std::string oid;
     uint64_t object_no;
     uint64_t off;
+    uint64_t length;
     bufferlist bl;
     SnapContext snapc;
     uint64_t journal_tid;
@@ -109,12 +110,12 @@ namespace librbd {
 
     C_WriteJournalCommit(ImageCtx *_image_ctx, const std::string &_oid,
                          uint64_t _object_no, uint64_t _off,
-                         const bufferlist &_bl, const SnapContext& _snapc,
+                         bufferlist&& _bl, const SnapContext& _snapc,
                          uint64_t _journal_tid,
                         const ZTracer::Trace &trace, Context *_req_comp)
       : image_ctx(_image_ctx), oid(_oid), object_no(_object_no), off(_off),
-        bl(_bl), snapc(_snapc), journal_tid(_journal_tid),
-        trace(trace), req_comp(_req_comp) {
+        length(_bl.length()), bl(std::move(_bl)), snapc(_snapc),
+        journal_tid(_journal_tid), trace(trace), req_comp(_req_comp) {
       CephContext *cct = image_ctx->cct;
       ldout(cct, 20) << this << " C_WriteJournalCommit: "
                      << "delaying write until journal tid "
@@ -150,7 +151,7 @@ namespace librbd {
 
       Extents file_extents;
       Striper::extent_to_file(cct, &image_ctx->layout, object_no, off,
-                              bl.length(), file_extents);
+                              length, file_extents);
       for (Extents::iterator it = file_extents.begin();
            it != file_extents.end(); ++it) {
         image_ctx->journal->commit_io_event_extent(journal_tid, it->first,
@@ -167,7 +168,8 @@ namespace librbd {
 
       request_sent = true;
       auto req = new io::ObjectWriteRequest<>(image_ctx, oid, object_no, off,
-                                              bl, snapc, 0, trace, this);
+                                              std::move(bl), snapc, 0, trace,
+                                              this);
       req->send();
     }
   };
@@ -281,14 +283,16 @@ namespace librbd {
 
     // all IO operations are flushed prior to closing the journal
     assert(journal_tid == 0 || m_ictx->journal != NULL);
+    bufferlist bl_copy(bl);
     if (journal_tid != 0) {
       m_ictx->journal->flush_event(
         journal_tid, new C_WriteJournalCommit(
-         m_ictx, oid.name, object_no, off, bl, snapc, journal_tid, trace,
-          req_comp));
+          m_ictx, oid.name, object_no, off, std::move(bl_copy), snapc,
+          journal_tid, trace, req_comp));
     } else {
       auto req = new io::ObjectWriteRequest<>(
-       m_ictx, oid.name, object_no, off, bl, snapc, 0, trace, req_comp);
+        m_ictx, oid.name, object_no, off, std::move(bl_copy), snapc, 0, trace,
+        req_comp);
       req->send();
     }
     return ++m_tid;
index fdd7b18db438ade512b83e698c7f26e052fd21cf..b34a0ff247abfc5a87ab8213729b4155c7908bd9 100644 (file)
@@ -478,7 +478,8 @@ ObjectRequestHandle *ImageWriteRequest<I>::create_object_request(
   assemble_extent(object_extent, &bl);
   ObjectRequest<I> *req = ObjectRequest<I>::create_write(
     &image_ctx, object_extent.oid.name, object_extent.objectno,
-    object_extent.offset, bl, snapc, m_op_flags, this->m_trace, on_finish);
+    object_extent.offset, std::move(bl), snapc, m_op_flags, this->m_trace,
+    on_finish);
   return req;
 }
 
@@ -781,12 +782,13 @@ ObjectRequestHandle *ImageWriteSameRequest<I>::create_object_request(
     req = ObjectRequest<I>::create_writesame(
       &image_ctx, object_extent.oid.name, object_extent.objectno,
       object_extent.offset, object_extent.length,
-      bl, snapc, m_op_flags, this->m_trace, on_finish);
+      std::move(bl), snapc, m_op_flags, this->m_trace, on_finish);
     return req;
   }
   req = ObjectRequest<I>::create_write(
     &image_ctx, object_extent.oid.name, object_extent.objectno,
-    object_extent.offset, bl, snapc, m_op_flags, this->m_trace, on_finish);
+    object_extent.offset, std::move(bl), snapc, m_op_flags, this->m_trace,
+    on_finish);
   return req;
 }
 
@@ -862,13 +864,16 @@ ObjectRequestHandle *ImageCompareAndWriteRequest<I>::create_object_request(
     Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
+  // NOTE: safe to move m_cmp_bl since we only support this op against
+  // a single object
   bufferlist bl;
   assemble_extent(object_extent, &bl);
   ObjectRequest<I> *req = ObjectRequest<I>::create_compare_and_write(
                                   &image_ctx, object_extent.oid.name,
                                   object_extent.objectno, object_extent.offset,
-                                  m_cmp_bl, bl, snapc, m_mismatch_offset,
-                                  m_op_flags, this->m_trace, on_finish);
+                                  std::move(m_cmp_bl), std::move(bl), snapc,
+                                  m_mismatch_offset, m_op_flags, this->m_trace,
+                                  on_finish);
   return req;
 }
 
index 15babcaeff655f2c1d774c6ef15d68ad397962d7..da35c001181ed07c2ae29c5967c6a1d7c16f86f0 100644 (file)
@@ -48,12 +48,13 @@ template <typename I>
 ObjectRequest<I>*
 ObjectRequest<I>::create_write(I *ictx, const std::string &oid,
                                uint64_t object_no, uint64_t object_off,
-                               const ceph::bufferlist &data,
+                               ceph::bufferlist&& data,
                                const ::SnapContext &snapc, int op_flags,
                               const ZTracer::Trace &parent_trace,
                                Context *completion) {
-  return new ObjectWriteRequest<I>(ictx, oid, object_no, object_off, data,
-                                   snapc, op_flags, parent_trace, completion);
+  return new ObjectWriteRequest<I>(ictx, oid, object_no, object_off,
+                                   std::move(data), snapc, op_flags,
+                                   parent_trace, completion);
 }
 
 template <typename I>
@@ -77,13 +78,13 @@ ObjectRequest<I>*
 ObjectRequest<I>::create_writesame(I *ictx, const std::string &oid,
                                    uint64_t object_no, uint64_t object_off,
                                    uint64_t object_len,
-                                   const ceph::bufferlist &data,
+                                   ceph::bufferlist&& data,
                                    const ::SnapContext &snapc, int op_flags,
                                   const ZTracer::Trace &parent_trace,
                                    Context *completion) {
   return new ObjectWriteSameRequest<I>(ictx, oid, object_no, object_off,
-                                       object_len, data, snapc, op_flags,
-                                       parent_trace, completion);
+                                       object_len, std::move(data), snapc,
+                                       op_flags, parent_trace, completion);
 }
 
 template <typename I>
@@ -91,15 +92,16 @@ ObjectRequest<I>*
 ObjectRequest<I>::create_compare_and_write(I *ictx, const std::string &oid,
                                            uint64_t object_no,
                                            uint64_t object_off,
-                                           const ceph::bufferlist &cmp_data,
-                                           const ceph::bufferlist &write_data,
+                                           ceph::bufferlist&& cmp_data,
+                                           ceph::bufferlist&& write_data,
                                            const ::SnapContext &snapc,
                                            uint64_t *mismatch_offset,
                                            int op_flags,
                                            const ZTracer::Trace &parent_trace,
                                            Context *completion) {
   return new ObjectCompareAndWriteRequest<I>(ictx, oid, object_no, object_off,
-                                             cmp_data, write_data, snapc,
+                                             std::move(cmp_data),
+                                             std::move(write_data), snapc,
                                              mismatch_offset, op_flags,
                                              parent_trace, completion);
 }
index a015fb199ec9508580ce5f995037b008a82b20f0..b13a195f85eaa43581a1a8e95f8f73a621aab85c 100644 (file)
@@ -43,7 +43,7 @@ public:
   static ObjectRequest* create_write(ImageCtxT *ictx, const std::string &oid,
                                      uint64_t object_no,
                                      uint64_t object_off,
-                                     const ceph::bufferlist &data,
+                                     ceph::bufferlist&& data,
                                      const ::SnapContext &snapc, int op_flags,
                                     const ZTracer::Trace &parent_trace,
                                      Context *completion);
@@ -60,7 +60,7 @@ public:
                                          uint64_t object_no,
                                          uint64_t object_off,
                                          uint64_t object_len,
-                                         const ceph::bufferlist &data,
+                                         ceph::bufferlist&& data,
                                          const ::SnapContext &snapc,
                                         int op_flags,
                                         const ZTracer::Trace &parent_trace,
@@ -69,8 +69,8 @@ public:
                                                  const std::string &oid,
                                                  uint64_t object_no,
                                                  uint64_t object_off,
-                                                 const ceph::bufferlist &cmp_data,
-                                                 const ceph::bufferlist &write_data,
+                                                 ceph::bufferlist&& cmp_data,
+                                                 ceph::bufferlist&& write_data,
                                                  const ::SnapContext &snapc,
                                                  uint64_t *mismatch_offset, int op_flags,
                                                  const ZTracer::Trace &parent_trace,
@@ -309,13 +309,13 @@ class ObjectWriteRequest : public AbstractObjectWriteRequest<ImageCtxT> {
 public:
   ObjectWriteRequest(ImageCtxT *ictx, const std::string &oid,
                      uint64_t object_no, uint64_t object_off,
-                     const ceph::bufferlist &data, const ::SnapContext &snapc,
+                     ceph::bufferlist&& data, const ::SnapContext &snapc,
                      int op_flags, const ZTracer::Trace &parent_trace,
                      Context *completion)
     : AbstractObjectWriteRequest<ImageCtxT>(ictx, oid, object_no, object_off,
                                             data.length(), snapc, "write",
                                             parent_trace, completion),
-      m_write_data(data), m_op_flags(op_flags) {
+      m_write_data(std::move(data)), m_op_flags(op_flags) {
   }
 
   bool is_empty_write_op() const override {
@@ -434,14 +434,14 @@ class ObjectWriteSameRequest : public AbstractObjectWriteRequest<ImageCtxT> {
 public:
   ObjectWriteSameRequest(ImageCtxT *ictx, const std::string &oid,
                         uint64_t object_no, uint64_t object_off,
-                        uint64_t object_len, const ceph::bufferlist &data,
+                        uint64_t object_len, ceph::bufferlist&& data,
                          const ::SnapContext &snapc, int op_flags,
                         const ZTracer::Trace &parent_trace,
                         Context *completion)
     : AbstractObjectWriteRequest<ImageCtxT>(ictx, oid, object_no, object_off,
                                             object_len, snapc, "writesame",
                                             parent_trace, completion),
-      m_write_data(data), m_op_flags(op_flags) {
+      m_write_data(std::move(data)), m_op_flags(op_flags) {
   }
 
   const char *get_op_type() const override {
@@ -461,8 +461,8 @@ class ObjectCompareAndWriteRequest : public AbstractObjectWriteRequest<ImageCtxT
 public:
   ObjectCompareAndWriteRequest(ImageCtxT *ictx, const std::string &oid,
                                uint64_t object_no, uint64_t object_off,
-                               const ceph::bufferlist &cmp_bl,
-                               const ceph::bufferlist &write_bl,
+                               ceph::bufferlist&& cmp_bl,
+                               ceph::bufferlist&& write_bl,
                                const ::SnapContext &snapc,
                                uint64_t *mismatch_offset, int op_flags,
                                const ZTracer::Trace &parent_trace,
@@ -471,7 +471,7 @@ public:
                                            cmp_bl.length(), snapc,
                                            "compare_and_write", parent_trace,
                                            completion),
-    m_cmp_bl(cmp_bl), m_write_bl(write_bl),
+    m_cmp_bl(std::move(cmp_bl)), m_write_bl(std::move(write_bl)),
     m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) {
   }
 
index defee1da67fe5c70cc3f8a1ca2c29df05db134f5..877384bb6df831037aaf309aa7d4b8a7cc080339 100644 (file)
@@ -43,7 +43,8 @@ public:
     bufferlist bl;
     string oid = image_ctx.get_object_name(m_object_no);
     auto req = new io::ObjectWriteRequest<I>(&image_ctx, oid, m_object_no, 0,
-                                             bl, m_snapc, 0, {}, this);
+                                             std::move(bl), m_snapc, 0, {},
+                                             this);
     if (!req->has_parent()) {
       // stop early if the parent went away - it just means
       // another flatten finished first or the image was resized
index 09c48f0dc70b8d7a14c8e55d2fa158420ca09f10..a9f8df05eba5a2d29f3fc6cf200385350de09411 100644 (file)
@@ -667,8 +667,8 @@ TEST_F(TestMockIoObjectRequest, Write) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -702,8 +702,8 @@ TEST_F(TestMockIoObjectRequest, WriteFull) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -736,8 +736,8 @@ TEST_F(TestMockIoObjectRequest, WriteObjectMap) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -758,8 +758,8 @@ TEST_F(TestMockIoObjectRequest, WriteError) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
 }
@@ -812,8 +812,8 @@ TEST_F(TestMockIoObjectRequest, Copyup) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -860,8 +860,8 @@ TEST_F(TestMockIoObjectRequest, CopyupOptimization) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -901,8 +901,8 @@ TEST_F(TestMockIoObjectRequest, CopyupError) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, bl, mock_image_ctx.snapc,
-    0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(bl),
+    mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
 }
@@ -1143,7 +1143,7 @@ TEST_F(TestMockIoObjectRequest, WriteSame) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteSameRequest::create_writesame(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, 4096, bl,
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, 4096, std::move(bl),
     mock_image_ctx.snapc, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
@@ -1183,8 +1183,8 @@ TEST_F(TestMockIoObjectRequest, CompareAndWrite) {
   C_SaferCond ctx;
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+    std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1223,8 +1223,8 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteFull) {
   C_SaferCond ctx;
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+    std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1285,8 +1285,8 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteCopyup) {
   C_SaferCond ctx;
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+    std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1324,8 +1324,8 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteMismatch) {
   C_SaferCond ctx;
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
-    &mock_image_ctx, ictx->get_object_name(0), 0, 0, cmp_bl, bl,
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    &mock_image_ctx, ictx->get_object_name(0), 0, 0, std::move(cmp_bl),
+    std::move(bl), mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(-EILSEQ, ctx.wait());
   ASSERT_EQ(1ULL, mismatch_offset);