Skip to content

Commit 3e335cf

Browse files
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 <[email protected]>
1 parent 576e3a9 commit 3e335cf

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/rgw/driver/d4n/rgw_sal_d4n.cc

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2769,16 +2769,14 @@ int D4NFilterWriter::prepare(optional_yield y)
27692769
return next->prepare(y);
27702770
} else {
27712771
//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
2772-
//alternatively, we could add logic to delete this lazily
27732772
if (!object->get_bucket()->versioned() || (object->get_bucket()->versioned() && !object->get_bucket()->versioning_enabled())) {
2774-
std::unique_ptr<rgw::sal::Object::DeleteOp> del_op = object->get_delete_op();
27752773
if (object->get_bucket()->versioned() && !object->get_bucket()->versioning_enabled()) {
2776-
del_op->params.null_verid = true;
27772774
object->set_instance("null");
27782775
}
2779-
auto ret = del_op->delete_obj(dpp, y, rgw::sal::FLAG_LOG_OP);
2780-
if (ret < 0) {
2781-
ldpp_dout(dpp, 0) << "D4NFilterWriter::" << __func__ << "(): delete_obj failed, ret=" << ret << dendl;
2776+
rgw::d4n::CacheBlock block;
2777+
rgw::sal::Attrs attrs;
2778+
if (object->check_head_exists_in_cache_get_oid(dpp, prev_oid_in_cache, attrs, block, y)) {
2779+
ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): found in cache, prev_oid_in_cache=" << prev_oid_in_cache << dendl;
27822780
}
27832781
object->clear_instance();
27842782
}
@@ -2990,6 +2988,9 @@ int D4NFilterWriter::complete(size_t accounted_size, const std::string& etag,
29902988
ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): key=" << key << dendl;
29912989
ldpp_dout(dpp, 20) << "D4NFilterWriter::" << __func__ << "(): obj->get_key()=" << obj->get_key() << dendl;
29922990
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);
2991+
if (!prev_oid_in_cache.empty()) {
2992+
driver->get_policy_driver()->get_cache_policy()->invalidate_dirty_object(dpp, prev_oid_in_cache);
2993+
}
29932994
}
29942995
} else { //if get_cache_driver()->put()
29952996
ldpp_dout(dpp, 0) << "D4NFilterWriter::" << __func__ << "(): put failed for head_oid_in_cache, ret=" << ret << dendl;

src/rgw/driver/d4n/rgw_sal_d4n.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ class D4NFilterWriter : public FilterWriter {
288288
optional_yield y;
289289
bool d4n_writecache;
290290
std::string version;
291+
std::string prev_oid_in_cache;
291292

292293
public:
293294
D4NFilterWriter(std::unique_ptr<Writer> _next, D4NFilterDriver* _driver, Object* _obj,

0 commit comments

Comments
 (0)