From b848ccae96169ff697ab0eed5edf6e3e8f898eb7 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Mon, 8 Nov 2021 22:13:39 -0500 Subject: [PATCH] rgw/rados: index transactions pass remove_objs to cancel() too whenever an index transaction uses remove_objs for complete(), it also needs to pass them for cancel() to avoid leaking index entries Signed-off-by: Casey Bodley --- src/rgw/rgw_rados.cc | 17 ++++++++++------- src/rgw/rgw_rados.h | 7 +++++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index bfab1e0f1de7b..f53e7da425579 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3339,7 +3339,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, return 0; done_cancel: - int ret = index_op->cancel(dpp); + int ret = index_op->cancel(dpp, meta.remove_objs); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: index_op.cancel()() returned ret=" << ret << dendl; } @@ -5324,7 +5324,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi } /* other than that, no need to propagate error */ } else { - int ret = index_op.cancel(dpp); + int ret = index_op.cancel(dpp, params.remove_objs); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: index_op.cancel() returned ret=" << ret << dendl; } @@ -6022,7 +6022,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, void *ctx, const RGWBucke mtime, etag, content_type, storage_class, &acl_bl, RGWObjCategory::Main, NULL); } else { - int ret = index_op.cancel(dpp); + int ret = index_op.cancel(dpp, nullptr); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: complete_update_index_cancel() returned ret=" << ret << dendl; } @@ -6327,7 +6327,8 @@ int RGWRados::Bucket::UpdateIndex::complete_del(const DoutPrefixProvider *dpp, } -int RGWRados::Bucket::UpdateIndex::cancel(const DoutPrefixProvider *dpp) +int RGWRados::Bucket::UpdateIndex::cancel(const DoutPrefixProvider *dpp, + list *remove_objs) { if (blind) { return 0; @@ -6336,7 +6337,7 @@ int RGWRados::Bucket::UpdateIndex::cancel(const DoutPrefixProvider *dpp) BucketShard *bs; int ret = guard_reshard(dpp, &bs, [&](BucketShard *bs) -> int { - return store->cls_obj_complete_cancel(*bs, optag, obj, bilog_flags, zones_trace); + return store->cls_obj_complete_cancel(*bs, optag, obj, remove_objs, bilog_flags, zones_trace); }); /* @@ -8415,13 +8416,15 @@ int RGWRados::cls_obj_complete_del(BucketShard& bs, string& tag, bilog_flags, zones_trace); } -int RGWRados::cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace) +int RGWRados::cls_obj_complete_cancel(BucketShard& bs, string& tag, rgw_obj& obj, + list *remove_objs, + uint16_t bilog_flags, rgw_zone_set *zones_trace) { rgw_bucket_dir_entry ent; obj.key.get_index_key(&ent.key); return cls_obj_complete_op(bs, obj, CLS_RGW_OP_CANCEL, tag, -1 /* pool id */, 0, ent, - RGWObjCategory::None, NULL, bilog_flags, + RGWObjCategory::None, remove_objs, bilog_flags, zones_trace); } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index c34ecfdc3085b..e59e0460e9951 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -950,7 +950,8 @@ public: int64_t poolid, uint64_t epoch, ceph::real_time& removed_mtime, /* mtime of removed object */ std::list *remove_objs); - int cancel(const DoutPrefixProvider *dpp); + int cancel(const DoutPrefixProvider *dpp, + std::list *remove_objs); const std::string *get_optag() { return &optag; } @@ -1362,7 +1363,9 @@ public: RGWObjCategory category, std::list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_del(BucketShard& bs, std::string& tag, int64_t pool, uint64_t epoch, rgw_obj& obj, ceph::real_time& removed_mtime, std::list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); - int cls_obj_complete_cancel(BucketShard& bs, std::string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); + int cls_obj_complete_cancel(BucketShard& bs, std::string& tag, rgw_obj& obj, + std::list *remove_objs, + uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_set_bucket_tag_timeout(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, uint64_t timeout); using ent_map_t = -- 2.39.5