From: Piotr Dałek Date: Fri, 4 Dec 2015 13:49:40 +0000 (+0100) Subject: kv: implement value_as_ptr() and use it in .get() X-Git-Tag: v10.0.3~127^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4efa2145cbc2adddcd00f29aeeeecb12c74ea487;p=ceph.git kv: implement value_as_ptr() and use it in .get() Current .get() methods return values as bufferlists, which are replacing bufferlists provided by caller. This is particularly inefficient with MonitorDBStore, because its get() method uses its own temporary bufferlist which is then appended to bufferlist provided by MonitorDBStore user. This changeset: - adds value_as_ptr() which returns just a bufferptr - modifies *DBStore.get() methods to append returned bufferptr to provided bufferlist instead of replacing it - modifies mondbstore to pass provided bufferlist as target for underlying .get() method, instead of providing its own and appending it to one given by caller. This reduces CPU usage of *DBStore.get() methods by up to 5% (particularly visible with MonitorDBStore, which doesn't use two temporary bufferlists anymore). Signed-off-by: Piotr Dałek --- diff --git a/src/kv/KeyValueDB.h b/src/kv/KeyValueDB.h index 347169aecb8e..119036d40e4d 100644 --- a/src/kv/KeyValueDB.h +++ b/src/kv/KeyValueDB.h @@ -163,6 +163,14 @@ public: virtual std::pair raw_key() = 0; virtual bool raw_key_is_prefixed(const std::string &prefix) = 0; virtual bufferlist value() = 0; + virtual bufferptr value_as_ptr() { + bufferlist bl = value(); + if (bl.length()) { + return *bl.buffers().begin(); + } else { + return bufferptr(); + } + } virtual int status() = 0; virtual ~WholeSpaceIteratorImpl() { } }; @@ -223,6 +231,9 @@ public: bufferlist value() { return generic_iter->value(); } + bufferptr value_as_ptr() { + return generic_iter->value_as_ptr(); + } int status() { return generic_iter->status(); } diff --git a/src/kv/LevelDBStore.cc b/src/kv/LevelDBStore.cc index 481fbf16d044..0056c4aa13c9 100644 --- a/src/kv/LevelDBStore.cc +++ b/src/kv/LevelDBStore.cc @@ -272,7 +272,7 @@ int LevelDBStore::get(const string &prefix, KeyValueDB::Iterator it = get_iterator(prefix); it->lower_bound(key); if (it->valid() && it->key() == key) { - *value = it->value(); + value->append(it->value_as_ptr()); } else { r = -ENOENT; } diff --git a/src/kv/LevelDBStore.h b/src/kv/LevelDBStore.h index 6ffcb62da808..8a201dfa08d5 100644 --- a/src/kv/LevelDBStore.h +++ b/src/kv/LevelDBStore.h @@ -298,6 +298,12 @@ public: bufferlist value() { return to_bufferlist(dbiter->value()); } + + bufferptr value_as_ptr() { + leveldb::Slice data = dbiter->value(); + return bufferptr(data.data(), data.size()); + } + int status() { return dbiter->status().ok() ? 0 : -1; } diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index 561b065ed9bf..b4b925315345 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -371,7 +371,7 @@ int RocksDBStore::get( KeyValueDB::Iterator it = get_iterator(prefix); it->lower_bound(key); if (it->valid() && it->key() == key) { - *out = it->value(); + out->append(it->value_as_ptr()); } else { r = -ENOENT; } @@ -589,6 +589,13 @@ bufferlist RocksDBStore::RocksDBWholeSpaceIteratorImpl::value() { return to_bufferlist(dbiter->value()); } + +bufferptr RocksDBStore::RocksDBWholeSpaceIteratorImpl::value_as_ptr() +{ + rocksdb::Slice val = dbiter->value(); + return bufferptr(val.data(), val.size()); +} + int RocksDBStore::RocksDBWholeSpaceIteratorImpl::status() { return dbiter->status().ok() ? 0 : -1; @@ -601,7 +608,6 @@ string RocksDBStore::past_prefix(const string &prefix) return limit; } - RocksDBStore::WholeSpaceIterator RocksDBStore::_get_iterator() { return std::shared_ptr( diff --git a/src/kv/RocksDBStore.h b/src/kv/RocksDBStore.h index 45278e068230..9eb2d9db0c0e 100644 --- a/src/kv/RocksDBStore.h +++ b/src/kv/RocksDBStore.h @@ -192,6 +192,7 @@ public: pair raw_key(); bool raw_key_is_prefixed(const string &prefix); bufferlist value(); + bufferptr value_as_ptr(); int status(); }; diff --git a/src/mon/MonitorDBStore.h b/src/mon/MonitorDBStore.h index 81016417ec93..6bb35e4e11e8 100644 --- a/src/mon/MonitorDBStore.h +++ b/src/mon/MonitorDBStore.h @@ -507,12 +507,7 @@ class MonitorDBStore } int get(const string& prefix, const string& key, bufferlist& bl) { - bufferlist outbl; - int r = db->get(prefix, key, &outbl); - if (!r) { - bl.append(outbl); - } - return r; + return db->get(prefix, key, &bl); } int get(const string& prefix, const version_t ver, bufferlist& bl) {