]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kv/LevelDBStore: make set() avoid bufferlist copy most of the time
authorSage Weil <sage@redhat.com>
Mon, 19 Oct 2015 18:06:17 +0000 (14:06 -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/LevelDBStore.cc

index 92c915810f68cadaae6800f5fc0997cdeefd6038..a46558a5ca28a34bbeaf7a652e8d662fa4bc16fc 100644 (file)
@@ -164,11 +164,19 @@ void LevelDBStore::LevelDBTransactionImpl::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(leveldb::Slice(key));
-  bat.Put(leveldb::Slice(key),
-         leveldb::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(leveldb::Slice(key),
+           leveldb::Slice(to_set_bl.buffers().front().c_str(),
+                          to_set_bl.length()));
+  } else {
+    // make a copy
+    bufferlist val = to_set_bl;
+    bat.Put(leveldb::Slice(key),
+           leveldb::Slice(val.c_str(), val.length()));
+  }
 }
 
 void LevelDBStore::LevelDBTransactionImpl::rmkey(const string &prefix,