@@ -2899,7 +2899,6 @@ int RadosObject::restore_obj_from_cloud(Bucket* bucket,
28992899 rgw_bucket_dir_entry& o,
29002900 CephContext* cct,
29012901 RGWObjTier& tier_config,
2902- real_time& mtime,
29032902 uint64_t olh_epoch,
29042903 std::optional<uint64_t > days,
29052904 const DoutPrefixProvider* dpp,
@@ -2918,16 +2917,6 @@ int RadosObject::restore_obj_from_cloud(Bucket* bucket,
29182917 int ret = 0 ;
29192918 string src_storage_class = o.meta .storage_class ; // or take src_placement also as input
29202919
2921- // fetch mtime of the object
2922- std::unique_ptr<rgw::sal::Object::ReadOp> read_op (get_read_op ());
2923- read_op->params .lastmod = &mtime;
2924-
2925- ret = read_op->prepare (y, dpp);
2926- if (ret < 0 ) {
2927- ldpp_dout (dpp, 0 ) << " Restoring object(" << o.key << " ): read_op failed ret=" << ret << dendl;
2928- return ret;
2929- }
2930-
29312920 if (bucket_name.empty ()) {
29322921 bucket_name = " rgwx-" + zonegroup.get_name () + " -" + tier->get_storage_class () +
29332922 " -cloud-bucket" ;
@@ -2968,7 +2957,7 @@ int RadosObject::restore_obj_from_cloud(Bucket* bucket,
29682957 ret = store->getRados ()->restore_obj_from_cloud (tier_ctx, *rados_ctx,
29692958 bucket->get_info (), get_obj (), placement_rule,
29702959 tier_config,
2971- mtime, olh_epoch, days, dpp, y, flags & FLAG_LOG_OP);
2960+ olh_epoch, days, dpp, y, flags & FLAG_LOG_OP);
29722961
29732962 if (ret < 0 ) { // failed to restore
29742963 ldpp_dout (dpp, 0 ) << " Restoring object(" << o.key << " ) from the cloud endpoint(" << endpoint << " ) failed, ret=" << ret << dendl;
@@ -3092,18 +3081,32 @@ int RadosObject::set_cloud_restore_status(const DoutPrefixProvider* dpp,
30923081 */
30933082int RadosObject::handle_obj_expiry (const DoutPrefixProvider* dpp, optional_yield y) {
30943083 int ret = 0 ;
3084+
3085+ /* once bucket versioning is enabled, the non-current entries with
3086+ * instance empty should have instance set to "null" to be able
3087+ * to correctly read its olh version entry.
3088+ */
3089+ rgw_obj_key& obj_key = get_key ();
3090+ rgw::sal::Bucket* bucket = get_bucket ();
3091+
3092+ if (obj_key.instance .empty () && bucket->versioned ()) {
3093+ obj_key.instance = " null" ;
3094+ }
3095+
30953096 real_time read_mtime;
30963097 std::unique_ptr<rgw::sal::Object::ReadOp> read_op (get_read_op ());
30973098 read_op->params .lastmod = &read_mtime;
3098- ldpp_dout (dpp, 20 ) << " Entering handle_obj_expiry Obj:" << get_key () << dendl;
3099-
31003099 ret = read_op->prepare (y, dpp);
31013100 if (ret < 0 ) {
31023101 ldpp_dout (dpp, -1 ) << " handle_obj_expiry Obj:" << get_key () <<
31033102 " , read_op failed ret=" << ret << dendl;
31043103 return ret;
31053104 }
31063105
3106+ if (obj_key.instance == " null" ) {
3107+ obj_key.instance .clear ();
3108+ }
3109+
31073110 set_atomic ();
31083111 map<string, bufferlist> attrs = get_attrs ();
31093112 RGWRados::Object op_target (store->getRados (), bucket->get_info (), *rados_ctx, get_obj ());
@@ -3140,7 +3143,7 @@ int RadosObject::handle_obj_expiry(const DoutPrefixProvider* dpp, optional_yield
31403143 RGWObjManifest *pmanifest;
31413144 pmanifest = &m;
31423145
3143- Object* head_obj = (Object*)this ;
3146+ Object* head_obj = (Object*)this ;
31443147 RGWObjTier tier_config;
31453148 m.get_tier_config (&tier_config);
31463149
@@ -3151,12 +3154,21 @@ int RadosObject::handle_obj_expiry(const DoutPrefixProvider* dpp, optional_yield
31513154 pmanifest->set_obj_size (0 );
31523155 obj_op.meta .manifest = pmanifest;
31533156
3157+ auto v_iter = attrs.find (RGW_ATTR_RESTORE_VERSIONED_EPOCH);
3158+ if (v_iter != attrs.end ()) {
3159+ uint64_t versioned_epoch;
3160+ using ceph::decode;
3161+ decode (versioned_epoch, v_iter->second );
3162+ obj_op.meta .olh_epoch = versioned_epoch;
3163+ }
3164+
31543165 // erase restore attrs
31553166 attrs.erase (RGW_ATTR_RESTORE_STATUS);
31563167 attrs.erase (RGW_ATTR_RESTORE_TYPE);
31573168 attrs.erase (RGW_ATTR_RESTORE_TIME);
31583169 attrs.erase (RGW_ATTR_RESTORE_EXPIRY_DATE);
31593170 attrs.erase (RGW_ATTR_CLOUDTIER_STORAGE_CLASS);
3171+ attrs.erase (RGW_ATTR_RESTORE_VERSIONED_EPOCH);
31603172
31613173 bufferlist bl;
31623174 bl.append (tier_config.name );
0 commit comments