From 8fd7be55f44bb71d7e8c3f6f8d788a89f2ade2db Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Tue, 4 Mar 2025 23:06:26 +0530 Subject: [PATCH] rgw/cloud-restore: Handle "null" instance non-current objects During restore, if the object instance is "null", clear it while updating bi entry. Signed-off-by: Soumya Koduri --- src/rgw/driver/rados/rgw_rados.cc | 10 +++++++++- src/rgw/driver/rados/rgw_sal_rados.cc | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 4cfd3f3590495..a83abe07460c7 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -5266,8 +5266,16 @@ int RGWRados::restore_obj_from_cloud(RGWLCCloudTierCtx& tier_ctx, auto aio = rgw::make_throttle(cct->_conf->rgw_put_obj_min_window_size, y); using namespace rgw::putobj; jspan_context no_trace{false, false}; + + // bi expects empty instance for the entries created when + // bucket versioning is not enabled or suspended. + rgw_obj dest_obj_bi = dest_obj; + if (dest_obj_bi.key.instance == "null") { + dest_obj_bi.key.instance.clear(); + } + rgw::putobj::AtomicObjectProcessor processor(aio.get(), this, dest_bucket_info, nullptr, - owner, obj_ctx, dest_obj, olh_epoch, tag, dpp, y, no_trace); + owner, obj_ctx, dest_obj_bi, olh_epoch, tag, dpp, y, no_trace); void (*progress_cb)(off_t, void *) = NULL; void *progress_data = NULL; diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 387a3febaeb5e..f27e4c895a0a1 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -3081,11 +3081,21 @@ int RadosObject::set_cloud_restore_status(const DoutPrefixProvider* dpp, */ int RadosObject::handle_obj_expiry(const DoutPrefixProvider* dpp, optional_yield y) { int ret = 0; + + /* once bucket versioning is enabled, the non-current entries with + * instance empty should have instance set to "null" to be able + * to correctly read its olh version entry. + */ + rgw_obj_key& obj_key = get_key(); + rgw::sal::Bucket* bucket = get_bucket(); + + if (obj_key.instance.empty() && bucket->versioned()) { + obj_key.instance = "null"; + } + real_time read_mtime; std::unique_ptr read_op(get_read_op()); read_op->params.lastmod = &read_mtime; - ldpp_dout(dpp, 20) << "Entering handle_obj_expiry Obj:" << get_key() << dendl; - ret = read_op->prepare(y, dpp); if (ret < 0) { ldpp_dout(dpp, -1) << "handle_obj_expiry Obj:" << get_key() << @@ -3093,6 +3103,10 @@ int RadosObject::handle_obj_expiry(const DoutPrefixProvider* dpp, optional_yield return ret; } + if (obj_key.instance == "null") { + obj_key.instance.clear(); + } + set_atomic(); map attrs = get_attrs(); RGWRados::Object op_target(store->getRados(), bucket->get_info(), *rados_ctx, get_obj()); -- 2.39.5