]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: hash full sync keys to shards
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 1 Sep 2015 02:22:53 +0000 (19:22 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 12 Feb 2016 00:12:38 +0000 (16:12 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_sync.cc

index 4acb2451ec6ecac7eeecbb6af90b5fcf9aafdb5f..f6e3186609fa88b0e4cbdb602a189200e5064bab 100644 (file)
@@ -2809,6 +2809,13 @@ next:
   return 0;
 }
 
+int RGWRados::key_to_shard_id(const string& key, int max_shards)
+{
+  uint32_t val = ceph_str_hash_linux(key.c_str(), key.size());
+#warning a bad hash, need to use prime
+  return val % max_shards;
+}
+
 void RGWRados::shard_name(const string& prefix, unsigned max_shards, const string& key, string& name)
 {
   uint32_t val = ceph_str_hash_linux(key.c_str(), key.size());
index 2855763dfc418e81570ed40acb53f62ded81f156..d7c46cf362819e49f18281d9b50a82a271f34a6d 100644 (file)
@@ -2407,6 +2407,7 @@ public:
                              string& read_iter, map<rgw_user_bucket, rgw_usage_log_entry>& usage, bool *is_truncated);
   int cls_obj_usage_log_trim(string& oid, string& user, uint64_t start_epoch, uint64_t end_epoch);
 
+  int key_to_shard_id(const string& key, int max_shards);
   void shard_name(const string& prefix, unsigned max_shards, const string& key, string& name);
   void shard_name(const string& prefix, unsigned max_shards, const string& section, const string& key, string& name);
   void shard_name(const string& prefix, unsigned shard_id, string& name);
index 65519ed2788d39a2c043be1b487e0997da0c259b..6e7e8d36c559b59b60d67b1ff939e6f3e0677495 100644 (file)
@@ -968,7 +968,8 @@ public:
   }
   void append(const string& entry) {
     static int counter = 0;
-    shards[++counter % shards.size()]->append(entry);
+    int shard_id = store->key_to_shard_id(entry, shards.size());
+    shards[shard_id]->append(entry);
   }
   void finish() {
     for (vector<RGWOmapAppend *>::iterator iter = shards.begin(); iter != shards.end(); ++iter) {