From 3e335cf2751b12a4322f422c613d9f22329d1de9 Mon Sep 17 00:00:00 2001 From: Pritha Srivastava Date: Wed, 29 Jan 2025 14:55:40 +0530 Subject: [PATCH] rgw/d4n: delete older versions of an object during an overwrite for objects belonging to an unversioned bucket and version suspended bucket in Writer::complete() method. Signed-off-by: Pritha Srivastava --- src/rgw/driver/d4n/rgw_sal_d4n.cc | 13 +++++++------ src/rgw/driver/d4n/rgw_sal_d4n.h | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.cc b/src/rgw/driver/d4n/rgw_sal_d4n.cc index 2e6b2d0d687..cd161b241e4 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.cc +++ b/src/rgw/driver/d4n/rgw_sal_d4n.cc @@ -2769,16 +2769,14 @@ int D4NFilterWriter::prepare(optional_yield y) return next->prepare(y); } else { //for non-versioned buckets or version suspended buckets, we need to delete the older dirty blocks of the object from the cache as dirty blocks do not get evicted - //alternatively, we could add logic to delete this lazily if (!object->get_bucket()->versioned() || (object->get_bucket()->versioned() && !object->get_bucket()->versioning_enabled())) { - std::unique_ptr del_op = object->get_delete_op(); if (object->get_bucket()->versioned() && !object->get_bucket()->versioning_enabled()) { - del_op->params.null_verid = true; object->set_instance("null"); } - auto ret = del_op->delete_obj(dpp, y, rgw::sal::FLAG_LOG_OP); - if (ret < 0) { - ldpp_dout(dpp, 0) << "D4NFilterWriter::" << __func__ << "(): delete_obj failed, ret=" << ret << dendl; + rgw::d4n::CacheBlock block; + rgw::sal::Attrs attrs; + if (object->check_head_exists_in_cache_get_oid(dpp, prev_oid_in_cache, attrs, block, y)) { + ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): found in cache, prev_oid_in_cache=" << prev_oid_in_cache << dendl; } object->clear_instance(); } @@ -2990,6 +2988,9 @@ int D4NFilterWriter::complete(size_t accounted_size, const std::string& etag, ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): key=" << key << dendl; ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): obj->get_key()=" << obj->get_key() << dendl; driver->get_policy_driver()->get_cache_policy()->update_dirty_object(dpp, key, version, false, accounted_size, creationTime, std::get(obj->get_bucket()->get_owner()), objEtag, obj->get_bucket()->get_name(), obj->get_bucket()->get_bucket_id(), obj->get_key(), rgw::d4n::RefCount::NOOP, y); + if (!prev_oid_in_cache.empty()) { + driver->get_policy_driver()->get_cache_policy()->invalidate_dirty_object(dpp, prev_oid_in_cache); + } } } else { //if get_cache_driver()->put() ldpp_dout(dpp, 0) << "D4NFilterWriter::" << __func__ << "(): put failed for head_oid_in_cache, ret=" << ret << dendl; diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.h b/src/rgw/driver/d4n/rgw_sal_d4n.h index 70f7d392ba8..db5fc08a006 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.h +++ b/src/rgw/driver/d4n/rgw_sal_d4n.h @@ -288,6 +288,7 @@ class D4NFilterWriter : public FilterWriter { optional_yield y; bool d4n_writecache; std::string version; + std::string prev_oid_in_cache; public: D4NFilterWriter(std::unique_ptr _next, D4NFilterDriver* _driver, Object* _obj, -- 2.39.5