From 3967b6a7eaba9e990cd511c8724e9ad666ea0379 Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Sat, 18 Jan 2025 00:18:25 +0530 Subject: [PATCH] rgw/dbstore: Update bucket attrs as part of put_info() With commit#8c025045332a8005c6e82308fc17a33d38058734, changes were made to call put_info while erasing bucket attrs. But DBStore wasn't updating attrs as part of put_info operation. This commit addresses the same. Signed-off-by: Soumya Koduri (cherry picked from commit 20f27ee967ae047c5210ec08b24db2f6319312ae) --- src/rgw/driver/dbstore/common/dbstore.cc | 9 +++++++-- src/rgw/driver/dbstore/common/dbstore.h | 6 ++++-- src/rgw/driver/dbstore/sqlite/sqliteDB.cc | 3 +++ src/rgw/rgw_sal_dbstore.cc | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/rgw/driver/dbstore/common/dbstore.cc b/src/rgw/driver/dbstore/common/dbstore.cc index d548bc4d8c0..c0d689439e2 100644 --- a/src/rgw/driver/dbstore/common/dbstore.cc +++ b/src/rgw/driver/dbstore/common/dbstore.cc @@ -638,11 +638,12 @@ int DB::update_bucket(const DoutPrefixProvider *dpp, const std::string& query_st DBOpParams params = {}; obj_version bucket_version; RGWBucketInfo orig_info; + map attrs; /* Check if the bucket already exists and return the old info, caller will have a use for it */ orig_info.bucket.name = info.bucket.name; params.op.bucket.info.bucket.name = info.bucket.name; - ret = get_bucket_info(dpp, string("name"), "", orig_info, nullptr, nullptr, + ret = get_bucket_info(dpp, string("name"), "", orig_info, &attrs, nullptr, &bucket_version); if (ret) { @@ -668,9 +669,14 @@ int DB::update_bucket(const DoutPrefixProvider *dpp, const std::string& query_st pobjv = &info.objv_tracker; } + if (!pattrs) { + pattrs = &attrs; + } + InitializeParams(dpp, ¶ms); params.op.bucket.info.bucket.name = info.bucket.name; + params.op.bucket.bucket_attrs = *pattrs; if (powner) { params.op.bucket.owner = to_string(*powner); @@ -689,7 +695,6 @@ int DB::update_bucket(const DoutPrefixProvider *dpp, const std::string& query_st if (query_str == "attrs") { params.op.query_str = "attrs"; - params.op.bucket.bucket_attrs = *pattrs; } else if (query_str == "owner") { /* Update only owner i.e, chown. * Update creation_time too */ diff --git a/src/rgw/driver/dbstore/common/dbstore.h b/src/rgw/driver/dbstore/common/dbstore.h index 3f8191f5a92..d9a2a242d2c 100644 --- a/src/rgw/driver/dbstore/common/dbstore.h +++ b/src/rgw/driver/dbstore/common/dbstore.h @@ -868,14 +868,14 @@ class UpdateBucketOp: virtual public DBOp { Zonegroup = {}, HasInstanceObj = {}, Quota = {}, RequesterPays = {}, HasWebsite = {}, \ WebsiteConf = {}, SwiftVersioning = {}, SwiftVerLocation = {}, MdsearchConfig = {}, \ NewBucketInstanceID = {}, ObjectLock = {}, SyncPolicyInfoGroups = {}, \ - BucketVersion = {}, Mtime = {} WHERE BucketName = {}"; + BucketAttrs = {}, BucketVersion = {}, Mtime = {} WHERE BucketName = {}"; // Updates Attrs, OwnerID, Mtime, Version static constexpr std::string_view AttrsQuery = "UPDATE '{}' SET OwnerID = {}, BucketAttrs = {}, Mtime = {}, BucketVersion = {} \ WHERE BucketName = {}"; // Updates OwnerID, CreationTime, Mtime, Version static constexpr std::string_view OwnerQuery = - "UPDATE '{}' SET OwnerID = {}, CreationTime = {}, Mtime = {}, BucketVersion = {} WHERE BucketName = {}"; + "UPDATE '{}' SET OwnerID = {}, CreationTime = {}, BucketAttrs = {}, Mtime = {}, BucketVersion = {} WHERE BucketName = {}"; public: virtual ~UpdateBucketOp() {} @@ -893,6 +893,7 @@ class UpdateBucketOp: virtual public DBOp { params.op.bucket.swift_ver_location, params.op.bucket.mdsearch_config, params.op.bucket.new_bucket_instance_id, params.op.bucket.obj_lock, params.op.bucket.sync_policy_info_groups, + params.op.bucket.bucket_attrs, params.op.bucket.bucket_ver, params.op.bucket.mtime, params.op.bucket.bucket_name); } @@ -905,6 +906,7 @@ class UpdateBucketOp: virtual public DBOp { if (params.op.query_str == "owner") { return fmt::format(OwnerQuery, params.bucket_table, params.op.user.user_id, params.op.bucket.creation_time, + params.op.bucket.bucket_attrs, params.op.bucket.mtime, params.op.bucket.bucket_ver, params.op.bucket.bucket_name); } diff --git a/src/rgw/driver/dbstore/sqlite/sqliteDB.cc b/src/rgw/driver/dbstore/sqlite/sqliteDB.cc index 554d8fe94cf..04e590c5335 100644 --- a/src/rgw/driver/dbstore/sqlite/sqliteDB.cc +++ b/src/rgw/driver/dbstore/sqlite/sqliteDB.cc @@ -1569,6 +1569,9 @@ int SQLUpdateBucket::Bind(const DoutPrefixProvider *dpp, struct DBOpParams *para SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.bucket.bucket_name, sdb); SQL_BIND_TEXT(dpp, *stmt, index, params->op.bucket.info.bucket.name.c_str(), sdb); + SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.bucket.bucket_attrs, sdb); + SQL_ENCODE_BLOB_PARAM(dpp, *stmt, index, params->op.bucket.bucket_attrs, sdb); + SQL_BIND_INDEX(dpp, *stmt, index, p_params.op.bucket.bucket_ver, sdb); SQL_BIND_INT(dpp, *stmt, index, params->op.bucket.bucket_version.ver, sdb); diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index f97316c28f7..c829e605ae8 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -240,7 +240,7 @@ namespace rgw::sal { { int ret; - ret = store->getDB()->update_bucket(dpp, "info", info, exclusive, nullptr, nullptr, &_mtime, &info.objv_tracker); + ret = store->getDB()->update_bucket(dpp, "info", info, exclusive, nullptr, &attrs, &_mtime, &info.objv_tracker); return ret; -- 2.39.5