From: Sage Weil Date: Mon, 19 Oct 2015 18:06:17 +0000 (-0400) Subject: kv/LevelDBStore: make set() avoid bufferlist copy most of the time X-Git-Tag: v10.0.1~116^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ca72d506cd73e5665a77e6113c83927f879d18ad;p=ceph.git kv/LevelDBStore: make set() avoid bufferlist copy most of the time Signed-off-by: Sage Weil --- diff --git a/src/kv/LevelDBStore.cc b/src/kv/LevelDBStore.cc index 92c915810f68..a46558a5ca28 100644 --- a/src/kv/LevelDBStore.cc +++ b/src/kv/LevelDBStore.cc @@ -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,