diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 9b2e4c7de40..234aa3f607b 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -3834,6 +3834,7 @@ void RGWPostObj::execute() ldpp_dout(this, 15) << "supplied_md5=" << supplied_md5 << dendl; } + rgw_obj obj(s->bucket, get_current_filename()); if (s->bucket_info.versioning_enabled()) { store->gen_rand_obj_instance_name(&obj); @@ -3842,6 +3843,7 @@ void RGWPostObj::execute() rgw::AioThrottle aio(s->cct->_conf->rgw_put_obj_min_window_size); using namespace rgw::putobj; AtomicObjectProcessor processor(&aio, store, s->bucket_info, + nullptr, s->bucket_owner.get_id(), *static_cast(s->obj_ctx), obj, 0, s->req_id); @@ -4707,6 +4709,7 @@ void RGWCopyObj::execute() src_obj, dest_bucket_info, src_bucket_info, + nullptr, /* dest placement rule */ &src_mtime, &mtime, mod_ptr, @@ -6569,7 +6572,7 @@ int RGWBulkUploadOp::handle_file(const boost::string_ref path, rgw::AioThrottle aio(store->ctx()->_conf->rgw_put_obj_min_window_size); using namespace rgw::putobj; - AtomicObjectProcessor processor(&aio, store, binfo, bowner.get_id(), + AtomicObjectProcessor processor(&aio, store, binfo, nullptr, bowner.get_id(), obj_ctx, obj, 0, s->req_id); op_ret = processor.prepare(); diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 361d5133627..bb6bc82ff29 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -211,6 +211,7 @@ int AtomicObjectProcessor::prepare() r = manifest_gen.create_begin(store->ctx(), &manifest, bucket_info.placement_rule, + ptail_placement_rule, head_obj.bucket, head_obj); if (r < 0) { return r; @@ -330,6 +331,7 @@ int MultipartObjectProcessor::prepare_head() { int r = manifest_gen.create_begin(store->ctx(), &manifest, bucket_info.placement_rule, + ptail_placement_rule, target_obj.bucket, target_obj); if (r < 0) { return r; diff --git a/src/rgw/rgw_putobj_processor.h b/src/rgw/rgw_putobj_processor.h index e1843cc36cc..cb6948f43b0 100644 --- a/src/rgw/rgw_putobj_processor.h +++ b/src/rgw/rgw_putobj_processor.h @@ -114,6 +114,7 @@ class ManifestObjectProcessor : public HeadObjectProcessor, protected: RGWRados *const store; const RGWBucketInfo& bucket_info; + const string *ptail_placement_rule; const rgw_user& owner; RGWObjectCtx& obj_ctx; rgw_obj head_obj; @@ -130,10 +131,12 @@ class ManifestObjectProcessor : public HeadObjectProcessor, public: ManifestObjectProcessor(Aio *aio, RGWRados *store, const RGWBucketInfo& bucket_info, + const string *ptail_placement_rule, const rgw_user& owner, RGWObjectCtx& obj_ctx, const rgw_obj& head_obj) : HeadObjectProcessor(0), - store(store), bucket_info(bucket_info), owner(owner), + store(store), bucket_info(bucket_info), + ptail_placement_rule(ptail_placement_rule), owner(owner), obj_ctx(obj_ctx), head_obj(head_obj), writer(aio, store, bucket_info, obj_ctx, head_obj), chunk(&writer, 0), stripe(&chunk, this, 0) @@ -151,11 +154,14 @@ class AtomicObjectProcessor : public ManifestObjectProcessor { int process_first_chunk(bufferlist&& data, DataProcessor **processor) override; public: AtomicObjectProcessor(Aio *aio, RGWRados *store, - const RGWBucketInfo& bucket_info, const rgw_user& owner, + const RGWBucketInfo& bucket_info, + const string *ptail_placement_rule, + const rgw_user& owner, RGWObjectCtx& obj_ctx, const rgw_obj& head_obj, std::optional olh_epoch, const std::string& unique_tag) - : ManifestObjectProcessor(aio, store, bucket_info, owner, obj_ctx, head_obj), + : ManifestObjectProcessor(aio, store, bucket_info, ptail_placement_rule, + owner, obj_ctx, head_obj), olh_epoch(olh_epoch), unique_tag(unique_tag) {} @@ -190,11 +196,13 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { public: MultipartObjectProcessor(Aio *aio, RGWRados *store, const RGWBucketInfo& bucket_info, + const string *ptail_placement_rule, const rgw_user& owner, RGWObjectCtx& obj_ctx, const rgw_obj& head_obj, const std::string& upload_id, uint64_t part_num, const std::string& part_num_str) - : ManifestObjectProcessor(aio, store, bucket_info, owner, obj_ctx, head_obj), + : ManifestObjectProcessor(aio, store, bucket_info, ptail_placement_rule, + owner, obj_ctx, head_obj), target_obj(head_obj), upload_id(upload_id), part_num(part_num), part_num_str(part_num_str), mp(head_obj.key.name, upload_id) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 85dccc3e58b..271354a9281 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -307,12 +307,19 @@ void RGWObjManifest::obj_iterator::operator++() update_location(); } -int RGWObjManifest::generator::create_begin(CephContext *cct, RGWObjManifest *_m, const string& placement_rule, const rgw_bucket& _b, const rgw_obj& _obj) +int RGWObjManifest::generator::create_begin(CephContext *cct, RGWObjManifest *_m, + const string& head_placement_rule, + const string *tail_placement_rule, + const rgw_bucket& _b, const rgw_obj& _obj) { manifest = _m; - manifest->set_tail_placement(placement_rule, _b); - manifest->set_head(placement_rule, _obj, 0); + if (!tail_placement_rule) { + tail_placement_rule = &head_placement_rule; + } + + manifest->set_tail_placement(*tail_placement_rule, _b); + manifest->set_head(head_placement_rule, _obj, 0); last_ofs = 0; if (manifest->get_prefix().empty()) { @@ -3377,6 +3384,7 @@ int RGWRados::swift_versioning_copy(RGWObjectCtx& obj_ctx, obj, dest_bucket_info, bucket_info, + nullptr, /* const string *tail_rule */ NULL, /* time_t *src_mtime */ NULL, /* time_t *mtime */ NULL, /* const time_t *mod_ptr */ @@ -3468,6 +3476,7 @@ int RGWRados::swift_versioning_restore(RGWSysObjectCtx& sysobj_ctx, archive_obj, /* src obj */ bucket_info, /* dest bucket info */ archive_binfo, /* src bucket info */ + nullptr, /* const string *ptail_rule */ nullptr, /* time_t *src_mtime */ nullptr, /* time_t *mtime */ nullptr, /* const time_t *mod_ptr */ @@ -3965,7 +3974,7 @@ int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj) attrset.erase(RGW_ATTR_ID_TAG); attrset.erase(RGW_ATTR_TAIL_TAG); - return copy_obj_data(rctx, dest_bucket_info, read_op, obj_size - 1, obj, NULL, mtime, attrset, + return copy_obj_data(rctx, dest_bucket_info, nullptr, read_op, obj_size - 1, obj, NULL, mtime, attrset, 0, real_time(), NULL); } @@ -4215,7 +4224,9 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, rgw::AioThrottle aio(cct->_conf->rgw_put_obj_min_window_size); using namespace rgw::putobj; - AtomicObjectProcessor processor(&aio, this, dest_bucket_info, user_id, + string *ptail_rule{nullptr}; +#warning FIXME ptail_rule + AtomicObjectProcessor processor(&aio, this, dest_bucket_info, ptail_rule, user_id, obj_ctx, dest_obj, olh_epoch, tag); int ret = processor.prepare(); if (ret < 0) { @@ -4470,6 +4481,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, rgw_obj& src_obj, RGWBucketInfo& dest_bucket_info, RGWBucketInfo& src_bucket_info, + const string *ptail_rule, real_time *src_mtime, real_time *mtime, const real_time *mod_ptr, @@ -4582,11 +4594,27 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, rgw_pool src_pool; rgw_pool dest_pool; - if (!get_obj_data_pool(src_bucket_info.placement_rule, src_obj, &src_pool)) { + + const string *src_rule{nullptr}; + + if (astate->has_manifest) { + src_rule = &astate->manifest.get_tail_placement().placement_rule; + } + + if (!src_rule || src_rule->empty()) { + src_rule = &src_bucket_info.placement_rule; + } + + if (!ptail_rule) { + ptail_rule = &dest_bucket_info.placement_rule; + } + + if (!get_obj_data_pool(*src_rule, src_obj, &src_pool)) { ldout(cct, 0) << "ERROR: failed to locate data pool for " << src_obj << dendl; return -EIO; } - if (!get_obj_data_pool(dest_bucket_info.placement_rule, dest_obj, &dest_pool)) { + + if (!get_obj_data_pool(*ptail_rule, dest_obj, &dest_pool)) { ldout(cct, 0) << "ERROR: failed to locate data pool for " << dest_obj << dendl; return -EIO; } @@ -4619,7 +4647,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, if (copy_data) { /* refcounting tail wouldn't work here, just copy the data */ attrs.erase(RGW_ATTR_TAIL_TAG); - return copy_obj_data(obj_ctx, dest_bucket_info, read_op, obj_size - 1, dest_obj, + return copy_obj_data(obj_ctx, dest_bucket_info, ptail_rule, read_op, obj_size - 1, dest_obj, mtime, real_time(), attrs, olh_epoch, delete_at, petag); } @@ -4736,6 +4764,7 @@ done_ret: int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, RGWBucketInfo& dest_bucket_info, + const string *ptail_rule, RGWRados::Object::Read& read_op, off_t end, const rgw_obj& dest_obj, real_time *mtime, @@ -4750,7 +4779,7 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, rgw::AioThrottle aio(cct->_conf->rgw_put_obj_min_window_size); using namespace rgw::putobj; - AtomicObjectProcessor processor(&aio, this, dest_bucket_info, + AtomicObjectProcessor processor(&aio, this, dest_bucket_info, ptail_rule, dest_bucket_info.owner, obj_ctx, dest_obj, olh_epoch, tag); int ret = processor.prepare(); diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 8d759ec8b4d..bb7d9d5df03 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -807,7 +807,11 @@ public: public: generator() : manifest(NULL), last_ofs(0), cur_part_ofs(0), cur_part_id(0), cur_stripe(0), cur_stripe_size(0) {} - int create_begin(CephContext *cct, RGWObjManifest *manifest, const string& placement_rule, const rgw_bucket& bucket, const rgw_obj& obj); + int create_begin(CephContext *cct, RGWObjManifest *manifest, + const string& head_placement_rule, + const string *tail_placement_rule, + const rgw_bucket& bucket, + const rgw_obj& obj); int create_next(uint64_t ofs); @@ -1934,6 +1938,7 @@ public: rgw_obj& src_obj, RGWBucketInfo& dest_bucket_info, RGWBucketInfo& src_bucket_info, + const string *ptail_rule, ceph::real_time *src_mtime, ceph::real_time *mtime, const ceph::real_time *mod_ptr, @@ -1955,6 +1960,7 @@ public: int copy_obj_data(RGWObjectCtx& obj_ctx, RGWBucketInfo& dest_bucket_info, + const string *ptail_rule, RGWRados::Object::Read& read_op, off_t end, const rgw_obj& dest_obj, ceph::real_time *mtime,