package com.alibaba.doris.dataserver.store.log.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.doris.dataserver.store.log.LogStorageException;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class LogFileUtil {
/**
* 根据路径和clump的名称构建数据文件的完整名称。
*
* @param path
* @param clumpName
* @return
*/
public static String generateHeadFileName(String path, String clumpName) {
if (path.endsWith(String.valueOf(File.separatorChar))) {
return path + clumpName + HEAD_FILE_SUFFIX;
}
return path + File.separatorChar + clumpName + HEAD_FILE_SUFFIX;
}
/**
* 根据路径和clump的名称构建数据文件的完整名称。
*
* @param path
* @param clumpName
* @return
*/
public static String generateDataFileName(String path, String clumpName) {
if (path.endsWith(String.valueOf(File.separatorChar))) {
return path + clumpName + DATA_FILE_SUFFIX;
}
return path + File.separatorChar + clumpName + DATA_FILE_SUFFIX;
}
/**
* 根据一个文件名称,解析出clump的名称
*
* @param fileName
* @return
*/
public static String parseClumpNameFromFileName(String fileName) {
int pos = fileName.lastIndexOf(File.separatorChar);
if (pos > 0) {
fileName = fileName.substring(pos + 1);
}
return fileName.substring(0, fileName.length() - HEAD_FILE_SUFFIX.length());
}
/**
* 列出指定path下面所有的clump文件的名称。
*
* @param path
* @return
*/
public static String[] listAllLogClumpFileName(String path) {
File f = new File(path);
if (f.exists() && f.isDirectory()) {
String[] fileNames = f.list();
if (null != fileNames) {
Set<String> nameSet = new HashSet<String>(fileNames.length);
for (String fileName : fileNames) {
if (isLogClumpFileName(fileName)) {
nameSet.add(parseClumpNameFromFileName(fileName));
}
}
return nameSet.toArray(new String[nameSet.size()]);
}
return new String[0];
}
return EMPTY_STRING_ARRAY;
}
public static boolean isLogClumpFileName(String fileName) {
return fileName.endsWith(DATA_FILE_SUFFIX) || fileName.endsWith(HEAD_FILE_SUFFIX);
}
/**
* 获取指定目录下面clump文件的最大编号。
*
* @param path
* @return
*/
public static int getMaxClumpNo(String path) {
String[] fileNames = listAllLogClumpFileName(path);
if (fileNames.length > 0) {
List<String> list = new ArrayList<String>(fileNames.length);
Collections.sort(list);
String clumpName = list.get(list.size() - 1);
return getClumpNoFromClumpName(clumpName);
} else {
return 0;
}
}
/**
* 根据一个给定的Clump文件名获取对应的clump编号。
*
* @param clumpName
* @return
*/
public static int getClumpNoFromClumpName(String clumpName) {
return Integer.valueOf(clumpName);
}
/**
* 根据clump编号生成一个规范的Clump名称
*
* @param clumpNo
* @return
*/
public static String generateClumpName(int clumpNo) {
return String.format("%08d", clumpNo);
}
public static void deleteClumpFile(String path, String clumpName) {
String headFileName = generateHeadFileName(path, clumpName);
String dataFileName = generateDataFileName(path, clumpName);
File file = new File(headFileName);
if (file.exists()) {
if (!file.delete()) {
String message = "Unable to delete file: " + file;
throw new LogStorageException(message);
}
}
file = new File(dataFileName);
if (file.exists()) {
file.delete();
}
}
private static final String HEAD_FILE_SUFFIX = ".lh";
private static final String DATA_FILE_SUFFIX = ".ld";
private static final String[] EMPTY_STRING_ARRAY = new String[] {};
}