From c21bcebb3896b8f73ad24efc367a6f7817138c29 Mon Sep 17 00:00:00 2001 From: Zhang Shaowen Date: Tue, 19 Jun 2018 14:10:17 +0800 Subject: [PATCH] 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) --- src/rgw/rgw_lc.cc | 19 +++++++++++++++---- src/rgw/rgw_lc.h | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 5aa57d384dc7f..097ecd2ab9dd9 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 a8ab9c461c6c5..fae4db6049f14 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); }; -- 2.39.5