]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kv/RocksDBStore: make get() avoid bufferlist copy most of the time
authorSage Weil <sage@redhat.com>
Mon, 19 Oct 2015 17:25:51 +0000 (13:25 -0400)
committerSage Weil <sage@redhat.com>
Mon, 19 Oct 2015 18:06:28 +0000 (14:06 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/kv/RocksDBStore.cc

index 6d2a10217f06374d2cab10cc34445add40926bda..62c180890234615b9b6aa0688d54ca0129ca8dfd 100644 (file)
@@ -241,11 +241,19 @@ void RocksDBStore::RocksDBTransactionImpl::set(
   const bufferlist &to_set_bl)
 {
   string key = combine_strings(prefix, k);
-  //bufferlist::c_str() is non-constant, so we need to make a copy
-  bufferlist val = to_set_bl;
   bat->Delete(rocksdb::Slice(key));
-  bat->Put(rocksdb::Slice(key),
-         rocksdb::Slice(val.c_str(), val.length()));
+
+  // bufferlist::c_str() is non-constant, so we can't call c_str()
+  if (to_set_bl.is_contiguous() && to_set_bl.length() > 0) {
+    bat->Put(rocksdb::Slice(key),
+            rocksdb::Slice(to_set_bl.buffers().front().c_str(),
+                           to_set_bl.length()));
+  } else {
+    // make a copy
+    bufferlist val = to_set_bl;
+    bat->Put(rocksdb::Slice(key),
+            rocksdb::Slice(val.c_str(), val.length()));
+  }
 }
 
 void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix,