@@ -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
4747namespace ycsbc {
4848
49+ size_t LmdbDB::field_count_;
50+ std::string LmdbDB::field_prefix_;
51+
4952MDB_env *LmdbDB::env_;
5053MDB_dbi LmdbDB::dbi_;
5154int 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
0 commit comments