From: Casey Bodley Date: Tue, 9 Nov 2021 03:13:39 +0000 (-0500) Subject: rgw/rados: index transactions pass remove_objs to cancel() too X-Git-Tag: v16.2.13~120^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5bd91f42e04402cce15b40c8ae6e6af20664abca;p=ceph.git 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 (cherry picked from commit b848ccae96169ff697ab0eed5edf6e3e8f898eb7) Conflicts: src/rgw/rgw_rados.h 'using namespace std' not backported --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 4926d2e3462..e9989f430c8 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3252,7 +3252,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; } @@ -5207,7 +5207,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; } @@ -5905,7 +5905,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; } @@ -6245,7 +6245,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; @@ -6254,7 +6255,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); }); /* @@ -8387,13 +8388,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 ecc719b87f9..3e470fabaad 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1007,7 +1007,8 @@ public: int64_t poolid, uint64_t epoch, ceph::real_time& removed_mtime, /* mtime of removed object */ list *remove_objs); - int cancel(const DoutPrefixProvider *dpp); + int cancel(const DoutPrefixProvider *dpp, + std::list *remove_objs); const string *get_optag() { return &optag; } @@ -1414,7 +1415,9 @@ public: RGWObjCategory category, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_del(BucketShard& bs, string& tag, int64_t pool, uint64_t epoch, rgw_obj& obj, ceph::real_time& removed_mtime, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); - int cls_obj_complete_cancel(BucketShard& bs, 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 =