]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: discard related IO should skip op if object non-existent
authorMykola Golub <mgolub@mirantis.com>
Tue, 23 May 2017 10:42:13 +0000 (12:42 +0200)
committerMykola Golub <mgolub@mirantis.com>
Tue, 23 May 2017 13:19:43 +0000 (15:19 +0200)
Fixes: http://tracker.ceph.com/issues/19962
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/test/librbd/test_librbd.cc

index 1cdb696b7171b070ac504a001fc29c66b83aeb15..4557a1bd3c962cf44311bd8140f2c78fb062243e 100644 (file)
@@ -635,14 +635,34 @@ void ObjectRemoveRequest::guard_write() {
   }
 }
 void ObjectRemoveRequest::send_write() {
-  ldout(m_ictx->cct, 20) << m_oid << " " << m_object_off
-                         << "~" << m_object_len << dendl;
-  send_pre_object_map_update();
+  ldout(m_ictx->cct, 20) << m_oid << " remove " << " object exist "
+                         << m_object_exist << dendl;
+  if (!m_object_exist && !has_parent()) {
+    m_state = LIBRBD_AIO_WRITE_FLAT;
+    Context *ctx = util::create_context_callback<ObjectRequest>(this);
+    m_ictx->op_work_queue->queue(ctx, 0);
+  } else {
+    send_pre_object_map_update();
+  }
 }
 
 void ObjectTruncateRequest::send_write() {
-  ldout(m_ictx->cct, 20) << m_oid << " truncate " << m_object_off << dendl;
-  if (!m_object_exist && ! has_parent()) {
+  ldout(m_ictx->cct, 20) << m_oid << " truncate " << m_object_off
+                         << " object exist " << m_object_exist << dendl;
+  if (!m_object_exist && !has_parent()) {
+    m_state = LIBRBD_AIO_WRITE_FLAT;
+    Context *ctx = util::create_context_callback<ObjectRequest>(this);
+    m_ictx->op_work_queue->queue(ctx, 0);
+  } else {
+    AbstractObjectWriteRequest::send_write();
+  }
+}
+
+void ObjectZeroRequest::send_write() {
+  ldout(m_ictx->cct, 20) << m_oid << " zero " << m_object_off << "~"
+                         << m_object_len << " object exist " << m_object_exist
+                         << dendl;
+  if (!m_object_exist && !has_parent()) {
     m_state = LIBRBD_AIO_WRITE_FLAT;
     Context *ctx = util::create_context_callback<ObjectRequest>(this);
     m_ictx->op_work_queue->queue(ctx, 0);
index 85529a193563bf4164a4b1e2a999421922cb9b94..a236778c68fd6e8be9aa763874780e4ab0f0de65 100644 (file)
@@ -478,6 +478,8 @@ public:
     return true;
   }
 
+  void send_write() override;
+
 protected:
   void add_write_ops(librados::ObjectWriteOperation *wr,
                      bool set_hints) override {
index f16fbcca2a9a0b89158e758bb963e10208e3d488..0fe8cc0281bf855e61f923a6c33d98ae92ef0d95 100644 (file)
@@ -1879,12 +1879,13 @@ TEST_F(TestLibRBD, TestEmptyDiscard)
   int order = 0;
   std::string name = get_temp_image_name();
   uint64_t size = 20 << 20;
-  
+
   ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
   ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
   ASSERT_PASSED(aio_discard_test_data, image, 0, 1*1024*1024);
   ASSERT_PASSED(aio_discard_test_data, image, 0, 4*1024*1024);
+  ASSERT_PASSED(aio_discard_test_data, image, 3*1024*1024, 1*1024*1024);
 
   ASSERT_PASSED(validate_object_map, image);
   ASSERT_EQ(0, rbd_close(image));