From d79ddf87bd4ebbb3ee7b88675842219820173545 Mon Sep 17 00:00:00 2001 From: "J. Eric Ivancich" Date: Mon, 25 Sep 2017 14:35:31 -0400 Subject: [PATCH] rgw: consolidate code that implements hashing algorithms Copies of the same hashing algorithm are scattered throughout the rgw codebase. Consolidate them. Signed-off-by: J. Eric Ivancich (cherry picked from commit e98cd6f2e043a7e5c9c334cf68da582ac1096ed2) --- src/rgw/rgw_gc.cc | 2 +- src/rgw/rgw_rados.cc | 15 ++++----------- src/rgw/rgw_rados.h | 15 +++++++++++++-- src/rgw/rgw_reshard.cc | 3 +-- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/rgw/rgw_gc.cc b/src/rgw/rgw_gc.cc index e29af16ed1762..bf64925abda58 100644 --- a/src/rgw/rgw_gc.cc +++ b/src/rgw/rgw_gc.cc @@ -43,7 +43,7 @@ void RGWGC::finalize() int RGWGC::tag_index(const string& tag) { - return rgw_shards_hash(tag, max_objs); + return rgw_shard_id(tag, max_objs); } void RGWGC::add_chain(ObjectWriteOperation& op, cls_rgw_obj_chain& chain, const string& tag) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index fd30c347b9966..bd3115e6c699a 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -5215,7 +5215,7 @@ int RGWRados::trim_usage(rgw_user& user, uint64_t start_epoch, uint64_t end_epoc int RGWRados::key_to_shard_id(const string& key, int max_shards) { - return rgw_shards_hash(key, max_shards); + return rgw_shard_id(key, max_shards); } void RGWRados::shard_name(const string& prefix, unsigned max_shards, const string& key, string& name, int *shard_id) @@ -5396,10 +5396,7 @@ int RGWRados::objexp_key_shard(const rgw_obj_index_key& key) { string obj_key = key.name + key.instance; int num_shards = cct->_conf->rgw_objexp_hints_num_shards; - uint32_t sid = ceph_str_hash_linux(obj_key.c_str(), obj_key.size()); - uint32_t sid2 = sid ^ ((sid & 0xFF) << 24); - sid = rgw_shards_mod(sid2, num_shards); - return sid; + return rgw_bucket_shard_index(obj_key, num_shards); } static string objexp_hint_get_keyext(const string& tenant_name, @@ -13592,9 +13589,7 @@ int RGWRados::get_target_shard_id(const RGWBucketInfo& bucket_info, const string *shard_id = -1; } } else { - uint32_t sid = ceph_str_hash_linux(obj_key.c_str(), obj_key.size()); - uint32_t sid2 = sid ^ ((sid & 0xFF) << 24); - sid = rgw_shards_mod(sid2, bucket_info.num_shards); + uint32_t sid = rgw_bucket_shard_index(obj_key, bucket_info.num_shards); if (shard_id) { *shard_id = (int)sid; } @@ -13632,9 +13627,7 @@ int RGWRados::get_bucket_index_object(const string& bucket_oid_base, const strin *shard_id = -1; } } else { - uint32_t sid = ceph_str_hash_linux(obj_key.c_str(), obj_key.size()); - uint32_t sid2 = sid ^ ((sid & 0xFF) << 24); - sid = rgw_shards_mod(sid2, num_shards); + uint32_t sid = rgw_bucket_shard_index(obj_key, num_shards); char buf[bucket_oid_base.size() + 32]; snprintf(buf, sizeof(buf), "%s.%d", bucket_oid_base.c_str(), sid); (*bucket_obj) = buf; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index a5ba0325a606f..3f44ee1a6702b 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -58,6 +58,7 @@ class RGWReshardWait; #define RGW_SHARDS_PRIME_0 7877 #define RGW_SHARDS_PRIME_1 65521 +// only called by rgw_shard_id and rgw_bucket_shard_index static inline int rgw_shards_mod(unsigned hval, int max_shards) { if (max_shards <= RGW_SHARDS_PRIME_0) { @@ -66,9 +67,19 @@ static inline int rgw_shards_mod(unsigned hval, int max_shards) return hval % RGW_SHARDS_PRIME_1 % max_shards; } -static inline int rgw_shards_hash(const string& key, int max_shards) +// used for logging and tagging +static inline int rgw_shard_id(const string& key, int max_shards) { - return rgw_shards_mod(ceph_str_hash_linux(key.c_str(), key.size()), max_shards); + return rgw_shards_mod(ceph_str_hash_linux(key.c_str(), key.size()), + max_shards); +} + +// used for bucket indices +static inline uint32_t rgw_bucket_shard_index(const std::string& key, + int num_shards) { + uint32_t sid = ceph_str_hash_linux(key.c_str(), key.size()); + uint32_t sid2 = sid ^ ((sid & 0xFF) << 24); + return rgw_shards_mod(sid2, num_shards); } static inline int rgw_shards_max() diff --git a/src/rgw/rgw_reshard.cc b/src/rgw/rgw_reshard.cc index 03c1fb92e09b4..4fe60b7ba3b9f 100644 --- a/src/rgw/rgw_reshard.cc +++ b/src/rgw/rgw_reshard.cc @@ -595,9 +595,8 @@ void RGWReshard::get_bucket_logshard_oid(const string& tenant, const string& buc uint32_t sid = ceph_str_hash_linux(key.c_str(), key.size()); uint32_t sid2 = sid ^ ((sid & 0xFF) << 24); sid = sid2 % MAX_RESHARD_LOGSHARDS_PRIME % num_logshards; - int logshard = sid % num_logshards; - get_logshard_oid(logshard, oid); + get_logshard_oid(int(sid), oid); } int RGWReshard::add(cls_rgw_reshard_entry& entry) -- 2.39.5