int PerconaFTEngine::Init(const std::string& dir, const std::string& options) { Properties props; parse_conf_content(options, props); //parse config conf_get_int64(props, "cache_size", g_perconaft_config.cache_size); conf_get_uint32(props, "checkpoint_pool_threads", g_perconaft_config.checkpoint_pool_threads); conf_get_uint32(props, "checkpoint_period", g_perconaft_config.checkpoint_period); conf_get_uint32(props, "cleaner_period", g_perconaft_config.cleaner_period); conf_get_uint32(props, "cleaner_iterations", g_perconaft_config.cleaner_iterations); conf_get_bool(props, "evictor_enable_partial_eviction", g_perconaft_config.evictor_enable_partial_eviction); std::string compression; conf_get_string(props, "compression", compression); if (compression == "none") { g_perconaft_config.compression = TOKU_NO_COMPRESSION; } else if (compression == "snappy" || compression.empty()) { g_perconaft_config.compression = TOKU_SNAPPY_METHOD; } else if (compression == "zlib") { g_perconaft_config.compression = TOKU_ZLIB_METHOD; } else { ERROR_LOG("Invalid compression config:%s for PercanoFT.", compression.c_str()); return -1; } uint32 env_open_flags = DB_CREATE | DB_PRIVATE | DB_THREAD | DB_INIT_MPOOL | DB_INIT_TXN | DB_INIT_LOCK | DB_INIT_LOG | DB_RECOVER; int env_open_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; db_env_create(&m_env, 0); m_env->set_default_bt_compare(m_env, ardb_perconaft_compare); m_env->set_errcall(m_env, _err_callback); /* * set env config */ uint32 cache_gsize = g_perconaft_config.cache_size >> 30; uint32 cache_bytes = g_perconaft_config.cache_size % (1024 * 1024 * 1024); m_env->set_cachesize(m_env, cache_gsize, cache_bytes, 1); m_env->set_cachetable_pool_threads(m_env, g_perconaft_config.checkpoint_pool_threads); m_env->checkpointing_set_period(m_env, g_perconaft_config.checkpoint_period); m_env->cleaner_set_period(m_env, g_perconaft_config.cleaner_period); m_env->cleaner_set_iterations(m_env, g_perconaft_config.cleaner_iterations); m_env->evictor_set_enable_partial_eviction(m_env, g_perconaft_config.evictor_enable_partial_eviction); int r = m_env->open(m_env, dir.c_str(), env_open_flags, env_open_mode); CHECK_EXPR(r); DataArray nss; if (0 == r) { g_toku_env = m_env; DB* db = m_env->get_db_for_directory(m_env); if (NULL != db) { PerconaFTLocalContext& local_ctx = g_local_ctx.GetValue(); DB_TXN* txn = local_ctx.transc.Get(); DBC *c = NULL; CHECK_EXPR(r = db->cursor(db, txn, &c, 0)); if (0 == r) { r = c->c_getf_first(c, 0, nil_callback, NULL); } while (0 == r) { DBT raw_key; DBT raw_val; memset(&raw_key, 0, sizeof(raw_key)); memset(&raw_val, 0, sizeof(raw_key)); if (0 == c->c_get(c, &raw_key, &raw_val, DB_CURRENT)) { //std::string ns_str Data ns; ns.SetString((const char*) raw_key.data, false); INFO_LOG("TokuFT directory db %s:%s", (const char* ) raw_key.data, (const char* ) raw_val.data); nss.push_back(ns); } r = c->c_getf_next(c, 0, nil_callback, NULL); } if (NULL != c) { c->c_close(c); } local_ctx.transc.Release(true); r = 0; } } for (size_t i = 0; i < nss.size(); i++) { Context tmp; GetFTDB(tmp, nss[i], true); } return ENGINE_ERR(r); }