package com.alibaba.doris.dataserver.store.bdb.utils;
import java.net.URL;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.common.config.ConfigTools;
import com.alibaba.doris.dataserver.store.bdb.BDBStorageConfig;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.EnvironmentConfig;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class BDBConfigUtil {
/**
* 从配置文件中装载BDB存储层的详细配置项。
*
* @param configFile
* @return
*/
public static BDBStorageConfig loadBDBStorageConfigFromFile(String configFile) {
if (StringUtils.isBlank(configFile)) {
throw new IllegalArgumentException("Configure file can't be empty.");
}
Properties properties = ConfigTools.loadProperties(configFile);
if (null == properties) {
properties = ConfigTools.loadProperties("default_bdb.properties");
if (logger.isDebugEnabled()) {
logger.debug("Couldn't load properties file :" + configFile
+ " Using default bdb properties file. (default_bdb.properties)");
}
} else {
if (logger.isDebugEnabled()) {
logger.debug("Loading bdb properties file: " + configFile);
}
}
BDBStorageConfig config = new BDBStorageConfig();
config.setCursorPreload(Boolean.valueOf(StringUtils.trim(properties.getProperty(CURSOR_PRELOAD, "true"))));
String path = StringUtils.trim(properties.getProperty("database.directory"));
if (StringUtils.isBlank(path)) {
path = getDataBaseDirectory();
}
config.setDataDirectory(path);
config.setPerDatabaseOneEnvironment(Boolean.valueOf(StringUtils.trim(properties.getProperty(
PER_DATABASE_ONE_ENV,
"false"))));
config.setAllowCreate(Boolean.valueOf(StringUtils.trim(properties.getProperty(ALLOW_CREATE, "false"))));
config.setDbBtreeFanout(Integer.valueOf(StringUtils.trim(properties.getProperty(DB_BTREE_FANOUT, "0"))));
config.setSortedDuplicates(Boolean.valueOf(StringUtils.trim(properties.getProperty(DB_SORTED_DUPLICATES,
"false"))));
config.setDeferredWrite(Boolean.valueOf(StringUtils.trim(properties.getProperty(DB_DEFERRED_WRITE, "false"))));
// *****remove****//
removeNonJeProperties(properties);
EnvironmentConfig envConfig = new EnvironmentConfig(properties);
envConfig.setAllowCreate(config.isAllowCreate());
config.setEnvironmentConfig(envConfig);
DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setAllowCreate(config.isAllowCreate());
databaseConfig.setSortedDuplicates(config.isSortedDuplicates());
if (config.getDbBtreeFanout() > 0) {
databaseConfig.setNodeMaxEntries(config.getDbBtreeFanout());
}
databaseConfig.setTransactional(envConfig.getTransactional());
databaseConfig.setDeferredWrite(config.isDeferredWrite());
config.setDatabaseConfig(databaseConfig);
return config;
}
private static void removeNonJeProperties(Properties properties) {
properties.remove(CURSOR_PRELOAD);
properties.remove(DATABASE_DIRECTORY);
properties.remove(ALLOW_CREATE);
properties.remove(DB_BTREE_FANOUT);
properties.remove(DB_SORTED_DUPLICATES);
properties.remove(DB_DEFERRED_WRITE);
properties.remove(PER_DATABASE_ONE_ENV);
}
public static String getDataBaseDirectory() {
URL url = BDBConfigUtil.class.getClassLoader().getResource("");
return url.getPath() + BDB_DATA_PATH;
}
private static final String BDB_DATA_PATH = "bdb_db";
private static final String CURSOR_PRELOAD = "cursor.preload";
private static final String DATABASE_DIRECTORY = "database.directory";
private static final String PER_DATABASE_ONE_ENV = "per.database.one.environment";
private static final String ALLOW_CREATE = "allow.create";
private static final String DB_BTREE_FANOUT = "db.btree.fanout";
private static final String DB_SORTED_DUPLICATES = "db.sorted.duplicates";
private static final String DB_DEFERRED_WRITE = "db.deferred.write";
private static final Logger logger = LoggerFactory.getLogger(BDBConfigUtil.class);
}