From e824d484bb14a6c0d7fc8e74edb42a8f79fc92ab Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 21 Aug 2020 12:31:16 +0800 Subject: [PATCH] crimson/osd: check for DNE object and return ENOENT in read ops * omap_get_keys() this change addresses the failure of test_rados.py:TestIoctx.test_get_omap_keys * omap_get_vals_by_keys() this change addresses the failure of test_rados.py:TestIoctx.test_get_omap_vals_by_keys * read() this change addresses the failure of test_rados.py:TestIoctx.test_write_ops Signed-off-by: Kefu Chai --- src/crimson/osd/pg_backend.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 1bd15a52bf3..5eabc44a74e 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -190,6 +190,10 @@ PGBackend::read(const ObjectState& os, OSDOp& osd_op) uint64_t length = op.extent.length; logger().trace("read: {} {}~{}", oi.soid, offset, length); + if (!os.exists || os.oi.is_whiteout()) { + logger().debug("{}: {} DNE", __func__, os.oi.soid); + return crimson::ct_error::enoent::make(); + } // are we beyond truncate_size? size_t size = oi.size; if ((op.extent.truncate_seq > oi.truncate_seq) && @@ -888,7 +892,10 @@ PGBackend::omap_get_keys( if (__builtin_expect(stopping, false)) { throw crimson::common::system_shutdown_exception(); } - + if (!os.exists || os.oi.is_whiteout()) { + logger().debug("{}: object does not exist: {}", os.oi.soid); + return crimson::ct_error::enoent::make(); + } std::string start_after; uint64_t max_return; try { @@ -1010,6 +1017,10 @@ PGBackend::omap_get_vals_by_keys( if (__builtin_expect(stopping, false)) { throw crimson::common::system_shutdown_exception(); } + if (!os.exists || os.oi.is_whiteout()) { + logger().debug("{}: object does not exist: {}", os.oi.soid); + return crimson::ct_error::enoent::make(); + } std::set keys_to_get; try { @@ -1019,7 +1030,6 @@ PGBackend::omap_get_vals_by_keys( } catch (buffer::error&) { throw crimson::osd::invalid_argument(); } - return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).safe_then( [&osd_op] (crimson::os::FuturizedStore::omap_values_t&& vals) { encode(vals, osd_op.outdata); -- 2.39.5