]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kv: add char* versions of get, set, rmkey
authorSage Weil <sage@redhat.com>
Fri, 23 Dec 2016 21:36:44 +0000 (16:36 -0500)
committerSage Weil <sage@redhat.com>
Fri, 13 Jan 2017 16:48:03 +0000 (11:48 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/kv/KeyValueDB.h
src/kv/RocksDBStore.cc
src/kv/RocksDBStore.h

index cfaea4b6ffdede5cd307a5f8481bfb56823c7997..a55e2266e8c283b7afe3287114242d75a99d322d 100644 (file)
@@ -56,7 +56,13 @@ public:
       const std::string &k,          ///< [in] Key to set
       const bufferlist &bl    ///< [in] Value to set
       ) = 0;
-
+    virtual void set(
+      const std::string &prefix,
+      const char *k,
+      size_t keylen,
+      const bufferlist& bl) {
+      set(prefix, string(k, keylen), bl);
+    }
 
     /// Removes Keys (via encoded bufferlist)
     void rmkeys(
@@ -88,6 +94,13 @@ public:
       const std::string &prefix,   ///< [in] Prefix to search for
       const std::string &k           ///< [in] Key to remove
       ) = 0;
+    virtual void rmkey(
+      const std::string &prefix,   ///< [in] Prefix to search for
+      const char *k,         ///< [in] Key to remove
+      size_t keylen
+      ) {
+      rmkey(prefix, string(k, keylen));
+    }
 
     /// Remove Single Key which exists and was not overwritten.
     /// This API is only related to performance optimization, and should only be 
@@ -154,6 +167,11 @@ public:
     }
     return r;
   }
+  virtual int get(const string &prefix,
+                 const char *key, size_t keylen,
+                 bufferlist *value) {
+    return get(prefix, string(key, keylen), value);
+  }
 
   class GenericIteratorImpl {
   public:
index 2e339c062c553129fc92efa63b562f400c3ce649..ee790084a82c8c758e4ef2ea0f40e8c943a6b1ed 100644 (file)
@@ -543,12 +543,42 @@ void RocksDBStore::RocksDBTransactionImpl::set(
   }
 }
 
+void RocksDBStore::RocksDBTransactionImpl::set(
+  const string &prefix,
+  const char *k, size_t keylen,
+  const bufferlist &to_set_bl)
+{
+  string key;
+  combine_strings(prefix, k, keylen, &key);
+
+  // 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,
                                                 const string &k)
 {
   bat.Delete(combine_strings(prefix, k));
 }
 
+void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix,
+                                                const char *k,
+                                                size_t keylen)
+{
+  string key;
+  combine_strings(prefix, k, keylen, &key);
+  bat.Delete(key);
+}
+
 void RocksDBStore::RocksDBTransactionImpl::rm_single_key(const string &prefix,
                                                         const string &k)
 {
@@ -629,19 +659,28 @@ int RocksDBStore::get(
   return r;
 }
 
-string RocksDBStore::combine_strings(const string &prefix, const string &value)
-{
-  string out = prefix;
-  out.push_back(0);
-  out.append(value);
-  return out;
-}
-
-bufferlist RocksDBStore::to_bufferlist(rocksdb::Slice in)
+int RocksDBStore::get(
+  const string& prefix,
+  const char *key,
+  size_t keylen,
+  bufferlist *out)
 {
-  bufferlist bl;
-  bl.append(bufferptr(in.data(), in.size()));
-  return bl;
+  assert(out && (out->length() == 0));
+  utime_t start = ceph_clock_now();
+  int r = 0;
+  string value, k;
+  combine_strings(prefix, key, keylen, &k);
+  rocksdb::Status s;
+  s = db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value);
+  if (s.ok()) {
+    out->append(value);
+  } else {
+    r = -ENOENT;
+  }
+  utime_t lat = ceph_clock_now() - start;
+  logger->inc(l_rocksdb_gets);
+  logger->tinc(l_rocksdb_get_latency, lat);
+  return r;
 }
 
 int RocksDBStore::split_key(rocksdb::Slice in, string *prefix, string *key)
index 0560de7f71598a49405006d63fe260f95090c8ac..ca7f81ebe91956c87195a4fddcf7ceebebdf8e84 100644 (file)
@@ -254,9 +254,18 @@ public:
       const string &prefix,
       const string &k,
       const bufferlist &bl) override;
+    void set(
+      const string &prefix,
+      const char *k,
+      size_t keylen,
+      const bufferlist &bl) override;
     void rmkey(
       const string &prefix,
       const string &k) override;
+    void rmkey(
+      const string &prefix,
+      const char *k,
+      size_t keylen) override;
     void rm_single_key(
       const string &prefix,
       const string &k) override;
@@ -279,12 +288,18 @@ public:
     const string &prefix,
     const std::set<string> &key,
     std::map<string, bufferlist> *out
-    );
+    ) override;
   int get(
     const string &prefix,
     const string &key,
     bufferlist *out
-    );
+    ) override;
+  int get(
+    const string &prefix,
+    const char *key,
+    size_t keylen,
+    bufferlist *out) override;
+
 
   class RocksDBWholeSpaceIteratorImpl :
     public KeyValueDB::WholeSpaceIteratorImpl {
@@ -314,9 +329,29 @@ public:
   };
 
   /// Utility
-  static string combine_strings(const string &prefix, const string &value);
+  static string combine_strings(const string &prefix, const string &value) {
+    string out = prefix;
+    out.push_back(0);
+    out.append(value);
+    return out;
+  }
+  static void combine_strings(const string &prefix,
+                             const char *key, size_t keylen,
+                             string *out) {
+    out->reserve(prefix.size() + 1 + keylen);
+    *out = prefix;
+    out->push_back(0);
+    out->append(key, keylen);
+  }
+
   static int split_key(rocksdb::Slice in, string *prefix, string *key);
-  static bufferlist to_bufferlist(rocksdb::Slice in);
+
+  static bufferlist to_bufferlist(rocksdb::Slice in) {
+    bufferlist bl;
+    bl.append(bufferptr(in.data(), in.size()));
+    return bl;
+  }
+
   static string past_prefix(const string &prefix);
 
   class MergeOperatorRouter;