From dda0ee035fe9bb0c2fc4366df8355184db5034e3 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Wed, 6 Jul 2016 11:50:47 -0400 Subject: [PATCH] rgw: convert bucket instance listings back to metadata key format Signed-off-by: Casey Bodley (cherry picked from commit 3eae201c8a1513bae23233700c754ec076360664) --- src/rgw/rgw_bucket.cc | 25 ++++++++++++++++++++++--- src/rgw/rgw_bucket.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 382cd30cabef5..b47df5f2f28d9 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -310,6 +310,21 @@ void rgw_bucket_instance_key_to_oid(string& key) } } +// convert bucket instance oids back to the tenant/ format for metadata keys. +// it's safe to parse 'tenant:' only for oids, because they won't contain the +// optional :shard at the end +void rgw_bucket_instance_oid_to_key(string& oid) +{ + // find first : (could be tenant:bucket or bucket:instance) + auto c = oid.find(':'); + if (c != string::npos) { + // if we find another :, the first one was for tenant + if (oid.find(':', c + 1) != string::npos) { + oid[c] = '/'; + } + } +} + int rgw_bucket_parse_bucket_instance(const string& bucket_instance, string *target_bucket_instance, int *shard_id) { ssize_t pos = bucket_instance.rfind(':'); @@ -1899,9 +1914,11 @@ public: if (!exists || old_bci.info.bucket.bucket_id != bci.info.bucket.bucket_id) { /* a new bucket, we need to select a new bucket placement for it */ + auto key{entry}; + rgw_bucket_instance_oid_to_key(key); string tenant_name; string bucket_name; - parse_bucket(entry, tenant_name, bucket_name); + parse_bucket(key, tenant_name, bucket_name); rgw_bucket bucket; RGWZonePlacementInfo rule_info; @@ -2003,14 +2020,16 @@ public: return 0; } - int prefix_size = sizeof(RGW_BUCKET_INSTANCE_MD_PREFIX) - 1; + constexpr int prefix_size = sizeof(RGW_BUCKET_INSTANCE_MD_PREFIX) - 1; // now filter in the relevant entries list::iterator iter; for (iter = unfiltered_keys.begin(); iter != unfiltered_keys.end(); ++iter) { string& k = *iter; if (k.compare(0, prefix_size, RGW_BUCKET_INSTANCE_MD_PREFIX) == 0) { - keys.push_back(k.substr(prefix_size)); + auto oid = k.substr(prefix_size); + rgw_bucket_instance_oid_to_key(oid); + keys.emplace_back(std::move(oid)); } } diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 132465a9b4334..acde2a531ece0 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -37,6 +37,7 @@ extern int rgw_bucket_parse_bucket_instance(const string& bucket_instance, strin extern int rgw_bucket_instance_remove_entry(RGWRados *store, string& entry, RGWObjVersionTracker *objv_tracker); extern void rgw_bucket_instance_key_to_oid(string& key); +extern void rgw_bucket_instance_oid_to_key(string& oid); extern int rgw_bucket_delete_bucket_obj(RGWRados *store, const string& tenant_name, -- 2.39.5