| 8 | namespace caffe { namespace db { |
| 9 | |
| 10 | void LMDB::Open(const string& source, Mode mode) { |
| 11 | LOG(INFO) << "Opening: " << source; |
| 12 | MDB_CHECK(mdb_env_create(&mdb_env_)); |
| 13 | if (mode == NEW) { |
| 14 | CHECK_EQ(mkdir(source.c_str(), 0744), 0) << "mkdir " << source << " failed"; |
| 15 | } |
| 16 | int flags = 0; |
| 17 | if (mode == READ) { |
| 18 | flags = MDB_RDONLY | MDB_NOTLS; |
| 19 | } |
| 20 | int rc = mdb_env_open(mdb_env_, source.c_str(), flags, 0664); |
| 21 | #ifndef ALLOW_LMDB_NOLOCK |
| 22 | MDB_CHECK(rc); |
| 23 | #else |
| 24 | if (rc == EACCES) { |
| 25 | LOG(WARNING) << "Permission denied. Trying with MDB_NOLOCK ..."; |
| 26 | // Close and re-open environment handle |
| 27 | mdb_env_close(mdb_env_); |
| 28 | MDB_CHECK(mdb_env_create(&mdb_env_)); |
| 29 | // Try again with MDB_NOLOCK |
| 30 | flags |= MDB_NOLOCK; |
| 31 | MDB_CHECK(mdb_env_open(mdb_env_, source.c_str(), flags, 0664)); |
| 32 | } else { |
| 33 | MDB_CHECK(rc); |
| 34 | } |
| 35 | #endif |
| 36 | LOG(INFO) << "Opened lmdb " << source; |
| 37 | } |
| 38 | |
| 39 | LMDBCursor* LMDB::NewCursor() { |
| 40 | MDB_txn* mdb_txn; |