KeyValueEngine* LMDBEngineFactory::CreateDB(const std::string& name) { if (!m_env_opened) { make_dir(m_cfg.path); int env_opt = MDB_NOSYNC | MDB_NOMETASYNC | MDB_NOMETASYNC; int rc = mdb_env_open(m_env, m_cfg.path.c_str(), env_opt, 0664); if (rc != 0) { ERROR_LOG("Failed to open mdb:%s\n", mdb_strerror(rc)); return NULL; } m_env_opened = true; } LMDBEngine* engine = new LMDBEngine(); LMDBConfig cfg = m_cfg; if (engine->Init(cfg, m_env, name) != 0) { DELETE(engine); return NULL; } DEBUG_LOG( "Create DB:%s at path:%s success", name.c_str(), cfg.path.c_str()); return engine; }
KeyValueEngine* LMDBEngineFactory::CreateDB(const std::string& name) { if (!m_env_opened) { mdb_env_create(&m_env); int page_size = sysconf(_SC_PAGE_SIZE); int rc = mdb_env_set_mapsize(m_env, (m_cfg.max_db_size / page_size) * page_size); if (rc != MDB_SUCCESS) { ERROR_LOG("Invalid db size:%llu for reason:%s", m_cfg.max_db_size, mdb_strerror(rc)); return NULL; } char tmp[m_cfg.path.size() + name.size() + 10]; sprintf(tmp, "%s/%s", m_cfg.path.c_str(), name.c_str()); m_cfg.path = tmp; make_dir(m_cfg.path); int env_opt = MDB_NOSYNC | MDB_NOMETASYNC | MDB_WRITEMAP | MDB_MAPASYNC ; if(!m_cfg.readahead) { env_opt |= MDB_NORDAHEAD; } rc = mdb_env_open(m_env, m_cfg.path.c_str(), env_opt, 0664); if (rc != MDB_SUCCESS) { ERROR_LOG("Failed to open mdb:%s", mdb_strerror(rc)); return NULL; } m_env_opened = true; } LMDBEngine* engine = new LMDBEngine(); LMDBConfig cfg = m_cfg; if (engine->Init(cfg, m_env, name) != 0) { DELETE(engine); return NULL; } DEBUG_LOG("Create DB:%s at path:%s success", name.c_str(), cfg.path.c_str()); return engine; }