]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: pass write op object extents to copyup state machine
authorJason Dillaman <dillaman@redhat.com>
Fri, 25 Sep 2020 13:16:48 +0000 (09:16 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 13 Oct 2020 12:40:29 +0000 (08:40 -0400)
It will use these extents in a later commit to potentially reduce the
parent image data that is processed for copyup portion of the write
request.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/io/CopyupRequest.cc
src/librbd/io/CopyupRequest.h
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/test/librbd/io/test_mock_CopyupRequest.cc
src/test/librbd/io/test_mock_ObjectRequest.cc

index 64dd594526812fb9d1b0c9b22261b0fb1791cd76..3f864322bc230cc32c15b04d01e9337d8f56509d 100644 (file)
@@ -130,7 +130,8 @@ CopyupRequest<I>::~CopyupRequest() {
 }
 
 template <typename I>
-void CopyupRequest<I>::append_request(AbstractObjectWriteRequest<I> *req) {
+void CopyupRequest<I>::append_request(AbstractObjectWriteRequest<I> *req,
+                                      const Extents& object_extents) {
   std::lock_guard locker{m_lock};
 
   auto cct = m_image_ctx->cct;
@@ -138,6 +139,12 @@ void CopyupRequest<I>::append_request(AbstractObjectWriteRequest<I> *req) {
                  << "append=" << m_append_request_permitted << dendl;
   if (m_append_request_permitted) {
     m_pending_requests.push_back(req);
+
+    for (auto [offset, length] : object_extents) {
+      if (length > 0) {
+        m_write_object_extents.union_insert(offset, length);
+      }
+    }
   } else {
     m_restart_requests.push_back(req);
   }
index 51368cc583797e7175a18311684e8253a8630aca..7875a6dc9dc0e8308b0efb56c5b1de32de7ae224 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "include/int_types.h"
 #include "include/buffer.h"
+#include "include/interval_set.h"
 #include "common/ceph_mutex.h"
 #include "common/zipkin_trace.h"
 #include "librbd/io/AsyncOperation.h"
@@ -39,7 +40,8 @@ public:
                 const ZTracer::Trace &parent_trace);
   ~CopyupRequest();
 
-  void append_request(AbstractObjectWriteRequest<ImageCtxT> *req);
+  void append_request(AbstractObjectWriteRequest<ImageCtxT> *req,
+                      const Extents& object_extents);
 
   void send();
 
@@ -104,6 +106,8 @@ private:
   WriteRequests m_restart_requests;
   bool m_append_request_permitted = true;
 
+  interval_set<uint64_t> m_write_object_extents;
+
   void read_from_parent();
   void handle_read_from_parent(int r);
 
index 1e7280d3a03eb5cb0eb3b81cd766e4d2de89b855..27223221faeab98b8901c16c481a827189181fd4 100644 (file)
@@ -564,13 +564,13 @@ void AbstractObjectWriteRequest<I>::copyup() {
     this->m_parent_extents.clear();
 
     // make sure to wait on this CopyupRequest
-    new_req->append_request(this);
+    new_req->append_request(this, std::move(get_copyup_overwrite_extents()));
     image_ctx->copyup_list[this->m_object_no] = new_req;
 
     image_ctx->copyup_list_lock.unlock();
     new_req->send();
   } else {
-    it->second->append_request(this);
+    it->second->append_request(this, std::move(get_copyup_overwrite_extents()));
     image_ctx->copyup_list_lock.unlock();
   }
 }
index 711b440bd32076461f76993c73e39e7ad421f8af..93ad1b9bf88633c55f7a1ea0cda98ca9adbc4fa3 100644 (file)
@@ -199,6 +199,10 @@ protected:
     return r;
   }
 
+  virtual Extents get_copyup_overwrite_extents() const {
+    return {{m_object_off, m_object_len}};
+  }
+
 private:
   /**
    * @verbatim
@@ -304,7 +308,6 @@ public:
         } else {
           m_discard_action = DISCARD_ACTION_TRUNCATE;
         }
-        this->m_object_len = 0;
       } else {
         m_discard_action = DISCARD_ACTION_REMOVE;
       }
@@ -426,6 +429,10 @@ protected:
 
   int filter_write_result(int r) const override;
 
+  Extents get_copyup_overwrite_extents() const override {
+    return {};
+  }
+
 private:
   ceph::bufferlist m_cmp_bl;
   ceph::bufferlist m_write_bl;
index 458010f89db736a8fed24ac276b5d287adb40a37..93ee1c61c15f04e6b66c1166d95d8317b1ebeb7e 100644 (file)
@@ -389,7 +389,7 @@ TEST_F(TestMockIoCopyupRequest, Standard) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -447,7 +447,7 @@ TEST_F(TestMockIoCopyupRequest, StandardWithSnaps) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -580,7 +580,7 @@ TEST_F(TestMockIoCopyupRequest, DeepCopy) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -685,7 +685,7 @@ TEST_F(TestMockIoCopyupRequest, DeepCopyWithPostSnaps) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -757,7 +757,7 @@ TEST_F(TestMockIoCopyupRequest, DeepCopyWithPreAndPostSnaps) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -798,7 +798,7 @@ TEST_F(TestMockIoCopyupRequest, ZeroedCopyup) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -873,7 +873,7 @@ TEST_F(TestMockIoCopyupRequest, NoOpCopyup) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
@@ -922,12 +922,12 @@ TEST_F(TestMockIoCopyupRequest, RestartWrite) {
     mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
   EXPECT_CALL(mock_io_ctx, write(ictx->get_object_name(0), _, 0, 0, _))
     .WillOnce(WithoutArgs(Invoke([req, &mock_write_request2]() {
-                            req->append_request(&mock_write_request2);
+                            req->append_request(&mock_write_request2, {});
                             return 0;
                           })));
 
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request1);
+  req->append_request(&mock_write_request1, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request1.ctx.wait());
@@ -964,7 +964,7 @@ TEST_F(TestMockIoCopyupRequest, ReadFromParentError) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(-EPERM, mock_write_request.ctx.wait());
@@ -1001,7 +1001,7 @@ TEST_F(TestMockIoCopyupRequest, DeepCopyError) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(-EPERM, mock_write_request.ctx.wait());
@@ -1042,7 +1042,7 @@ TEST_F(TestMockIoCopyupRequest, UpdateObjectMapError) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(-EINVAL, mock_write_request.ctx.wait());
@@ -1096,7 +1096,7 @@ TEST_F(TestMockIoCopyupRequest, CopyupError) {
   auto req = new MockCopyupRequest(&mock_image_ctx, 0,
                                    {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(-EPERM, mock_write_request.ctx.wait());
@@ -1142,7 +1142,7 @@ TEST_F(TestMockIoCopyupRequest, SparseCopyupNotSupported) {
 
   auto req = new MockCopyupRequest(&mock_image_ctx, 0, {{0, 4096}}, {});
   mock_image_ctx.copyup_list[0] = req;
-  req->append_request(&mock_write_request);
+  req->append_request(&mock_write_request, {});
   req->send();
 
   ASSERT_EQ(0, mock_write_request.ctx.wait());
index dad8005731a7d045f8f8a151d01de668882c697a..c19d3a62dc86b82706f08bfa88647f0c5df9d672 100644 (file)
@@ -37,7 +37,8 @@ namespace io {
 template <>
 struct CopyupRequest<librbd::MockImageCtx> {
   MOCK_METHOD0(send, void());
-  MOCK_METHOD1(append_request, void(AbstractObjectWriteRequest<librbd::MockTestImageCtx>*));
+  MOCK_METHOD2(append_request, void(AbstractObjectWriteRequest<librbd::MockTestImageCtx>*,
+                                    const Extents&));
 };
 
 template <>
@@ -244,10 +245,11 @@ struct TestMockIoObjectRequest : public TestMockFixture {
 
   void expect_copyup(MockCopyupRequest& mock_copyup_request,
                      MockAbstractObjectWriteRequest** write_request, int r) {
-    EXPECT_CALL(mock_copyup_request, append_request(_))
-      .WillOnce(Invoke([write_request](MockAbstractObjectWriteRequest *req) {
-                  *write_request = req;
-                }));
+    EXPECT_CALL(mock_copyup_request, append_request(_, _))
+      .WillOnce(WithArg<0>(
+        Invoke([write_request](MockAbstractObjectWriteRequest *req) {
+            *write_request = req;
+          })));
     EXPECT_CALL(mock_copyup_request, send())
       .WillOnce(Invoke([write_request, r]() {
                   (*write_request)->handle_copyup(r);