From beedd6d8040f430f59b6e49054f6bdf4df44068a Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Wed, 18 Mar 2020 09:51:41 +0800 Subject: [PATCH] kv/RocksDBStore: using PinnableSlice to avoid extra value copy Signed-off-by: Haomai Wang --- src/kv/RocksDBStore.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index b52cf3711ba..9524a66a72b 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -1085,34 +1085,35 @@ int RocksDBStore::get( const std::set &keys, std::map *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 { -- 2.39.5