From: Yuval Lifshitz Date: Wed, 20 Sep 2023 09:46:54 +0000 (+0000) Subject: rgw: adding request context structure X-Git-Tag: v19.0.0~280^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c992ab86d644410c4a03b48d4a7b372dbc2efd02;p=ceph.git rgw: adding request context structure this structure should be created at the frontend and trickle all the way to the RADOS layer. holding: dout prefix, optional yield and trace. in this commit, so far it was only added to the "complete()" sal interface, and to the "write_meta()" rados interface. in the future, it should be added to more sal interfaces, replacing the current way where dpp and optional yield are passed as sepearte arguments to all functions. in addition, if more information would be needed, it should be possible to add that information to the request context struct without changing many function prototypes basic test instructions: https://gist.github.com/yuvalif/1c7f1e80126bed5fa79345efb27fe1b1 Signed-off-by: Yuval Lifshitz --- diff --git a/src/common/tracer.h b/src/common/tracer.h index 8a19db39021a..94efedbed6e1 100644 --- a/src/common/tracer.h +++ b/src/common/tracer.h @@ -67,7 +67,8 @@ struct jspan_context { jspan_context(bool sampled_flag, bool is_remote) {} }; -struct span_stub { +namespace opentelemetry::trace { +struct Span { jspan_context _ctx; template void SetAttribute(std::string_view key, const T& value) const noexcept {} @@ -78,17 +79,21 @@ struct span_stub { void UpdateName(std::string_view) {} bool IsRecording() { return false; } }; +} class jspan { - span_stub span; - public: - span_stub& operator*() { return span; } - const span_stub& operator*() const { return span; } + opentelemetry::trace::Span span; +public: + opentelemetry::trace::Span& operator*() { return span; } + const opentelemetry::trace::Span& operator*() const { return span; } - span_stub* operator->() { return &span; } - const span_stub* operator->() const { return &span; } + opentelemetry::trace::Span* operator->() { return &span; } + const opentelemetry::trace::Span* operator->() const { return &span; } operator bool() const { return false; } + + opentelemetry::trace::Span* get() { return &span; } + const opentelemetry::trace::Span* get() const { return &span; } }; namespace tracing { diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.cc b/src/rgw/driver/d4n/rgw_sal_d4n.cc index ff2ed7d9a204..3195d87eac42 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.cc +++ b/src/rgw/driver/d4n/rgw_sal_d4n.cc @@ -445,7 +445,7 @@ int D4NFilterWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { cache_block* temp_cache_block = filter->get_cache_block(); RGWBlockDirectory* temp_block_dir = filter->get_block_dir(); @@ -467,9 +467,9 @@ int D4NFilterWriter::complete(size_t accounted_size, const std::string& etag, RGWObjState* astate; int ret = next->complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, if_match, if_nomatch, user_data, zones_trace, - canceled, y); - obj->get_obj_attrs(y, save_dpp, NULL); - obj->get_obj_state(save_dpp, &astate, y); + canceled, rctx); + obj->get_obj_attrs(rctx.y, save_dpp, NULL); + obj->get_obj_state(save_dpp, &astate, rctx.y); /* Append additional metadata to attributes */ rgw::sal::Attrs baseAttrs = obj->get_attrs(); diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.h b/src/rgw/driver/d4n/rgw_sal_d4n.h index 62c13f0abed6..5a2cd88896db 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.h +++ b/src/rgw/driver/d4n/rgw_sal_d4n.h @@ -191,7 +191,7 @@ class D4NFilterWriter : public FilterWriter { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; bool is_atomic() { return atomic; }; const DoutPrefixProvider* dpp() { return save_dpp; } }; diff --git a/src/rgw/driver/daos/rgw_sal_daos.cc b/src/rgw/driver/daos/rgw_sal_daos.cc index 46db3dd654ca..73eec5b3e09c 100644 --- a/src/rgw/driver/daos/rgw_sal_daos.cc +++ b/src/rgw/driver/daos/rgw_sal_daos.cc @@ -2047,7 +2047,7 @@ int DaosMultipartWriter::complete( ceph::real_time set_mtime, std::map& attrs, ceph::real_time delete_at, const char* if_match, const char* if_nomatch, const std::string* user_data, rgw_zone_set* zones_trace, bool* canceled, - optional_yield y) { + const req_context& rctx) { ldpp_dout(dpp, 20) << "DaosMultipartWriter::complete(): enter part=" << part_num_str << dendl; diff --git a/src/rgw/driver/daos/rgw_sal_daos.h b/src/rgw/driver/daos/rgw_sal_daos.h index 0eaf495d2e2b..429c6160488d 100644 --- a/src/rgw/driver/daos/rgw_sal_daos.h +++ b/src/rgw/driver/daos/rgw_sal_daos.h @@ -748,7 +748,7 @@ class DaosAtomicWriter : public StoreWriter { ceph::real_time delete_at, const char* if_match, const char* if_nomatch, const std::string* user_data, rgw_zone_set* zones_trace, bool* canceled, - optional_yield y) override; + const req_context& rctx) override; }; class DaosMultipartWriter : public StoreWriter { diff --git a/src/rgw/driver/motr/rgw_sal_motr.cc b/src/rgw/driver/motr/rgw_sal_motr.cc index 06df127594e7..83c6153a92a5 100644 --- a/src/rgw/driver/motr/rgw_sal_motr.cc +++ b/src/rgw/driver/motr/rgw_sal_motr.cc @@ -2355,7 +2355,7 @@ int MotrAtomicWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { int rc = 0; diff --git a/src/rgw/driver/motr/rgw_sal_motr.h b/src/rgw/driver/motr/rgw_sal_motr.h index eee843d7effa..ce5fc2b95b1f 100644 --- a/src/rgw/driver/motr/rgw_sal_motr.h +++ b/src/rgw/driver/motr/rgw_sal_motr.h @@ -814,7 +814,7 @@ class MotrAtomicWriter : public StoreWriter { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; unsigned populate_bvec(unsigned len, bufferlist::iterator &bi); void cleanup(); diff --git a/src/rgw/driver/posix/rgw_sal_posix.cc b/src/rgw/driver/posix/rgw_sal_posix.cc index 052471562e43..40091d06d0f9 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.cc +++ b/src/rgw/driver/posix/rgw_sal_posix.cc @@ -2914,7 +2914,7 @@ int POSIXMultipartWriter::complete(size_t accounted_size, const std::string& eta const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { int ret; POSIXUploadPartInfo info; @@ -2945,16 +2945,16 @@ int POSIXMultipartWriter::complete(size_t accounted_size, const std::string& eta attrs[RGW_POSIX_ATTR_MPUPLOAD] = bl; for (auto& attr : attrs) { - ret = obj->write_attr(dpp, y, attr.first, attr.second); + ret = obj->write_attr(rctx.dpp, rctx.y, attr.first, attr.second); if (ret < 0) { - ldpp_dout(dpp, 20) << "ERROR: failed writing attr " << attr.first << dendl; + ldpp_dout(rctx.dpp, 20) << "ERROR: failed writing attr " << attr.first << dendl; return ret; } } ret = obj->close(); if (ret < 0) { - ldpp_dout(dpp, 20) << "ERROR: failed closing file" << dendl; + ldpp_dout(rctx.dpp, 20) << "ERROR: failed closing file" << dendl; return ret; } @@ -2981,7 +2981,7 @@ int POSIXAtomicWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { int ret; @@ -3023,14 +3023,14 @@ int POSIXAtomicWriter::complete(size_t accounted_size, const std::string& etag, attrs[RGW_POSIX_ATTR_OWNER] = bl; for (auto attr : attrs) { - ret = obj.write_attr(dpp, y, attr.first, attr.second); + ret = obj.write_attr(rctx.dpp, rctx.y, attr.first, attr.second); if (ret < 0) { - ldpp_dout(dpp, 20) << "ERROR: POSIXAtomicWriter failed writing attr " << attr.first << dendl; + ldpp_dout(rctx.dpp, 20) << "ERROR: POSIXAtomicWriter failed writing attr " << attr.first << dendl; return ret; } } - ret = obj.link_temp_file(dpp, y); + ret = obj.link_temp_file(rctx.dpp, rctx.y); if (ret < 0) { ldpp_dout(dpp, 20) << "ERROR: POSIXAtomicWriter failed writing temp file" << dendl; return ret; @@ -3038,7 +3038,7 @@ int POSIXAtomicWriter::complete(size_t accounted_size, const std::string& etag, ret = obj.close(); if (ret < 0) { - ldpp_dout(dpp, 20) << "ERROR: POSIXAtomicWriter failed closing file" << dendl; + ldpp_dout(rctx.dpp, 20) << "ERROR: POSIXAtomicWriter failed closing file" << dendl; return ret; } diff --git a/src/rgw/driver/posix/rgw_sal_posix.h b/src/rgw/driver/posix/rgw_sal_posix.h index a2a5e5fdda9d..739e7ef7a610 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.h +++ b/src/rgw/driver/posix/rgw_sal_posix.h @@ -625,7 +625,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class POSIXMultipartWriter : public StoreWriter { @@ -664,7 +664,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index 6556d116b8f4..1baff16ff42e 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -752,6 +752,7 @@ int RGWAsyncFetchRemoteObj::_send_request(const DoutPrefixProvider *dpp) std::string etag; std::optional bytes_transferred; + const req_context rctx{dpp, null_yield, nullptr}; int r = store->getRados()->fetch_remote_obj(obj_ctx, user_id.value_or(rgw_user()), NULL, /* req_info */ @@ -778,8 +779,8 @@ int RGWAsyncFetchRemoteObj::_send_request(const DoutPrefixProvider *dpp) &etag, /* string *petag, */ NULL, /* void (*progress_cb)(off_t, void *), */ NULL, /* void *progress_data*); */ - dpp, - filter.get(), null_yield, + rctx, + filter.get(), stat_follow_olh, stat_dest_obj, source_trace_entry, diff --git a/src/rgw/driver/rados/rgw_putobj_processor.cc b/src/rgw/driver/rados/rgw_putobj_processor.cc index 9eb2ef266683..65fbd5791d5e 100644 --- a/src/rgw/driver/rados/rgw_putobj_processor.cc +++ b/src/rgw/driver/rados/rgw_putobj_processor.cc @@ -341,7 +341,8 @@ int AtomicObjectProcessor::complete(size_t accounted_size, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, - bool *pcanceled, optional_yield y) + bool *pcanceled, + const req_context& rctx) { int r = writer.drain(); if (r < 0) { @@ -378,7 +379,7 @@ int AtomicObjectProcessor::complete(size_t accounted_size, read_cloudtier_info_from_attrs(attrs, obj_op.meta.category, manifest); - r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y); + r = obj_op.write_meta(actual_size, accounted_size, attrs, rctx); if (r < 0) { if (r == -ETIMEDOUT) { // The head object write may eventually succeed, clear the set of objects for deletion. if it @@ -482,7 +483,8 @@ int MultipartObjectProcessor::complete(size_t accounted_size, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, - bool *pcanceled, optional_yield y) + bool *pcanceled, + const req_context& rctx) { int r = writer.drain(); if (r < 0) { @@ -506,7 +508,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, obj_op.meta.zones_trace = zones_trace; obj_op.meta.modify_tail = true; - r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y); + r = obj_op.write_meta(actual_size, accounted_size, attrs, rctx); if (r < 0) return r; @@ -531,7 +533,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, bool compressed; r = rgw_compression_info_from_attrset(attrs, compressed, info.cs_info); if (r < 0) { - ldpp_dout(dpp, 1) << "cannot get compression info" << dendl; + ldpp_dout(rctx.dpp, 1) << "cannot get compression info" << dendl; return r; } @@ -543,16 +545,16 @@ int MultipartObjectProcessor::complete(size_t accounted_size, store->obj_to_raw(bucket_info.placement_rule, meta_obj, &meta_raw_obj); rgw_rados_ref meta_obj_ref; - r = store->get_raw_obj_ref(dpp, meta_raw_obj, &meta_obj_ref); + r = store->get_raw_obj_ref(rctx.dpp, meta_raw_obj, &meta_obj_ref); if (r < 0) { - ldpp_dout(dpp, -1) << "ERROR: failed to get obj ref of meta obj with ret=" << r << dendl; + ldpp_dout(rctx.dpp, -1) << "ERROR: failed to get obj ref of meta obj with ret=" << r << dendl; return r; } librados::ObjectWriteOperation op; cls_rgw_mp_upload_part_info_update(op, p, info); - r = rgw_rados_operate(dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, y); - ldpp_dout(dpp, 20) << "Update meta: " << meta_obj_ref.obj.oid << " part " << p << " prefix " << info.manifest.get_prefix() << " return " << r << dendl; + r = rgw_rados_operate(rctx.dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, rctx.y); + ldpp_dout(rctx.dpp, 20) << "Update meta: " << meta_obj_ref.obj.oid << " part " << p << " prefix " << info.manifest.get_prefix() << " return " << r << dendl; if (r == -EOPNOTSUPP) { // New CLS call to update part info is not yet supported. Fall back to the old handling. @@ -565,7 +567,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, op = librados::ObjectWriteOperation{}; op.assert_exists(); // detect races with abort op.omap_set(m); - r = rgw_rados_operate(dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, y); + r = rgw_rados_operate(rctx.dpp, meta_obj_ref.pool.ioctx(), meta_obj_ref.obj.oid, &op, rctx.y); } if (r < 0) { return r == -ENOENT ? -ERR_NO_SUCH_UPLOAD : r; @@ -686,7 +688,7 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c ceph::real_time set_mtime, rgw::sal::Attrs& attrs, ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const string *user_data, rgw_zone_set *zones_trace, bool *pcanceled, - optional_yield y) + const req_context& rctx) { int r = writer.drain(); if (r < 0) @@ -742,9 +744,9 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c etag_bl.append(final_etag_str, strlen(final_etag_str) + 1); attrs[RGW_ATTR_ETAG] = etag_bl; } - r = obj_op.write_meta(dpp, actual_size + cur_size, + r = obj_op.write_meta(actual_size + cur_size, accounted_size + *cur_accounted_size, - attrs, y); + attrs, rctx); if (r < 0) { return r; } diff --git a/src/rgw/driver/rados/rgw_putobj_processor.h b/src/rgw/driver/rados/rgw_putobj_processor.h index fa9200f32dae..9a21c0c793a3 100644 --- a/src/rgw/driver/rados/rgw_putobj_processor.h +++ b/src/rgw/driver/rados/rgw_putobj_processor.h @@ -191,7 +191,7 @@ class AtomicObjectProcessor : public ManifestObjectProcessor { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; @@ -238,7 +238,7 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; @@ -274,7 +274,7 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { std::map& attrs, ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; } // namespace putobj diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 8814c5a1fbac..5437d12d4b76 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -2665,8 +2665,8 @@ int RGWRados::fix_tail_obj_locator(const DoutPrefixProvider *dpp, RGWObjState *astate = nullptr; RGWObjManifest* manifest = nullptr; - RGWObjectCtx rctx(this->driver); - r = get_obj_state(dpp, &rctx, bucket_info, obj, &astate, &manifest, false, y); + RGWObjectCtx octx(this->driver); + r = get_obj_state(dpp, &octx, bucket_info, obj, &astate, &manifest, false, y); if (r < 0) return r; @@ -3047,11 +3047,10 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, handler, y); } -int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, - uint64_t size, uint64_t accounted_size, +int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_size, map& attrs, bool assume_noent, bool modify_tail, - void *_index_op, optional_yield y) + void *_index_op, const req_context& rctx) { RGWRados::Bucket::UpdateIndex *index_op = static_cast(_index_op); RGWRados *store = target->get_store(); @@ -3070,19 +3069,19 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, RGWObjState *state; RGWObjManifest *manifest = nullptr; - int r = target->get_state(dpp, &state, &manifest, false, y, assume_noent); + int r = target->get_state(rctx.dpp, &state, &manifest, false, rctx.y, assume_noent); if (r < 0) return r; rgw_obj& obj = target->get_obj(); if (obj.get_oid().empty()) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): cannot write object with empty name" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: " << __func__ << "(): cannot write object with empty name" << dendl; return -EIO; } rgw_rados_ref ref; - r = store->get_obj_head_ref(dpp, target->get_meta_placement_rule(), obj, &ref); + r = store->get_obj_head_ref(rctx.dpp, target->get_meta_placement_rule(), obj, &ref); if (r < 0) return r; @@ -3094,7 +3093,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, if (!ptag && !index_op->get_optag()->empty()) { ptag = index_op->get_optag(); } - r = target->prepare_atomic_modification(dpp, op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false, modify_tail, y); + r = target->prepare_atomic_modification(rctx.dpp, op, reset_obj, ptag, meta.if_match, meta.if_nomatch, false, modify_tail, rctx.y); if (r < 0) return r; @@ -3217,7 +3216,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, if (!index_op->is_prepared()) { tracepoint(rgw_rados, prepare_enter, req_id.c_str()); - r = index_op->prepare(dpp, CLS_RGW_OP_ADD, &state->write_tag, y); + r = index_op->prepare(rctx.dpp, CLS_RGW_OP_ADD, &state->write_tag, rctx.y); tracepoint(rgw_rados, prepare_exit, req_id.c_str()); if (r < 0) return r; @@ -3226,7 +3225,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, auto& ioctx = ref.pool.ioctx(); tracepoint(rgw_rados, operate_enter, req_id.c_str()); - r = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, y); + r = rgw_rados_operate(rctx.dpp, ref.pool.ioctx(), ref.obj.oid, &op, rctx.y); tracepoint(rgw_rados, operate_exit, req_id.c_str()); if (r < 0) { /* we can expect to get -ECANCELED if object was replaced under, or -ENOENT if was removed, or -EEXIST if it did not exist @@ -3241,16 +3240,16 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, epoch = ioctx.get_last_version(); poolid = ioctx.get_id(); - r = target->complete_atomic_modification(dpp, y); + r = target->complete_atomic_modification(rctx.dpp, rctx.y); if (r < 0) { - ldpp_dout(dpp, 0) << "ERROR: complete_atomic_modification returned r=" << r << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: complete_atomic_modification returned r=" << r << dendl; } tracepoint(rgw_rados, complete_enter, req_id.c_str()); - r = index_op->complete(dpp, poolid, epoch, size, accounted_size, + r = index_op->complete(rctx.dpp, poolid, epoch, size, accounted_size, meta.set_mtime, etag, content_type, storage_class, &acl_bl, - meta.category, meta.remove_objs, y, + meta.category, meta.remove_objs, rctx.y, meta.user_data, meta.appendable); tracepoint(rgw_rados, complete_exit, req_id.c_str()); if (r < 0) @@ -3265,7 +3264,7 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, state = NULL; if (versioned_op && meta.olh_epoch) { - r = store->set_olh(dpp, target->get_ctx(), target->get_bucket_info(), obj, false, NULL, *meta.olh_epoch, real_time(), false, y, meta.zones_trace); + r = store->set_olh(rctx.dpp, target->get_ctx(), target->get_bucket_info(), obj, false, NULL, *meta.olh_epoch, real_time(), false, rctx.y, meta.zones_trace); if (r < 0) { return r; } @@ -3275,10 +3274,10 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, rgw_obj_index_key obj_key; obj.key.get_index_key(&obj_key); - r = store->obj_expirer->hint_add(dpp, meta.delete_at, obj.bucket.tenant, obj.bucket.name, + r = store->obj_expirer->hint_add(rctx.dpp, meta.delete_at, obj.bucket.tenant, obj.bucket.name, obj.bucket.bucket_id, obj_key); if (r < 0) { - ldpp_dout(dpp, 0) << "ERROR: objexp_hint_add() returned r=" << r << ", object will not get removed" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: objexp_hint_add() returned r=" << r << ", object will not get removed" << dendl; /* ignoring error, nothing we can do at this point */ } } @@ -3296,9 +3295,9 @@ int RGWRados::Object::Write::_do_write_meta(const DoutPrefixProvider *dpp, return 0; done_cancel: - int ret = index_op->cancel(dpp, meta.remove_objs, y); + int ret = index_op->cancel(rctx.dpp, meta.remove_objs, rctx.y); if (ret < 0) { - ldpp_dout(dpp, 0) << "ERROR: index_op.cancel() returned ret=" << ret << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: index_op.cancel() returned ret=" << ret << dendl; } meta.canceled = true; @@ -3340,8 +3339,8 @@ done_cancel: return r; } -int RGWRados::Object::Write::write_meta(const DoutPrefixProvider *dpp, uint64_t size, uint64_t accounted_size, - map& attrs, optional_yield y) +int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, + map& attrs, const req_context& rctx) { RGWBucketInfo& bucket_info = target->get_bucket_info(); @@ -3352,13 +3351,13 @@ int RGWRados::Object::Write::write_meta(const DoutPrefixProvider *dpp, uint64_t bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL); int r; if (assume_noent) { - r = _do_write_meta(dpp, size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, y); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, rctx); if (r == -EEXIST) { assume_noent = false; } } if (!assume_noent) { - r = _do_write_meta(dpp, size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, y); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, rctx); } return r; } @@ -3624,11 +3623,11 @@ static void set_copy_attrs(map& src_attrs, int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, const DoutPrefixProvider *dpp, optional_yield y) { - RGWObjectCtx rctx(this->driver); + RGWObjectCtx octx(this->driver); rgw::sal::Attrs attrset; uint64_t obj_size; ceph::real_time mtime; - RGWRados::Object op_target(this, dest_bucket_info, rctx, obj); + RGWRados::Object op_target(this, dest_bucket_info, octx, obj); RGWRados::Object::Read read_op(&op_target); read_op.params.attrs = &attrset; @@ -3643,7 +3642,7 @@ int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, c attrset.erase(RGW_ATTR_TAIL_TAG); attrset.erase(RGW_ATTR_STORAGE_CLASS); - return copy_obj_data(rctx, dest_bucket_info, dest_bucket_info.placement_rule, + return copy_obj_data(octx, dest_bucket_info, dest_bucket_info.placement_rule, read_op, obj_size - 1, obj, NULL, mtime, attrset, 0, real_time(), NULL, dpp, y); } @@ -4138,8 +4137,8 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, string *petag, void (*progress_cb)(off_t, void *), void *progress_data, - const DoutPrefixProvider *dpp, - RGWFetchObjFilter *filter, optional_yield y, + const req_context& rctx, + RGWFetchObjFilter *filter, bool stat_follow_olh, const rgw_obj& stat_dest_obj, const rgw_zone_set_entry& source_trace_entry, @@ -4160,7 +4159,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, using namespace rgw::putobj; AtomicObjectProcessor processor(&aio, this, dest_bucket_info, nullptr, user_id, obj_ctx, dest_obj, olh_epoch, - tag, dpp, y); + tag, rctx.dpp, rctx.y); RGWRESTConn *conn; auto& zone_conn_map = svc.zone->get_zone_conn_map(); auto& zonegroup_conn_map = svc.zone->get_zonegroup_conn_map(); @@ -4171,7 +4170,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, } else { map::iterator iter = zonegroup_conn_map.find(src_bucket_info->zonegroup); if (iter == zonegroup_conn_map.end()) { - ldpp_dout(dpp, 0) << "could not find zonegroup connection to zonegroup: " << source_zone << dendl; + ldpp_dout(rctx.dpp, 0) << "could not find zonegroup connection to zonegroup: " << source_zone << dendl; return -ENOENT; } conn = iter->second; @@ -4179,7 +4178,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, } else { auto iter = zone_conn_map.find(source_zone); if (iter == zone_conn_map.end()) { - ldpp_dout(dpp, 0) << "could not find zone connection to zone: " << source_zone << dendl; + ldpp_dout(rctx.dpp, 0) << "could not find zone connection to zone: " << source_zone << dendl; return -ENOENT; } conn = iter->second; @@ -4195,7 +4194,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, std::optional override_owner; - RGWRadosPutObj cb(dpp, cct, plugin, compressor, &processor, progress_cb, progress_data, + RGWRadosPutObj cb(rctx.dpp, cct, plugin, compressor, &processor, progress_cb, progress_data, [&](map& obj_attrs) { const rgw_placement_rule *ptail_rule; @@ -4207,7 +4206,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, &override_owner, &ptail_rule); if (ret < 0) { - ldpp_dout(dpp, 5) << "Aborting fetch: source object filter returned ret=" << ret << dendl; + ldpp_dout(rctx.dpp, 5) << "Aborting fetch: source object filter returned ret=" << ret << dendl; return ret; } @@ -4217,12 +4216,12 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, if (compression_type != "none") { plugin = Compressor::create(cct, compression_type); if (!plugin) { - ldpp_dout(dpp, 1) << "Cannot load plugin for compression type " + ldpp_dout(rctx.dpp, 1) << "Cannot load plugin for compression type " << compression_type << dendl; } } - ret = processor.prepare(y); + ret = processor.prepare(rctx.y); if (ret < 0) { return ret; } @@ -4243,7 +4242,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, if (copy_if_newer) { /* need to get mtime for destination */ - ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, y); + ret = get_obj_state(rctx.dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, rctx.y); if (ret < 0) goto set_err_state; @@ -4259,7 +4258,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, static constexpr bool sync_manifest = true; static constexpr bool skip_decrypt = true; static constexpr bool sync_cloudtiered = true; - ret = conn->get_obj(dpp, user_id, info, src_obj, pmod, unmod_ptr, + ret = conn->get_obj(rctx.dpp, user_id, info, src_obj, pmod, unmod_ptr, dest_mtime_weight.zone_short_id, dest_mtime_weight.pg_ver, prepend_meta, get_op, rgwx_stat, sync_manifest, skip_decrypt, &dst_zone_trace, @@ -4270,7 +4269,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, } ret = conn->complete_request(in_stream_req, &etag, &set_mtime, - &expected_size, nullptr, nullptr, y); + &expected_size, nullptr, nullptr, rctx.y); if (ret < 0) { goto set_err_state; } @@ -4280,7 +4279,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, } if (cb.get_data_len() != expected_size) { ret = -EIO; - ldpp_dout(dpp, 0) << "ERROR: object truncated during fetching, expected " + ldpp_dout(rctx.dpp, 0) << "ERROR: object truncated during fetching, expected " << expected_size << " bytes but received " << cb.get_data_len() << dendl; goto set_err_state; } @@ -4301,8 +4300,8 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, auto& obj_attrs = cb.get_attrs(); RGWUserInfo owner_info; - if (ctl.user->get_info_by_uid(dpp, *override_owner, &owner_info, y) < 0) { - ldpp_dout(dpp, 10) << "owner info does not exist" << dendl; + if (ctl.user->get_info_by_uid(rctx.dpp, *override_owner, &owner_info, rctx.y) < 0) { + ldpp_dout(rctx.dpp, 10) << "owner info does not exist" << dendl; return -EINVAL; } @@ -4310,14 +4309,14 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, auto aiter = obj_attrs.find(RGW_ATTR_ACL); if (aiter == obj_attrs.end()) { - ldpp_dout(dpp, 0) << "WARNING: " << __func__ << "(): object doesn't have ACL attribute, setting default ACLs" << dendl; + ldpp_dout(rctx.dpp, 0) << "WARNING: " << __func__ << "(): object doesn't have ACL attribute, setting default ACLs" << dendl; acl.create_default(owner_info.user_id, owner_info.display_name); } else { auto iter = aiter->second.cbegin(); try { acl.decode(iter); } catch (buffer::error& err) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): could not decode policy, caught buffer::error" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: " << __func__ << "(): could not decode policy, caught buffer::error" << dendl; return -EIO; } } @@ -4341,7 +4340,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, try { decode(delete_at, iter->second); } catch (buffer::error& err) { - ldpp_dout(dpp, 0) << "ERROR: failed to decode delete_at field in intra zone copy" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: failed to decode delete_at field in intra zone copy" << dendl; } } } @@ -4395,7 +4394,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, try { decode(pg_ver, iter); } catch (buffer::error& err) { - ldpp_dout(dpp, 0) << "ERROR: failed to decode pg ver attribute, ignoring" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: failed to decode pg ver attribute, ignoring" << dendl; /* non critical error */ } } @@ -4413,7 +4412,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, if (verifier_etag != trimmed_etag) { ret = -EIO; - ldpp_dout(dpp, 0) << "ERROR: source and destination objects don't match. Expected etag:" + ldpp_dout(rctx.dpp, 0) << "ERROR: source and destination objects don't match. Expected etag:" << trimmed_etag << " Computed etag:" << verifier_etag << dendl; goto set_err_state; } @@ -4424,34 +4423,34 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, bool canceled = false; ret = processor.complete(cb.get_data_len(), etag, mtime, set_mtime, attrs, delete_at, nullptr, nullptr, nullptr, - zones_trace, &canceled, y); + zones_trace, &canceled, rctx); if (ret < 0) { goto set_err_state; } if (copy_if_newer && canceled) { - ldpp_dout(dpp, 20) << "raced with another write of obj: " << dest_obj << dendl; + ldpp_dout(rctx.dpp, 20) << "raced with another write of obj: " << dest_obj << dendl; obj_ctx.invalidate(dest_obj); /* object was overwritten */ - ret = get_obj_state(dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, y); + ret = get_obj_state(rctx.dpp, &obj_ctx, dest_bucket_info, stat_dest_obj, &dest_state, &manifest, stat_follow_olh, rctx.y); if (ret < 0) { - ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": get_err_state() returned ret=" << ret << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: " << __func__ << ": get_err_state() returned ret=" << ret << dendl; goto set_err_state; } dest_mtime_weight.init(dest_state); dest_mtime_weight.high_precision = high_precision_time; if (!dest_state->exists || dest_mtime_weight < set_mtime_weight) { - ldpp_dout(dpp, 20) << "retrying writing object mtime=" << set_mtime << " dest_state->mtime=" << dest_state->mtime << " dest_state->exists=" << dest_state->exists << dendl; + ldpp_dout(rctx.dpp, 20) << "retrying writing object mtime=" << set_mtime << " dest_state->mtime=" << dest_state->mtime << " dest_state->exists=" << dest_state->exists << dendl; continue; } else { - ldpp_dout(dpp, 20) << "not retrying writing object mtime=" << set_mtime << " dest_state->mtime=" << dest_state->mtime << " dest_state->exists=" << dest_state->exists << dendl; + ldpp_dout(rctx.dpp, 20) << "not retrying writing object mtime=" << set_mtime << " dest_state->mtime=" << dest_state->mtime << " dest_state->exists=" << dest_state->exists << dendl; } } break; } if (i == MAX_COMPLETE_RETRY) { - ldpp_dout(dpp, 0) << "ERROR: retried object completion too many times, something is wrong!" << dendl; + ldpp_dout(rctx.dpp, 0) << "ERROR: retried object completion too many times, something is wrong!" << dendl; ret = -EIO; goto set_err_state; } @@ -4466,8 +4465,8 @@ set_err_state: // for OP_LINK_OLH to call set_olh() with a real olh_epoch if (olh_epoch && *olh_epoch > 0) { constexpr bool log_data_change = true; - ret = set_olh(dpp, obj_ctx, dest_bucket_info, dest_obj, false, nullptr, - *olh_epoch, real_time(), false, y, zones_trace, log_data_change); + ret = set_olh(rctx.dpp, obj_ctx, dest_bucket_info, dest_obj, false, nullptr, + *olh_epoch, real_time(), false, rctx.y, zones_trace, log_data_change); } else { // we already have the latest copy ret = 0; @@ -4590,13 +4589,14 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, if (remote_src || !source_zone.empty()) { rgw_zone_set_entry source_trace_entry{source_zone.id, std::nullopt}; + const req_context rctx{dpp, y, nullptr}; return fetch_remote_obj(obj_ctx, user_id, info, source_zone, dest_obj, src_obj, dest_bucket_info, &src_bucket_info, dest_placement, src_mtime, mtime, mod_ptr, unmod_ptr, high_precision_time, if_match, if_nomatch, attrs_mod, copy_if_newer, attrs, category, - olh_epoch, delete_at, ptag, petag, progress_cb, progress_data, dpp, - nullptr /* filter */, y, stat_follow_olh, stat_dest_obj, source_trace_entry); + olh_epoch, delete_at, ptag, petag, progress_cb, progress_data, rctx, + nullptr /* filter */, stat_follow_olh, stat_dest_obj, source_trace_entry); } map src_attrs; @@ -4756,6 +4756,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, append_rand_alpha(cct, tag, tag, 32); } + const req_context rctx{dpp, y, nullptr}; std::unique_ptr aio; rgw::AioResultList all_results; if (!copy_itself) { @@ -4828,7 +4829,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, write_op.meta.delete_at = delete_at; write_op.meta.modify_tail = !copy_itself; - ret = write_op.write_meta(dpp, obj_size, astate->accounted_size, attrs, y); + ret = write_op.write_meta(obj_size, astate->accounted_size, attrs, rctx); if (ret < 0) { goto done_ret; } @@ -4951,8 +4952,9 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, accounted_size = compressed ? cs_info.orig_size : ofs; } + const req_context rctx{dpp, y, nullptr}; return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - nullptr, nullptr, nullptr, nullptr, nullptr, y); + nullptr, nullptr, nullptr, nullptr, nullptr, rctx); } int RGWRados::transition_obj(RGWObjectCtx& obj_ctx, @@ -5503,17 +5505,17 @@ int RGWRados::bucket_set_reshard(const DoutPrefixProvider *dpp, const RGWBucketI return r; } -int RGWRados::defer_gc(const DoutPrefixProvider *dpp, RGWObjectCtx* rctx, RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y) +int RGWRados::defer_gc(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBucketInfo& bucket_info, const rgw_obj& obj, optional_yield y) { std::string oid, key; get_obj_bucket_and_oid_loc(obj, oid, key); - if (!rctx) + if (!octx) return 0; RGWObjState *state = NULL; RGWObjManifest *manifest = nullptr; - int r = get_obj_state(dpp, rctx, bucket_info, obj, &state, &manifest, false, y); + int r = get_obj_state(dpp, octx, bucket_info, obj, &state, &manifest, false, y); if (r < 0) return r; @@ -5895,7 +5897,7 @@ int RGWRados::get_olh_target_state(const DoutPrefixProvider *dpp, RGWObjectCtx& return 0; } -int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, +int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *octx, RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, RGWObjManifest** manifest, bool follow_olh, optional_yield y, bool assume_noent) @@ -5907,16 +5909,16 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc bool need_follow_olh = follow_olh && obj.key.instance.empty(); *manifest = nullptr; - RGWObjStateManifest *sm = rctx->get_state(obj); + RGWObjStateManifest *sm = octx->get_state(obj); RGWObjState *s = &(sm->state); - ldpp_dout(dpp, 20) << "get_obj_state: rctx=" << (void *)rctx << " obj=" << obj << " state=" << (void *)s << " s->prefetch_data=" << s->prefetch_data << dendl; + ldpp_dout(dpp, 20) << "get_obj_state: octx=" << (void *)octx << " obj=" << obj << " state=" << (void *)s << " s->prefetch_data=" << s->prefetch_data << dendl; *state = s; if (sm->manifest) { *manifest = &(*sm->manifest); } if (s->has_attrs) { if (s->is_olh && need_follow_olh) { - return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, manifest, y); + return get_olh_target_state(dpp, *octx, bucket_info, obj, s, state, manifest, y); } return 0; } @@ -6068,7 +6070,7 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc ldpp_dout(dpp, 20) << __func__ << ": setting s->olh_tag to " << string(s->olh_tag.c_str(), s->olh_tag.length()) << dendl; if (need_follow_olh) { - return get_olh_target_state(dpp, *rctx, bucket_info, obj, s, state, manifest, y); + return get_olh_target_state(dpp, *octx, bucket_info, obj, s, state, manifest, y); } else if (obj.key.have_null_instance() && !sm->manifest) { // read null version, and the head object only have olh info s->exists = false; @@ -6079,13 +6081,13 @@ int RGWRados::get_obj_state_impl(const DoutPrefixProvider *dpp, RGWObjectCtx *rc return 0; } -int RGWRados::get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *rctx, RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, RGWObjManifest** manifest, +int RGWRados::get_obj_state(const DoutPrefixProvider *dpp, RGWObjectCtx *octx, RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, RGWObjManifest** manifest, bool follow_olh, optional_yield y, bool assume_noent) { int ret; do { - ret = get_obj_state_impl(dpp, rctx, bucket_info, obj, state, manifest, follow_olh, y, assume_noent); + ret = get_obj_state_impl(dpp, octx, bucket_info, obj, state, manifest, follow_olh, y, assume_noent); } while (ret == -EAGAIN); return ret; @@ -6195,15 +6197,15 @@ int RGWRados::Object::Stat::finish(const DoutPrefixProvider *dpp) return 0; } -int RGWRados::append_atomic_test(const DoutPrefixProvider *dpp, RGWObjectCtx* rctx, +int RGWRados::append_atomic_test(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectOperation& op, RGWObjState **pstate, RGWObjManifest** pmanifest, optional_yield y) { - if (!rctx) + if (!octx) return 0; - int r = get_obj_state(dpp, rctx, bucket_info, obj, pstate, pmanifest, false, y); + int r = get_obj_state(dpp, octx, bucket_info, obj, pstate, pmanifest, false, y); if (r < 0) return r; @@ -6339,14 +6341,14 @@ int RGWRados::Object::prepare_atomic_modification(const DoutPrefixProvider *dpp, * bl: the contents of the attr * Returns: 0 on success, -ERR# otherwise. */ -int RGWRados::set_attr(const DoutPrefixProvider *dpp, RGWObjectCtx* rctx, RGWBucketInfo& bucket_info, const rgw_obj& obj, const char *name, bufferlist& bl, optional_yield y) +int RGWRados::set_attr(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBucketInfo& bucket_info, const rgw_obj& obj, const char *name, bufferlist& bl, optional_yield y) { map attrs; attrs[name] = bl; - return set_attrs(dpp, rctx, bucket_info, obj, attrs, NULL, y); + return set_attrs(dpp, octx, bucket_info, obj, attrs, NULL, y); } -int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* rctx, RGWBucketInfo& bucket_info, const rgw_obj& src_obj, +int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBucketInfo& bucket_info, const rgw_obj& src_obj, map& attrs, map* rmattrs, optional_yield y, @@ -6367,7 +6369,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* rctx, RGWBu RGWObjState *state = NULL; RGWObjManifest *manifest = nullptr; - r = append_atomic_test(dpp, rctx, bucket_info, obj, op, &state, &manifest, y); + r = append_atomic_test(dpp, octx, bucket_info, obj, op, &state, &manifest, y); if (r < 0) return r; @@ -9885,8 +9887,8 @@ int RGWRados::check_disk_state(const DoutPrefixProvider *dpp, RGWObjState *astate = NULL; RGWObjManifest *manifest = nullptr; - RGWObjectCtx rctx(this->driver); - int r = get_obj_state(dpp, &rctx, bucket_info, obj, &astate, &manifest, false, y); + RGWObjectCtx octx(this->driver); + int r = get_obj_state(dpp, &octx, bucket_info, obj, &astate, &manifest, false, y); if (r < 0) return r; diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 5ca604c971f6..2dca3cfaad4e 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -816,13 +816,12 @@ public: explicit Write(RGWRados::Object *_target) : target(_target) {} - int _do_write_meta(const DoutPrefixProvider *dpp, - uint64_t size, uint64_t accounted_size, + int _do_write_meta(uint64_t size, uint64_t accounted_size, std::map& attrs, bool modify_tail, bool assume_noent, - void *index_op, optional_yield y); - int write_meta(const DoutPrefixProvider *dpp, uint64_t size, uint64_t accounted_size, - std::map& attrs, optional_yield y); + void *index_op, const req_context& rctx); + int write_meta(uint64_t size, uint64_t accounted_size, + std::map& attrs, const req_context& rctx); int write_data(const char *data, uint64_t ofs, uint64_t len, bool exclusive); const req_state* get_req_state() { return nullptr; /* XXX dang Only used by LTTng, and it handles null anyway */ @@ -1144,8 +1143,8 @@ public: std::string *petag, void (*progress_cb)(off_t, void *), void *progress_data, - const DoutPrefixProvider *dpp, - RGWFetchObjFilter *filter, optional_yield y, + const req_context& rctx, + RGWFetchObjFilter *filter, bool stat_follow_olh, const rgw_obj& stat_dest_obj, const rgw_zone_set_entry& source_trace_entry, diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 0c24a36a0a58..fb684a921e6d 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -2091,7 +2091,8 @@ int RadosObject::write_cloud_tier(const DoutPrefixProvider* dpp, attrs.erase(RGW_ATTR_ID_TAG); attrs.erase(RGW_ATTR_TAIL_TAG); - return obj_op.write_meta(dpp, 0, 0, attrs, y); + const req_context rctx{dpp, y, nullptr}; + return obj_op.write_meta(0, 0, attrs, rctx); } int RadosObject::get_max_chunk_size(const DoutPrefixProvider* dpp, rgw_placement_rule placement_rule, uint64_t* max_chunk_size, uint64_t* alignment) @@ -2178,12 +2179,12 @@ std::unique_ptr RadosObject::get_read_op() return std::make_unique(this, rados_ctx); } -RadosObject::RadosReadOp::RadosReadOp(RadosObject *_source, RGWObjectCtx *_rctx) : +RadosObject::RadosReadOp::RadosReadOp(RadosObject *_source, RGWObjectCtx *_octx) : source(_source), - rctx(_rctx), + octx(_octx), op_target(_source->store->getRados(), _source->get_bucket()->get_info(), - *static_cast(rctx), + *static_cast(octx), _source->get_obj()), parent_op(&op_target) { } @@ -2502,6 +2503,7 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, int ret; std::string oid = mp_obj.get_key(); RGWObjectCtx obj_ctx(store); + const req_context rctx{dpp, y, nullptr}; do { char buf[33]; @@ -2537,7 +2539,7 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, encode(upload_info, bl); obj_op.meta.data = &bl; - ret = obj_op.write_meta(dpp, bl.length(), 0, attrs, y); + ret = obj_op.write_meta(bl.length(), 0, attrs, rctx); } while (ret == -EEXIST); return ret; @@ -2820,7 +2822,8 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, obj_op.meta.completeMultipart = true; obj_op.meta.olh_epoch = olh_epoch; - ret = obj_op.write_meta(dpp, ofs, accounted_size, attrs, y); + const req_context rctx{dpp, y, nullptr}; + ret = obj_op.write_meta(ofs, accounted_size, attrs, rctx); if (ret < 0) return ret; @@ -3099,10 +3102,10 @@ int RadosAtomicWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - if_match, if_nomatch, user_data, zones_trace, canceled, y); + if_match, if_nomatch, user_data, zones_trace, canceled, rctx); } int RadosAppendWriter::prepare(optional_yield y) @@ -3122,10 +3125,10 @@ int RadosAppendWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - if_match, if_nomatch, user_data, zones_trace, canceled, y); + if_match, if_nomatch, user_data, zones_trace, canceled, rctx); } int RadosMultipartWriter::prepare(optional_yield y) @@ -3145,10 +3148,10 @@ int RadosMultipartWriter::complete(size_t accounted_size, const std::string& eta const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - if_match, if_nomatch, user_data, zones_trace, canceled, y); + if_match, if_nomatch, user_data, zones_trace, canceled, rctx); } const std::string& RadosZoneGroup::get_endpoint() const diff --git a/src/rgw/driver/rados/rgw_sal_rados.h b/src/rgw/driver/rados/rgw_sal_rados.h index 228ba532869c..e86a0870782a 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.h +++ b/src/rgw/driver/rados/rgw_sal_rados.h @@ -324,7 +324,7 @@ class RadosObject : public StoreObject { struct RadosReadOp : public ReadOp { private: RadosObject* source; - RGWObjectCtx* rctx; + RGWObjectCtx* octx; RGWRados::Object op_target; RGWRados::Object::Read parent_op; @@ -793,7 +793,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class RadosAppendWriter : public StoreWriter { @@ -840,7 +840,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class RadosMultipartWriter : public StoreWriter { @@ -885,7 +885,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class RadosLuaManager : public StoreLuaManager { diff --git a/src/rgw/driver/rados/rgw_tools.cc b/src/rgw/driver/rados/rgw_tools.cc index 66651da5cc8c..cdc4be83a054 100644 --- a/src/rgw/driver/rados/rgw_tools.cc +++ b/src/rgw/driver/rados/rgw_tools.cc @@ -417,12 +417,13 @@ int RGWDataAccess::Object::put(bufferlist& data, puser_data = &(*user_data); } + const req_context rctx{dpp, y, nullptr}; return processor->complete(obj_size, etag, &mtime, mtime, attrs, delete_at, nullptr, nullptr, puser_data, - nullptr, nullptr, y); + nullptr, nullptr, rctx); } void RGWDataAccess::Object::set_policy(const RGWAccessControlPolicy& policy) diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 6a55d3f1d8f5..227c212ac6be 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1937,6 +1937,7 @@ namespace rgw { char calc_md5[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 1]; unsigned char m[CEPH_CRYPTO_MD5_DIGESTSIZE]; req_state* state = get_state(); + const req_context rctx{this, state->yield, nullptr}; size_t osize = rgw_fh->get_size(); struct timespec octime = rgw_fh->get_ctime(); @@ -2018,7 +2019,7 @@ namespace rgw { op_ret = processor->complete(state->obj_size, etag, &mtime, real_time(), attrs, (delete_at ? *delete_at : real_time()), if_match, if_nomatch, nullptr, nullptr, nullptr, - state->yield); + rctx); if (op_ret != 0) { /* revert attr updates */ rgw_fh->set_mtime(omtime); diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index ab2dda48ec7b..4887c9d146a6 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -480,7 +480,7 @@ struct lc_op_ctx { LCObjsLister& ol; std::unique_ptr obj; - RGWObjectCtx rctx; + RGWObjectCtx octx; const DoutPrefixProvider *dpp; WorkQ* wq; @@ -493,7 +493,7 @@ struct lc_op_ctx { : cct(env.driver->ctx()), env(env), o(o), next_key_name(next_key_name), effective_mtime(effective_mtime), driver(env.driver), bucket(env.bucket), op(env.op), ol(env.ol), - rctx(env.driver), dpp(dpp), wq(wq) + octx(env.driver), dpp(dpp), wq(wq) { obj = bucket->get_object(o.key); } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 8c15e5bd2e3f..88c1a5abd1ab 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4390,10 +4390,11 @@ void RGWPutObj::execute(optional_yield y) } tracepoint(rgw_op, processor_complete_enter, s->req_id.c_str()); + const req_context rctx{this, s->yield, s->trace.get()}; op_ret = processor->complete(s->obj_size, etag, &mtime, real_time(), attrs, (delete_at ? *delete_at : real_time()), if_match, if_nomatch, (user_data.empty() ? nullptr : &user_data), nullptr, nullptr, - s->yield); + rctx); tracepoint(rgw_op, processor_complete_exit, s->req_id.c_str()); // send request to notification manager @@ -4658,10 +4659,11 @@ void RGWPostObj::execute(optional_yield y) emplace_attr(RGW_ATTR_COMPRESSION, std::move(tmp)); } + const req_context rctx{this, s->yield, s->trace.get()}; op_ret = processor->complete(s->obj_size, etag, nullptr, real_time(), attrs, (delete_at ? *delete_at : real_time()), nullptr, nullptr, nullptr, nullptr, nullptr, - s->yield); + rctx); if (op_ret < 0) { return; } @@ -7772,10 +7774,11 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, } /* Complete the transaction. */ + const req_context rctx{this, s->yield, s->trace.get()}; op_ret = processor->complete(size, etag, nullptr, ceph::real_time(), attrs, ceph::real_time() /* delete_at */, nullptr, nullptr, nullptr, nullptr, nullptr, - s->yield); + rctx); if (op_ret < 0) { ldpp_dout(this, 20) << "processor::complete returned op_ret=" << op_ret << dendl; } diff --git a/src/rgw/rgw_req_context.h b/src/rgw/rgw_req_context.h new file mode 100644 index 000000000000..b0030ca1a94b --- /dev/null +++ b/src/rgw/rgw_req_context.h @@ -0,0 +1,18 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab ft=cpp + +#include "common/async/yield_context.h" +namespace opentelemetry::trace { + class Span; +} + +class DoutPrefixProvider; + +// this struct holds information which is created at the frontend +// and should trickle down through all function calls to the backend +struct req_context { + const DoutPrefixProvider* dpp{nullptr}; + optional_yield y; + const opentelemetry::trace::Span* span{nullptr}; +}; + diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 84731f333d72..7cfd4923761f 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -20,6 +20,7 @@ #include "rgw_user.h" #include "rgw_notify_event_type.h" #include "common/tracer.h" +#include "rgw_req_context.h" #include "rgw_datalog_notify.h" #include "include/random.h" @@ -244,7 +245,7 @@ class ObjectProcessor : public DataProcessor { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) = 0; + const req_context& rctx) = 0; }; /** A list of key-value attributes */ @@ -1387,7 +1388,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) = 0; + const req_context& rctx) = 0; }; diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index aa1243fe5982..36d76cc12e15 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -738,9 +738,9 @@ namespace rgw::sal { return std::make_unique(this, nullptr); } - DBObject::DBReadOp::DBReadOp(DBObject *_source, RGWObjectCtx *_rctx) : + DBObject::DBReadOp::DBReadOp(DBObject *_source, RGWObjectCtx *_octx) : source(_source), - rctx(_rctx), + octx(_octx), op_target(_source->store->getDB(), _source->get_bucket()->get_info(), _source->get_obj()), @@ -1323,7 +1323,7 @@ namespace rgw::sal { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { /* XXX: same as AtomicWriter..consolidate code */ parent_op.meta.mtime = mtime; @@ -1477,7 +1477,7 @@ namespace rgw::sal { const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { parent_op.meta.mtime = mtime; parent_op.meta.delete_at = delete_at; diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index 65ffd9091093..0c75f4b98cbb 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -524,12 +524,12 @@ protected: struct DBReadOp : public ReadOp { private: DBObject* source; - RGWObjectCtx* rctx; + RGWObjectCtx* octx; DB::Object op_target; DB::Object::Read parent_op; public: - DBReadOp(DBObject *_source, RGWObjectCtx *_rctx); + DBReadOp(DBObject *_source, RGWObjectCtx *_octx); virtual int prepare(optional_yield y, const DoutPrefixProvider* dpp) override; @@ -688,7 +688,7 @@ protected: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class DBMultipartWriter : public StoreWriter { @@ -736,7 +736,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class DBStore : public StoreDriver { diff --git a/src/rgw/rgw_sal_filter.cc b/src/rgw/rgw_sal_filter.cc index 13e9155c524b..dbf688a22ab0 100644 --- a/src/rgw/rgw_sal_filter.cc +++ b/src/rgw/rgw_sal_filter.cc @@ -1276,11 +1276,11 @@ int FilterWriter::complete(size_t accounted_size, const std::string& etag, const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) + const req_context& rctx) { return next->complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, if_match, if_nomatch, user_data, zones_trace, - canceled, y); + canceled, rctx); } int FilterLuaManager::get_script(const DoutPrefixProvider* dpp, optional_yield y, diff --git a/src/rgw/rgw_sal_filter.h b/src/rgw/rgw_sal_filter.h index 6db44a191003..dcc03df95194 100644 --- a/src/rgw/rgw_sal_filter.h +++ b/src/rgw/rgw_sal_filter.h @@ -879,7 +879,7 @@ public: const char *if_match, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, bool *canceled, - optional_yield y) override; + const req_context& rctx) override; }; class FilterLuaManager : public LuaManager { diff --git a/src/test/rgw/test_d4n_filter.cc b/src/test/rgw/test_d4n_filter.cc index 30a508cf7097..7ceb7092c64f 100644 --- a/src/test/rgw/test_d4n_filter.cc +++ b/src/test/rgw/test_d4n_filter.cc @@ -25,6 +25,7 @@ string redisHost = ""; vector args; class Environment* env; const DoutPrefixProvider* dpp; +const req_context rctx{dpp, null_yield, nullptr}; class StoreObject : public rgw::sal::StoreObject { friend class D4NFilterFixture; @@ -194,7 +195,7 @@ class D4NFilterFixture : public ::testing::Test { &if_match, &if_nomatch, &user_data, &zones_trace, &canceled, - null_yield); + rctx); return ret; } @@ -454,7 +455,7 @@ TEST_F(D4NFilterFixture, CopyObjectReplace) { &if_match, &if_nomatch, &user_data, &zones_trace, &canceled, - null_yield), 0); + rctx), 0); unique_ptr testObject_copy = testBucket->get_object(rgw_obj_key("test_object_copy")); @@ -579,7 +580,7 @@ TEST_F(D4NFilterFixture, CopyObjectMerge) { &if_match, &if_nomatch, &user_data, &zones_trace, &canceled, - null_yield), 0); + rctx), 0); unique_ptr testObject_copy = testBucket->get_object(rgw_obj_key("test_object_copy")); @@ -1913,7 +1914,7 @@ TEST_F(D4NFilterFixture, DataCheck) { &if_match, &if_nomatch, &user_data, &zones_trace, &canceled, - null_yield), 0); + rctx), 0); client.hget("rgw-object:test_object_DataCheck:cache", "data", [&data](cpp_redis::reply& reply) { if (reply.is_string()) { @@ -1938,7 +1939,7 @@ TEST_F(D4NFilterFixture, DataCheck) { &if_match, &if_nomatch, &user_data, &zones_trace, &canceled, - null_yield), 0); + rctx), 0); client.hget("rgw-object:test_object_DataCheck:cache", "data", [&dataNew](cpp_redis::reply& reply) { if (reply.is_string()) {