From 3f6e071f6525719d202a0dd639caa42fa49c60f7 Mon Sep 17 00:00:00 2001 From: Shilpa Jagannath Date: Wed, 1 Apr 2020 22:58:46 +0530 Subject: [PATCH] rgw: more multisite dynamic resharding pieces. rados object names of bi shard to take a unique id called generation number. Signed-off-by: Shilpa Jagannath --- src/rgw/rgw_rados.cc | 9 +++++++-- src/rgw/services/svc_bi_rados.cc | 15 +++++++++++---- src/rgw/services/svc_bi_rados.h | 3 ++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index a6dbb57d97120..8c32c76c3723a 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2634,6 +2634,9 @@ int RGWRados::BucketShard::init(const rgw_bucket& _bucket, auto obj_ctx = store->svc.sysobj->init_obj_ctx(); + rgw::bucket_index_layout_generation generator; + uint64_t gen_number = generator.gen; + RGWBucketInfo bucket_info; RGWBucketInfo* bucket_info_p = bucket_info_out ? bucket_info_out : &bucket_info; @@ -2644,7 +2647,7 @@ int RGWRados::BucketShard::init(const rgw_bucket& _bucket, string oid; - ret = store->svc.bi_rados->open_bucket_index_shard(*bucket_info_p, shard_id, &bucket_obj); + ret = store->svc.bi_rados->open_bucket_index_shard(*bucket_info_p, shard_id, gen_number, &bucket_obj); if (ret < 0) { ldout(store->ctx(), 0) << "ERROR: open_bucket_index_shard() returned ret=" << ret << dendl; return ret; @@ -2676,8 +2679,10 @@ int RGWRados::BucketShard::init(const RGWBucketInfo& bucket_info, int sid) { bucket = bucket_info.bucket; shard_id = sid; + rgw::bucket_index_layout_generation generator; + uint64_t gen_number = generator.gen; - int ret = store->svc.bi_rados->open_bucket_index_shard(bucket_info, shard_id, &bucket_obj); + int ret = store->svc.bi_rados->open_bucket_index_shard(bucket_info, shard_id, gen_number, &bucket_obj); if (ret < 0) { ldout(store->ctx(), 0) << "ERROR: open_bucket_index_shard() returned ret=" << ret << dendl; return ret; diff --git a/src/rgw/services/svc_bi_rados.cc b/src/rgw/services/svc_bi_rados.cc index 494d7094d271d..33ce61d77fb13 100644 --- a/src/rgw/services/svc_bi_rados.cc +++ b/src/rgw/services/svc_bi_rados.cc @@ -187,15 +187,21 @@ int RGWSI_BucketIndex_RADOS::open_bucket_index(const RGWBucketInfo& bucket_info, void RGWSI_BucketIndex_RADOS::get_bucket_index_object(const string& bucket_oid_base, uint32_t num_shards, int shard_id, + uint64_t gen_id, string *bucket_obj) { if (!num_shards) { // By default with no sharding, we use the bucket oid as itself (*bucket_obj) = bucket_oid_base; } else { - char buf[bucket_oid_base.size() + 32]; - snprintf(buf, sizeof(buf), "%s.%d", bucket_oid_base.c_str(), shard_id); - (*bucket_obj) = buf; + char buf[bucket_oid_base.size() + 64]; + if (gen_id != 0) { + snprintf(buf, sizeof(buf), "%s.%" PRIu64 ".%d", bucket_oid_base.c_str(), gen_id, shard_id); + (*bucket_obj) = buf; + } else { + snprintf(buf, sizeof(buf), "%s.%d", bucket_oid_base.c_str(), shard_id); + (*bucket_obj) = buf; + } } } @@ -260,6 +266,7 @@ int RGWSI_BucketIndex_RADOS::open_bucket_index_shard(const RGWBucketInfo& bucket int RGWSI_BucketIndex_RADOS::open_bucket_index_shard(const RGWBucketInfo& bucket_info, int shard_id, + uint64_t gen_id, RGWSI_RADOS::Obj *bucket_obj) { RGWSI_RADOS::Pool index_pool; @@ -274,7 +281,7 @@ int RGWSI_BucketIndex_RADOS::open_bucket_index_shard(const RGWBucketInfo& bucket string oid; get_bucket_index_object(bucket_oid_base, bucket_info.layout.current_index.layout.normal.num_shards, - shard_id, &oid); + shard_id, gen_id, &oid); *bucket_obj = svc.rados->obj(index_pool, oid); diff --git a/src/rgw/services/svc_bi_rados.h b/src/rgw/services/svc_bi_rados.h index 87387d7ca0803..753e5e7e12cdd 100644 --- a/src/rgw/services/svc_bi_rados.h +++ b/src/rgw/services/svc_bi_rados.h @@ -50,6 +50,7 @@ class RGWSI_BucketIndex_RADOS : public RGWSI_BucketIndex void get_bucket_index_object(const string& bucket_oid_base, uint32_t num_shards, int shard_id, + uint64_t gen_id, string *bucket_obj); int get_bucket_index_object(const string& bucket_oid_base, const string& obj_key, uint32_t num_shards, rgw::BucketHashType hash_type, @@ -114,7 +115,7 @@ public: int *shard_id); int open_bucket_index_shard(const RGWBucketInfo& bucket_info, - int shard_id, + int shard_id, uint64_t gen_id, RGWSI_RADOS::Obj *bucket_obj); int open_bucket_index(const RGWBucketInfo& bucket_info, -- 2.39.5