package com.alibaba.doris.dataserver.extratools.replica;
import java.io.File;
import java.util.Iterator;
import org.apache.commons.lang.StringUtils;
import com.alibaba.doris.common.data.ActionPair;
import com.alibaba.doris.common.data.Pair;
import com.alibaba.doris.dataserver.extratools.replica.action.ExportActionData;
import com.alibaba.doris.dataserver.extratools.replica.action.ImportActionData;
import com.alibaba.doris.dataserver.store.ClosableIterator;
import com.alibaba.doris.dataserver.store.Storage;
import com.alibaba.doris.dataserver.store.log.db.ClumpConfigure;
import com.alibaba.doris.dataserver.store.log.db.LogClump;
import com.alibaba.doris.dataserver.store.log.db.LogClumpManager;
import com.alibaba.doris.dataserver.store.log.db.WriteWindow;
import com.alibaba.doris.dataserver.store.log.entry.LogEntry;
import com.alibaba.doris.dataserver.store.log.entry.SetLogEntry;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class ReplicaTool {
public int exportData(Storage storage, ExportActionData actionData) {
checkPath(actionData);
ClumpConfigure config = getClumpConfigure(actionData.getTarget());
LogClumpManager manager = new LogClumpManager(config);
int itemNum = 0;
WriteWindow writeWindow = null;
try {
Iterator<Pair> iterator = storage.iterator();
LogClump clump = manager.getLogClump();
while (iterator.hasNext()) {
Pair pair = iterator.next();
if (clump.size() > config.getMaxFileSize()) {
if (null != writeWindow) {
writeWindow.close();
writeWindow = null;
}
clump = manager.getLogClump();
}
if (null == writeWindow) {
writeWindow = clump.getWriteWindow();
}
LogEntry logEntry = new SetLogEntry(pair.getKey(), pair.getValue());
writeWindow.append(logEntry);
itemNum++;
}
} finally {
manager.releaseAllResources();
if (null != writeWindow) {
writeWindow.close();
}
}
return itemNum;
}
public int importData(Storage storage, ImportActionData actionData) {
File f = new File(actionData.getSource());
if (!f.isDirectory() || !f.exists()) {
throw new ReplicaException("The source path is not exists. path=" + actionData.getSource());
}
int itemNum = 0;
boolean isCas = isCas(actionData.getCas());
ClumpConfigure config = getClumpConfigure(actionData.getSource());
LogClumpManager manager = new LogClumpManager(config);
ClosableIterator<Pair> iterator = null;
try {
iterator = manager.iterator();
while (iterator.hasNext()) {
ActionPair actionPair = (ActionPair) iterator.next();
if (actionPair.getActionType() == ActionPair.Type.SET) {
storage.set(actionPair.getKey(), actionPair.getValue(), isCas);
itemNum++;
}
}
} finally {
if (null != iterator) {
iterator.close();
}
manager.releaseAllResources();
}
return itemNum;
}
private boolean isCas(String iscas) {
if (StringUtils.isBlank(iscas)) {
return false;
}
if ("true".equalsIgnoreCase(iscas)) {
return true;
}
return false;
}
private void checkPath(ExportActionData actionData) {
File f = new File(actionData.getTarget());
if (!f.exists()) {
if (!f.mkdir()) {
throw new ReplicaException("Couldn't create path :" + actionData.getTarget());
}
actionData.setTarget(f.getPath());
}
}
private ClumpConfigure getClumpConfigure(String path) {
ClumpConfigure config = new ClumpConfigure();
config.setPath(path);
config.setReadBufferSize(1024 * 1024);
config.setWriteBufferSize(1024 * 1024);
config.setMaxFileSize(1024 * 1024 * 1024);// 1G
config.setWriteDirect(false);// 不缓存数据直接写入磁盘
return config;
}
}