From 5da4ecb32b9a051b65ed3a76bf01bbddda65342f Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Tue, 23 May 2017 12:42:13 +0200 Subject: [PATCH] librbd: discard related IO should skip op if object non-existent Fixes: http://tracker.ceph.com/issues/19962 Signed-off-by: Mykola Golub --- src/librbd/io/ObjectRequest.cc | 30 +++++++++++++++++++++++++----- src/librbd/io/ObjectRequest.h | 2 ++ src/test/librbd/test_librbd.cc | 3 ++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 1cdb696b717..4557a1bd3c9 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -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(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(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(this); m_ictx->op_work_queue->queue(ctx, 0); diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index 85529a19356..a236778c68f 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -478,6 +478,8 @@ public: return true; } + void send_write() override; + protected: void add_write_ops(librados::ObjectWriteOperation *wr, bool set_hints) override { diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index f16fbcca2a9..0fe8cc0281b 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -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)); -- 2.39.5