]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
kv/RocksDBStore: using PinnableSlice to avoid extra value copy
authorHaomai Wang <haomai@xsky.com>
Wed, 18 Mar 2020 01:51:41 +0000 (09:51 +0800)
committerHaomai Wang <haomai@xsky.com>
Tue, 24 Mar 2020 04:59:29 +0000 (12:59 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/kv/RocksDBStore.cc

index b52cf3711bac96370f55bcfbcd9163f5c641922b..9524a66a72b4d8ca72c8981ba440b73d1f77762f 100644 (file)
@@ -1085,34 +1085,35 @@ int RocksDBStore::get(
     const std::set<string> &keys,
     std::map<string, bufferlist> *out)
 {
+  rocksdb::PinnableSlice value;
   utime_t start = ceph_clock_now();
   auto cf = get_cf_handle(prefix);
   if (cf) {
     for (auto& key : keys) {
-      std::string value;
       auto status = db->Get(rocksdb::ReadOptions(),
                            cf,
                            rocksdb::Slice(key),
                            &value);
       if (status.ok()) {
-       (*out)[key].append(value);
+       (*out)[key].append(value.data(), value.size());
       } else if (status.IsIOError()) {
        ceph_abort_msg(status.getState());
       }
+      value.Reset();
     }
   } else {
     for (auto& key : keys) {
-      std::string value;
       string k = combine_strings(prefix, key);
       auto status = db->Get(rocksdb::ReadOptions(),
                            default_cf,
                            rocksdb::Slice(k),
                            &value);
       if (status.ok()) {
-       (*out)[key].append(value);
+       (*out)[key].append(value.data(), value.size());
       } else if (status.IsIOError()) {
        ceph_abort_msg(status.getState());
       }
+      value.Reset();
     }
   }
   utime_t lat = ceph_clock_now() - start;
@@ -1129,7 +1130,7 @@ int RocksDBStore::get(
   ceph_assert(out && (out->length() == 0));
   utime_t start = ceph_clock_now();
   int r = 0;
-  string value;
+  rocksdb::PinnableSlice value;
   rocksdb::Status s;
   auto cf = get_cf_handle(prefix);
   if (cf) {
@@ -1145,7 +1146,7 @@ int RocksDBStore::get(
                &value);
   }
   if (s.ok()) {
-    out->append(value);
+    out->append(value.data(), value.size());
   } else if (s.IsNotFound()) {
     r = -ENOENT;
   } else {
@@ -1166,7 +1167,7 @@ int RocksDBStore::get(
   ceph_assert(out && (out->length() == 0));
   utime_t start = ceph_clock_now();
   int r = 0;
-  string value;
+  rocksdb::PinnableSlice value;
   rocksdb::Status s;
   auto cf = get_cf_handle(prefix);
   if (cf) {
@@ -1183,7 +1184,7 @@ int RocksDBStore::get(
                &value);
   }
   if (s.ok()) {
-    out->append(value);
+    out->append(value.data(), value.size());
   } else if (s.IsNotFound()) {
     r = -ENOENT;
   } else {