Skip to content

Commit 20497a4

Browse files
committed
LMDB code cleanup
1 parent d0a6671 commit 20497a4

3 files changed

Lines changed: 46 additions & 84 deletions

File tree

lmdb/lmdb.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ lmdb.nosync=true
44
lmdb.nometasync=false
55
lmdb.noreadahead=false
66
lmdb.writemap=false
7-
7+
lmdb.mapasync=false

lmdb/lmdb_db.cc

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ namespace {
2525
const std::string PROP_DBPATH = "lmdb.dbpath";
2626
const std::string PROP_DBPATH_DEFAULT = "";
2727

28-
const std::string PROP_FORMAT = "lmdb.format";
29-
const std::string PROP_FORMAT_DEFAULT = "single";
30-
3128
const std::string PROP_MAPSIZE = "lmdb.mapsize";
3229
const std::string PROP_MAPSIZE_DEFAULT = "-1";
3330

@@ -42,10 +39,16 @@ namespace {
4239

4340
const std::string PROP_WRITEMAP = "lmdb.writemap";
4441
const std::string PROP_WRITEMAP_DEFAULT = "false";
42+
43+
const std::string PROP_MAPASYNC = "lmdb.mapasync";
44+
const std::string PROP_MAPASYNC_DEFAULT = "false";
4545
} // anonymous
4646

4747
namespace ycsbc {
4848

49+
size_t LmdbDB::field_count_;
50+
std::string LmdbDB::field_prefix_;
51+
4952
MDB_env *LmdbDB::env_;
5053
MDB_dbi LmdbDB::dbi_;
5154
int LmdbDB::ref_cnt_ = 0;
@@ -55,26 +58,16 @@ void LmdbDB::Init() {
5558
const std::lock_guard<std::mutex> lock(mutex_);
5659

5760
const utils::Properties &props = *props_;
58-
const std::string &format = props.GetProperty(PROP_FORMAT, PROP_FORMAT_DEFAULT);
59-
if (format == "single") {
60-
format_ = kSingleEntry;
61-
method_read_ = &LmdbDB::ReadSingleEntry;
62-
method_scan_ = &LmdbDB::ScanSingleEntry;
63-
method_update_ = &LmdbDB::UpdateSingleEntry;
64-
method_insert_ = &LmdbDB::InsertSingleEntry;
65-
method_delete_ = &LmdbDB::DeleteSingleEntry;
66-
} else {
67-
throw utils::Exception("unknown format");
68-
}
69-
fieldcount_ = std::stoi(props.GetProperty(CoreWorkload::FIELD_COUNT_PROPERTY,
70-
CoreWorkload::FIELD_COUNT_DEFAULT));
71-
field_prefix_ = props.GetProperty(CoreWorkload::FIELD_NAME_PREFIX,
72-
CoreWorkload::FIELD_NAME_PREFIX_DEFAULT);
7361

7462
if (ref_cnt_++) {
7563
return;
7664
}
7765

66+
field_count_ = std::stoi(props.GetProperty(CoreWorkload::FIELD_COUNT_PROPERTY,
67+
CoreWorkload::FIELD_COUNT_DEFAULT));
68+
field_prefix_ = props.GetProperty(CoreWorkload::FIELD_NAME_PREFIX,
69+
CoreWorkload::FIELD_NAME_PREFIX_DEFAULT);
70+
7871
int ret;
7972
int env_opt = 0;
8073
if (props.GetProperty(PROP_NOSYNC, PROP_NOSYNC_DEFAULT) == "true") {
@@ -89,6 +82,9 @@ void LmdbDB::Init() {
8982
if (props.GetProperty(PROP_WRITEMAP, PROP_WRITEMAP_DEFAULT) == "true") {
9083
env_opt |= MDB_WRITEMAP;
9184
}
85+
if (props.GetProperty(PROP_MAPASYNC, PROP_MAPASYNC_DEFAULT) == "true") {
86+
env_opt |= MDB_MAPASYNC;
87+
}
9288
ret = mdb_env_create(&env_);
9389
if (ret) {
9490
throw utils::Exception(std::string("Init mdb_env_create: ") + mdb_strerror(ret));
@@ -186,12 +182,12 @@ void LmdbDB::DeserializeRow(std::vector<Field> *values, const char *data_ptr, si
186182
p += len;
187183
values->push_back({field, value});
188184
}
189-
assert(values->size() == fieldcount_);
185+
assert(values->size() == field_count_);
190186
}
191187

192-
DB::Status LmdbDB::ReadSingleEntry(const std::string &table, const std::string &key,
193-
const std::vector<std::string> *fields,
194-
std::vector<Field> &result) {
188+
DB::Status LmdbDB::Read(const std::string &table, const std::string &key, const std::vector<std::string> *fields,
189+
std::vector<Field> &result) {
190+
DB::Status s = kOK;
195191
MDB_txn *txn;
196192
MDB_val key_slice, val_slice;
197193

@@ -204,22 +200,25 @@ DB::Status LmdbDB::ReadSingleEntry(const std::string &table, const std::string &
204200
throw utils::Exception(std::string("Read mdb_txn_begin: ") + mdb_strerror(ret));
205201
}
206202
ret = mdb_get(txn, dbi_, &key_slice, &val_slice);
207-
if (ret) {
203+
if (ret == MDB_NOTFOUND) {
204+
s = kNotFound;
205+
goto cleanup;
206+
} else if (ret) {
208207
throw utils::Exception(std::string("Read mdb_get: ") + mdb_strerror(ret));
209208
}
210209
if (fields != nullptr) {
211-
DeserializeRowFilter(&result, static_cast<char *>(val_slice.mv_data), val_slice.mv_size,
212-
*fields);
210+
DeserializeRowFilter(&result, static_cast<char *>(val_slice.mv_data), val_slice.mv_size, *fields);
213211
} else {
214212
DeserializeRow(&result, static_cast<char *>(val_slice.mv_data), val_slice.mv_size);
215213
}
214+
cleanup:
216215
mdb_txn_abort(txn);
217-
return kOK;
216+
return s;
218217
}
219218

220-
DB::Status LmdbDB::ScanSingleEntry(const std::string &table, const std::string &key, int len,
221-
const std::vector<std::string> *fields,
222-
std::vector<std::vector<Field>> &result) {
219+
DB::Status LmdbDB::Scan(const std::string &table, const std::string &key, int len,
220+
const std::vector<std::string> *fields, std::vector<std::vector<Field>> &result) {
221+
DB::Status s = kOK;
223222
MDB_txn *txn;
224223
MDB_cursor *cursor;
225224
MDB_val key_slice, val_slice;
@@ -237,28 +236,29 @@ DB::Status LmdbDB::ScanSingleEntry(const std::string &table, const std::string &
237236
throw utils::Exception(std::string("Scan mdb_cursor_open: ") + mdb_strerror(ret));
238237
}
239238
ret = mdb_cursor_get(cursor, &key_slice, &val_slice, MDB_SET);
240-
assert(ret != MDB_NOTFOUND);
241-
if (ret) {
239+
if (ret == MDB_NOTFOUND) {
240+
s = kNotFound;
241+
goto cleanup;
242+
} else if (ret) {
242243
throw utils::Exception(std::string("Scan mdb_cursor_get: ") + mdb_strerror(ret));
243244
}
244245
for (int i = 0; !ret && i < len; i++) {
245246
result.push_back(std::vector<Field>());
246247
std::vector<Field> &values = result.back();
247248
if (fields != nullptr) {
248-
DeserializeRowFilter(&values, static_cast<char *>(val_slice.mv_data), val_slice.mv_size,
249-
*fields);
249+
DeserializeRowFilter(&values, static_cast<char *>(val_slice.mv_data), val_slice.mv_size, *fields);
250250
} else {
251251
DeserializeRow(&values, static_cast<char *>(val_slice.mv_data), val_slice.mv_size);
252252
}
253253
ret = mdb_cursor_get(cursor, &key_slice, &val_slice, MDB_NEXT);
254254
}
255+
cleanup:
255256
mdb_cursor_close(cursor);
256257
mdb_txn_abort(txn);
257-
return kOK;
258+
return s;
258259
}
259260

260-
DB::Status LmdbDB::UpdateSingleEntry(const std::string &table, const std::string &key,
261-
std::vector<Field> &values) {
261+
DB::Status LmdbDB::Update(const std::string &table, const std::string &key, std::vector<Field> &values) {
262262
MDB_txn *txn;
263263
MDB_val key_slice, val_slice;
264264

@@ -304,8 +304,7 @@ DB::Status LmdbDB::UpdateSingleEntry(const std::string &table, const std::string
304304
return kOK;
305305
}
306306

307-
DB::Status LmdbDB::InsertSingleEntry(const std::string &table, const std::string &key,
308-
std::vector<Field> &values) {
307+
DB::Status LmdbDB::Insert(const std::string &table, const std::string &key, std::vector<Field> &values) {
309308
MDB_txn *txn;
310309
MDB_val key_slice, val_slice;
311310

@@ -333,7 +332,7 @@ DB::Status LmdbDB::InsertSingleEntry(const std::string &table, const std::string
333332
return kOK;
334333
}
335334

336-
DB::Status LmdbDB::DeleteSingleEntry(const std::string &table, const std::string &key) {
335+
DB::Status LmdbDB::Delete(const std::string &table, const std::string &key) {
337336
MDB_txn *txn;
338337
MDB_val key_slice;
339338

lmdb/lmdb_db.h

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,62 +27,25 @@ class LmdbDB : public DB {
2727
void Cleanup();
2828

2929
Status Read(const std::string &table, const std::string &key,
30-
const std::vector<std::string> *fields, std::vector<Field> &result) {
31-
return (this->*(method_read_))(table, key, fields, result);
32-
}
30+
const std::vector<std::string> *fields, std::vector<Field> &result);
3331

3432
Status Scan(const std::string &table, const std::string &key, int len,
35-
const std::vector<std::string> *fields, std::vector<std::vector<Field>> &result) {
36-
return (this->*(method_scan_))(table, key, len, fields, result);
37-
}
33+
const std::vector<std::string> *fields, std::vector<std::vector<Field>> &result);
3834

39-
Status Update(const std::string &table, const std::string &key, std::vector<Field> &values) {
40-
return (this->*(method_update_))(table, key, values);
41-
}
35+
Status Update(const std::string &table, const std::string &key, std::vector<Field> &values);
4236

43-
Status Insert(const std::string &table, const std::string &key, std::vector<Field> &values) {
44-
return (this->*(method_insert_))(table, key, values);
45-
}
37+
Status Insert(const std::string &table, const std::string &key, std::vector<Field> &values);
4638

47-
Status Delete(const std::string &table, const std::string &key) {
48-
return (this->*(method_delete_))(table, key);
49-
}
39+
Status Delete(const std::string &table, const std::string &key);
5040

5141
private:
52-
enum LmdbFormat {
53-
kSingleEntry,
54-
kRowMajor,
55-
kColumnMajor
56-
};
57-
LmdbFormat format_;
58-
5942
void SerializeRow(const std::vector<Field> &values, std::string *data);
6043
void DeserializeRowFilter(std::vector<Field> *values, const char *data_ptr, size_t data_len,
6144
const std::vector<std::string> &fields);
6245
void DeserializeRow(std::vector<Field> *values, const char *data_ptr, size_t data_len);
6346

64-
Status ReadSingleEntry(const std::string &table, const std::string &key,
65-
const std::vector<std::string> *fields, std::vector<Field> &result);
66-
Status ScanSingleEntry(const std::string &table, const std::string &key, int len,
67-
const std::vector<std::string> *fields,
68-
std::vector<std::vector<Field>> &result);
69-
Status UpdateSingleEntry(const std::string &table, const std::string &key,
70-
std::vector<Field> &values);
71-
Status InsertSingleEntry(const std::string &table, const std::string &key,
72-
std::vector<Field> &values);
73-
Status DeleteSingleEntry(const std::string &table, const std::string &key);
74-
75-
Status (LmdbDB::*method_read_)(const std::string &, const std:: string &,
76-
const std::vector<std::string> *, std::vector<Field> &);
77-
Status (LmdbDB::*method_scan_)(const std::string &, const std::string &, int,
78-
const std::vector<std::string> *,
79-
std::vector<std::vector<Field>> &);
80-
Status (LmdbDB::*method_update_)(const std::string &, const std::string &, std::vector<Field> &);
81-
Status (LmdbDB::*method_insert_)(const std::string &, const std::string &, std::vector<Field> &);
82-
Status (LmdbDB::*method_delete_)(const std::string &, const std::string &);
83-
84-
unsigned fieldcount_;
85-
std::string field_prefix_;
47+
static size_t field_count_;
48+
static std::string field_prefix_;
8649

8750
static MDB_env *env_;
8851
static MDB_dbi dbi_;

0 commit comments

Comments
 (0)