]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: make extent key generation a little faster
authorxie xingguo <xie.xingguo@zte.com.cn>
Fri, 9 Sep 2016 10:56:24 +0000 (18:56 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Sat, 10 Sep 2016 01:22:20 +0000 (09:22 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc

index 829fb3350cd7fd89dad725da2f8d7139bc786c48..cf72e76dd5fe6760b7ad0b7b8312e421c18de10d 100644 (file)
@@ -380,6 +380,15 @@ static void get_extent_shard_key(const string& onode_key, uint32_t offset,
   key->push_back(EXTENT_SHARD_KEY_SUFFIX);
 }
 
+static void rewrite_extent_shard_key(uint32_t offset, string *key)
+{
+  assert(key->size() > sizeof(uint32_t) + 1);
+  assert(*key->rbegin() == EXTENT_SHARD_KEY_SUFFIX);
+  string offstr;
+  _key_encode_u32(offset, &offstr);
+  key->replace(key->size() - sizeof(uint32_t) - 1, sizeof(uint32_t), offstr);
+}
+
 int get_key_extent_shard(const string& key, string *onode_key, uint32_t *offset)
 {
   assert(key.size() > sizeof(uint32_t) + 1);
@@ -1766,10 +1775,15 @@ void BlueStore::ExtentMap::fault_range(
           << std::dec << dendl;
   auto p = seek_shard(offset);
   auto last = seek_shard(offset + length);
+  bool first_key = true;
+  string key;
   while (p != shards.end()) {
     if (!p->loaded) {
-      string key;
-      get_extent_shard_key(onode->key, p->offset, &key);
+      if (first_key) {
+        get_extent_shard_key(onode->key, p->offset, &key);
+        first_key = false;
+      } else
+        rewrite_extent_shard_key(p->offset, &key);
       bufferlist v;
       int r = db->get(PREFIX_OBJ, key, &v);
       if (r < 0) {