From: Zhang Shaowen Date: Tue, 19 Jun 2018 06:10:17 +0000 (+0800) Subject: rgw: The delete markers generated by object expiration should have owner X-Git-Tag: v13.2.2~89^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F23541%2Fhead;p=ceph.git rgw: The delete markers generated by object expiration should have owner attribute. Fixes: http://tracker.ceph.com/issues/24568 Signed-off-by: Zhang Shaowen (cherry picked from commit 63c37dfefbcfe87dca70237560483caa1fc67ef7) --- diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 5aa57d384dc..097ecd2ab9d 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -272,7 +272,7 @@ bool RGWLC::obj_has_expired(ceph::real_time mtime, int days) return (timediff >= cmp); } -int RGWLC::remove_expired_obj(RGWBucketInfo& bucket_info, rgw_obj_key obj_key, bool remove_indeed) +int RGWLC::remove_expired_obj(RGWBucketInfo& bucket_info, rgw_obj_key obj_key, const string& owner, const string& owner_display_name, bool remove_indeed) { if (remove_indeed) { return rgw_remove_object(store, bucket_info, bucket_info.bucket, obj_key); @@ -280,7 +280,18 @@ int RGWLC::remove_expired_obj(RGWBucketInfo& bucket_info, rgw_obj_key obj_key, b obj_key.instance.clear(); RGWObjectCtx rctx(store); rgw_obj obj(bucket_info.bucket, obj_key); - return store->delete_obj(rctx, bucket_info, obj, bucket_info.versioning_status()); + ACLOwner obj_owner; + obj_owner.set_id(rgw_user {owner}); + obj_owner.set_name(owner_display_name); + + RGWRados::Object del_target(store, bucket_info, rctx, obj); + RGWRados::Object::Delete del_op(&del_target); + + del_op.params.bucket_owner = bucket_info.owner; + del_op.params.versioning_status = bucket_info.versioning_status(); + del_op.params.obj_owner = obj_owner; + + return del_op.delete_obj(); } } @@ -460,7 +471,7 @@ int RGWLC::bucket_lc_process(string& shard_id) ldout(cct, 20) << __func__ << "() skipping removal: state->mtime " << state->mtime << " obj->mtime " << obj_iter->meta.mtime << dendl; continue; } - ret = remove_expired_obj(bucket_info, obj_iter->key, true); + ret = remove_expired_obj(bucket_info, obj_iter->key, obj_iter->meta.owner, obj_iter->meta.owner_display_name, true); if (ret < 0) { ldout(cct, 0) << "ERROR: remove_expired_obj " << dendl; } else { @@ -565,7 +576,7 @@ int RGWLC::bucket_lc_process(string& shard_id) if (state->mtime != obj_iter->meta.mtime)//Check mtime again to avoid delete a recently update object as much as possible continue; } - ret = remove_expired_obj(bucket_info, obj_iter->key, remove_indeed); + ret = remove_expired_obj(bucket_info, obj_iter->key, obj_iter->meta.owner, obj_iter->meta.owner_display_name, remove_indeed); if (ret < 0) { ldout(cct, 0) << "ERROR: remove_expired_obj " << dendl; } else { diff --git a/src/rgw/rgw_lc.h b/src/rgw/rgw_lc.h index a8ab9c461c6..fae4db6049f 100644 --- a/src/rgw/rgw_lc.h +++ b/src/rgw/rgw_lc.h @@ -381,7 +381,7 @@ class RGWLC { void stop_processor(); private: - int remove_expired_obj(RGWBucketInfo& bucket_info, rgw_obj_key obj_key, bool remove_indeed = true); + int remove_expired_obj(RGWBucketInfo& bucket_info, rgw_obj_key obj_key, const string& owner, const string& owner_display_name, bool remove_indeed = true); bool obj_has_expired(ceph::real_time mtime, int days); int handle_multipart_expiration(RGWRados::Bucket *target, const map& prefix_map); };