]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: optimize copy-up to add hints only once to object op 15037/head
authorMykola Golub <mgolub@mirantis.com>
Wed, 10 May 2017 17:53:50 +0000 (19:53 +0200)
committerMykola Golub <mgolub@mirantis.com>
Mon, 15 May 2017 14:50:43 +0000 (16:50 +0200)
Fixes: http://tracker.ceph.com/issues/19875
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/librbd/io/CopyupRequest.cc
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h

index 0f1d34f2075749a3faa8aca80d1c9e9bc9377c03..6ec900f46a3dfac783c74a8b6ea45f379e597eaa 100644 (file)
@@ -167,7 +167,8 @@ bool CopyupRequest::send_copyup() {
     for (size_t i=0; i<m_pending_requests.size(); ++i) {
       ObjectRequest<> *req = m_pending_requests[i];
       ldout(m_ictx->cct, 20) << "add_copyup_ops " << req << dendl;
-      req->add_copyup_ops(&write_op);
+      bool set_hints = (i == 0);
+      req->add_copyup_ops(&write_op, set_hints);
     }
     assert(write_op.size() != 0);
 
index 97cd2e40881466637368058817e6accd653fbd26..54a3a8b2315a1c3224ef3506c28540ffeabbb575 100644 (file)
@@ -548,7 +548,7 @@ void AbstractObjectWriteRequest::send_write_op()
     guard_write();
   }
 
-  add_write_ops(&m_write);
+  add_write_ops(&m_write, true);
   assert(m_write.size() != 0);
 
   librados::AioCompletion *rados_completion =
@@ -577,9 +577,10 @@ void AbstractObjectWriteRequest::handle_write_guard()
   }
 }
 
-void ObjectWriteRequest::add_write_ops(librados::ObjectWriteOperation *wr) {
+void ObjectWriteRequest::add_write_ops(librados::ObjectWriteOperation *wr,
+                                       bool set_hints) {
   RWLock::RLocker snap_locker(m_ictx->snap_lock);
-  if (m_ictx->enable_alloc_hint &&
+  if (set_hints && m_ictx->enable_alloc_hint &&
       (m_ictx->object_map == nullptr || !m_object_exist)) {
     wr->set_alloc_hint(m_ictx->get_object_size(), m_ictx->get_object_size());
   }
@@ -628,9 +629,10 @@ void ObjectTruncateRequest::send_write() {
   }
 }
 
-void ObjectWriteSameRequest::add_write_ops(librados::ObjectWriteOperation *wr) {
+void ObjectWriteSameRequest::add_write_ops(librados::ObjectWriteOperation *wr,
+                                           bool set_hints) {
   RWLock::RLocker snap_locker(m_ictx->snap_lock);
-  if (m_ictx->enable_alloc_hint &&
+  if (set_hints && m_ictx->enable_alloc_hint &&
       (m_ictx->object_map == nullptr || !m_object_exist)) {
     wr->set_alloc_hint(m_ictx->get_object_size(), m_ictx->get_object_size());
   }
index f57bbe0b72fa50d66fe85625fd868d311ac03666..7f0037265196d07df27b273e6542fcce7adfa375 100644 (file)
@@ -83,7 +83,9 @@ public:
                 Context *completion, bool hide_enoent);
   ~ObjectRequest() override {}
 
-  virtual void add_copyup_ops(librados::ObjectWriteOperation *wr) {};
+  virtual void add_copyup_ops(librados::ObjectWriteOperation *wr,
+                              bool set_hints) {
+  };
 
   void complete(int r) override;
 
@@ -209,9 +211,10 @@ public:
                              uint64_t len, const ::SnapContext &snapc,
                              Context *completion, bool hide_enoent);
 
-  void add_copyup_ops(librados::ObjectWriteOperation *wr) override
+  void add_copyup_ops(librados::ObjectWriteOperation *wr,
+                      bool set_hints) override
   {
-    add_write_ops(wr);
+    add_write_ops(wr, set_hints);
   }
 
   bool should_complete(int r) override;
@@ -270,7 +273,8 @@ protected:
   bool m_object_exist;
   bool m_guard = true;
 
-  virtual void add_write_ops(librados::ObjectWriteOperation *wr) = 0;
+  virtual void add_write_ops(librados::ObjectWriteOperation *wr,
+                             bool set_hints) = 0;
   virtual void guard_write();
   virtual bool post_object_map_update() {
     return false;
@@ -311,7 +315,8 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override;
 
   void send_write() override;
 
@@ -358,7 +363,8 @@ public:
   void send_write() override;
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override {
     if (has_parent()) {
       wr->truncate(0);
     } else {
@@ -397,7 +403,8 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override {
     wr->remove();
   }
 
@@ -429,7 +436,8 @@ public:
   void send_write() override;
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override {
     wr->truncate(m_object_off);
   }
 };
@@ -453,7 +461,8 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override {
     wr->zero(m_object_off, m_object_len);
   }
 };
@@ -480,7 +489,8 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(librados::ObjectWriteOperation *wr,
+                     bool set_hints) override;
 
   void send_write() override;