1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #ifndef KINETIC_STORE_H
4 #define KINETIC_STORE_H
6 #include "include/types.h"
7 #include "include/buffer_fwd.h"
8 #include "KeyValueDB.h"
12 #include "include/memory.h"
13 #include <kinetic/kinetic.h>
16 #include "common/errno.h"
17 #include "common/dout.h"
18 #include "include/assert.h"
19 #include "common/Formatter.h"
21 #include "common/ceph_context.h"
26 l_kinetic_first = 34400,
33 * Uses Kinetic to implement the KeyValueDB interface
35 class KineticStore : public KeyValueDB {
43 std::unique_ptr<kinetic::BlockingKineticConnection> kinetic_conn;
45 int do_open(ostream &out, bool create_if_missing);
48 explicit KineticStore(CephContext *c);
51 static int _test_init(CephContext *c);
54 /// Opens underlying db
55 int open(ostream &out) {
56 return do_open(out, false);
58 /// Creates underlying db if missing and opens it
59 int create_and_open(ostream &out) {
60 return do_open(out, true);
74 KineticOp(KineticOpType type, const string &key) : type(type), key(key) {}
75 KineticOp(KineticOpType type, const string &key, const bufferlist &data)
76 : type(type), key(key), data(data) {}
79 class KineticTransactionImpl : public KeyValueDB::TransactionImpl {
81 vector<KineticOp> ops;
84 explicit KineticTransactionImpl(KineticStore *db) : db(db) {}
88 const bufferlist &bl);
92 void rmkeys_by_prefix(
101 KeyValueDB::Transaction get_transaction() {
102 return std::make_shared<KineticTransactionImpl>(this);
105 int submit_transaction(KeyValueDB::Transaction t);
106 int submit_transaction_sync(KeyValueDB::Transaction t);
108 const string &prefix,
109 const std::set<string> &key,
110 std::map<string, bufferlist> *out
112 using KeyValueDB::get;
114 class KineticWholeSpaceIteratorImpl :
115 public KeyValueDB::WholeSpaceIteratorImpl {
116 std::set<std::string> keys;
117 std::set<std::string>::iterator keys_iter;
118 kinetic::BlockingKineticConnection *kinetic_conn;
119 kinetic::KineticStatus kinetic_status;
121 explicit KineticWholeSpaceIteratorImpl(kinetic::BlockingKineticConnection *conn);
122 virtual ~KineticWholeSpaceIteratorImpl() { }
124 int seek_to_first() {
125 return seek_to_first("");
127 int seek_to_first(const string &prefix);
129 int seek_to_last(const string &prefix);
130 int upper_bound(const string &prefix, const string &after);
131 int lower_bound(const string &prefix, const string &to);
136 pair<string,string> raw_key();
137 bool raw_key_is_prefixed(const string &prefix);
143 static string combine_strings(const string &prefix, const string &value);
144 static int split_key(string &in_prefix, string *prefix, string *key);
145 static bufferlist to_bufferlist(const kinetic::KineticRecord &record);
146 virtual uint64_t get_estimated_size(map<string,uint64_t> &extra) {
147 // not used by the osd
153 WholeSpaceIterator _get_iterator() {
154 return std::make_shared<KineticWholeSpaceIteratorImpl>(kinetic_conn.get());