From 77f69974ef84ae3b65052c37e0db63517a8294bd Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Wed, 26 Jun 2024 10:30:42 -0400 Subject: [PATCH] rgw_cksum: introduce attribute caching in RadosMultipartUpload Allow MultipartUpload::complete() to have previously called Upload::get_info() without an additional round-trip to fetch attributes. Signed-off-by: Matt Benjamin --- src/rgw/driver/rados/rgw_sal_rados.cc | 15 +++++++++++++-- src/rgw/driver/rados/rgw_sal_rados.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index b6eab4357d3..aa63743a249 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -3464,6 +3464,7 @@ int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield return 0; } + /* Handle caching */ if (rule) { if (!placement.empty()) { *rule = &placement; @@ -3476,6 +3477,14 @@ int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield } } + if (attrs) { + if (!cached_attrs.empty()) { + *attrs = cached_attrs; + if (!rule || *rule != nullptr) + return 0; + } + } + /* We need either attributes or placement, so we need a read */ std::unique_ptr meta_obj; meta_obj = get_meta_obj(); @@ -3496,11 +3505,13 @@ int RadosMultipartUpload::get_info(const DoutPrefixProvider *dpp, optional_yield return ret; } + /* Cache attrs filled in by prepare */ + cached_attrs = meta_obj->get_attrs(); + extract_span_context(meta_obj->get_attrs(), trace_ctx); if (attrs) { - /* Attrs are filled in by prepare */ - *attrs = meta_obj->get_attrs(); + *attrs = cached_attrs; if (!rule || *rule != nullptr) { /* placement was cached; don't actually read */ return 0; diff --git a/src/rgw/driver/rados/rgw_sal_rados.h b/src/rgw/driver/rados/rgw_sal_rados.h index 4abc7112c9c..6d4465093bc 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.h +++ b/src/rgw/driver/rados/rgw_sal_rados.h @@ -795,6 +795,7 @@ class RadosMultipartUpload : public StoreMultipartUpload { rgw_placement_rule placement; RGWObjManifest manifest; multipart_upload_info upload_information; + rgw::sal::Attrs cached_attrs; public: RadosMultipartUpload(RadosStore* _store, Bucket* _bucket, const std::string& oid, -- 2.39.5