]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/d4n: delete older versions of an object
authorPritha Srivastava <prsrivas@redhat.com>
Wed, 29 Jan 2025 09:25:40 +0000 (14:55 +0530)
committerPritha Srivastava <prsrivas@redhat.com>
Mon, 21 Apr 2025 05:47:33 +0000 (11:17 +0530)
during an overwrite for objects belonging to
an unversioned bucket and version suspended
bucket in Writer::complete() method.

Signed-off-by: Pritha Srivastava <prsrivas@redhat.com>
src/rgw/driver/d4n/rgw_sal_d4n.cc
src/rgw/driver/d4n/rgw_sal_d4n.h

index 2e6b2d0d687d833152392a241622aa8d0bd362f2..cd161b241e4751d362b0d61beb6796320194a6c9 100644 (file)
@@ -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<rgw::sal::Object::DeleteOp> 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<rgw_user>(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;
index 70f7d392ba8a16584fd9b185b7a14b0a703eb86d..db5fc08a006faabd76576ed721799e7e9c7f3f63 100644 (file)
@@ -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<Writer> _next, D4NFilterDriver* _driver, Object* _obj,