From 80aaddba43868d575314a8675febfcfa31c060de Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Tue, 31 Aug 2021 09:17:55 -0400 Subject: [PATCH] RGW - Zipper bucket/object lifecycle in librgw s->bucket and s->object need to have a single lifecycle across an entire op, never replaced, since lots of things use pointers to them. Make sure s->bucket is created in read_permissions(), and that s->object is created with the correct bucket. Signed-off-by: Daniel Gryniewicz --- src/rgw/rgw_file.h | 7 +++---- src/rgw/rgw_op.cc | 5 ----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index 0ccd2a5794189..bdbfa56021ae4 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -2631,11 +2631,10 @@ public: state->op = OP_PUT; src_bucket_name = src_parent->bucket_name(); - // need s->src_bucket_name? + state->src_bucket_name = src_bucket_name; dest_bucket_name = dst_parent->bucket_name(); - // need s->bucket.name? + state->bucket_name = dest_bucket_name; dest_obj_name = dst_parent->format_child_name(dst_name, false); - // need s->object_name? int rc = valid_s3_object_name(dest_obj_name); if (rc != 0) @@ -2667,7 +2666,7 @@ public: dest_policy = s3policy; /* src_object required before RGWCopyObj::verify_permissions() */ rgw_obj_key k = rgw_obj_key(src_name); - src_object = rgwlib.get_store()->get_object(k); + src_object = s->bucket->get_object(k); s->object = src_object->clone(); // needed to avoid trap at rgw_op.cc:5150 return ret; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 64f4fc0e64030..c5c7a51a62b1d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5368,11 +5368,6 @@ void RGWCopyObj::execute(optional_yield y) if (init_common() < 0) return; - if (! s->object->get_bucket()) { - s->bucket = src_object->get_bucket()->clone(); - s->object->set_bucket(s->bucket.get()); - } - // make reservation for notification if needed std::unique_ptr res = store->get_notification(s->object.get(), s, rgw::notify::ObjectCreatedCopy); -- 2.39.5