package com.alibaba.doris.dataserver.store;
import java.util.Iterator;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.KeyFactory;
import com.alibaba.doris.common.data.Pair;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.data.ValueFactory;
import com.alibaba.doris.dataserver.BaseModule;
import com.alibaba.doris.dataserver.FatalModuleInitializationException;
import com.alibaba.doris.dataserver.ModuleContextAware;
import com.alibaba.doris.dataserver.ModuleStatusChecker;
import com.alibaba.doris.dataserver.action.data.CheckActionData;
import com.alibaba.doris.dataserver.action.data.CheckActionData.CheckType;
import com.alibaba.doris.dataserver.config.data.ModuleConfigure;
import com.alibaba.doris.dataserver.store.exception.StorageException;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class StorageModule extends BaseModule implements ModuleStatusChecker, ModuleContextAware {
/**
* 初始化存储层模块
*/
public void load(ModuleConfigure conf) {
try {
// 根据DataServer的配置信息,生成存储的配置文件对象。
StorageConfig storageConfig = getStorageConfig(conf);
Class<?> storageDriverClass = getStorageDriverClass(storageConfig);
manager = new StorageManager();
// 向驱动管理器注册当前节点配置的存储驱动。
manager.registStorage(storageDriverClass);
// 调用管理器的装载函数,初始化并装载存储驱动。
manager.loadStorage(storageConfig);
// 打开存储DB,并初始化存储层相关数据。
manager.openStorage();
} catch (Throwable e) {
// 存储层初始化抛出任何异常,系统需要终止启动。
throw new FatalModuleInitializationException(e);
}
}
public void unload() {
manager.closeStorage();
}
public boolean isReady(CheckActionData checkActionData) {
try {
Storage storage = manager.getStorage();
String clazzName = storage.getClass().getName();
CheckType checkType = checkActionData.getCheckType();
// 判断是否是Log存储层
if (clazzName.indexOf("LogStorage") >= 0) {
if (checkType == null || checkType == CheckType.CHECK_TEMP_NODE
|| checkType == CheckType.CHECK_STANDBY_NODE) {
Iterator<Pair> iterator = storage.iterator();
if (null != iterator) {
if (iterator instanceof ClosableIterator) {
((ClosableIterator<Pair>) iterator).close();
}
return true;
}
}
} else {
if (checkType == null || checkType == CheckType.CHECK_NORMAL_NODE
|| checkType == CheckType.CHECK_STANDBY_NODE) {
storage.set(key, value);
Value v = storage.get(key);
if (v != null) {
if (v.equals(value)) {
return true;
}
}
return true;
}
}
} catch (Throwable e) {
logger.error("Checking module isReady.", e);
}
return false;
}
public Storage getStorage() {
return manager.getStorage();
}
private StorageConfig getStorageConfig(ModuleConfigure conf) {
StorageConfig storageConfig = new StorageConfig(conf);
Properties commandLine = conf.getDataServerConfigure().getCommandLine();
String dbPath = commandLine.getProperty("dbPath");
if (StringUtils.isNotBlank(dbPath)) {
storageConfig.setDatabasePath(dbPath);
}
String driverClass = conf.getParam("driver");
storageConfig.setStorageDriverClass(driverClass);
storageConfig.setPropertiesFile(conf.getParam("configFile"));
storageConfig.setSize(conf.getParamAsInt("size", 100 * 1024 * 1024 * 1024));
return storageConfig;
}
private Class<?> getStorageDriverClass(StorageConfig storageConfig) {
try {
Class<?> clazz = Class.forName(storageConfig.getStorageDriverClass());
return clazz;
} catch (ClassNotFoundException e) {
throw new StorageException(e);
}
}
private StorageManager manager;
private static final Logger logger = LoggerFactory.getLogger(StorageModule.class);
private static final Key key = KeyFactory.createKey(999999999, "key1", 0);
private static final Value value = ValueFactory.createValue("_check_value_".getBytes(),
System.currentTimeMillis());
}