diff --git a/src/common/db_backend_lmdb.cpp b/src/common/db_backend_lmdb.cpp index f27a696d..726b47a3 100644 --- a/src/common/db_backend_lmdb.cpp +++ b/src/common/db_backend_lmdb.cpp @@ -49,7 +49,8 @@ namespace tools res = mdb_env_create(&m_penv); CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_create"); - res = mdb_env_set_maxdbs(m_penv, 15); + MDB_dbi max_dbs = 15; + res = mdb_env_set_maxdbs(m_penv, max_dbs); CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_set_maxdbs"); m_path = path_; @@ -59,8 +60,23 @@ namespace tools CHECK_AND_ASSERT_MES(tools::create_directories_if_necessary(m_path), false, "create_directories_if_necessary failed: " << m_path); - res = mdb_env_open(m_penv, m_path.c_str(), MDB_NORDAHEAD /*| MDB_NOSYNC | MDB_WRITEMAP | MDB_MAPASYNC*/, 0644); - CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_open, m_path=" << m_path); + unsigned int lmdb_flags = MDB_NORDAHEAD /*| MDB_NOSYNC | MDB_WRITEMAP | MDB_MAPASYNC*/; + mdb_mode_t lmdb_mode = 0644; + + res = mdb_env_open(m_penv, m_path.c_str(), lmdb_flags, lmdb_mode); + if (res != MDB_SUCCESS) + { + // DB created with prev LMDB 0.9.18 cannot be opened due to huge map size set in env + // try to remove DB folder completely and re-open + boost::filesystem::remove_all(m_path); + CHECK_AND_ASSERT_MES(tools::create_directories_if_necessary(m_path), false, "create_directories_if_necessary failed: " << m_path); + res = mdb_env_create(&m_penv); + CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_create"); + res = mdb_env_set_maxdbs(m_penv, max_dbs); + CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_set_maxdbs"); + res = mdb_env_open(m_penv, m_path.c_str(), lmdb_flags, lmdb_mode); + CHECK_AND_ASSERT_MESS_LMDB_DB(res, false, "Unable to mdb_env_open, m_path=" << m_path); + } resize_if_needed();