package com.ctriposs.tsdb.manage; import java.io.File; import java.io.IOException; import java.util.Comparator; import java.util.List; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicLong; import com.ctriposs.tsdb.ILogReader; import com.ctriposs.tsdb.ISeekIterator; import com.ctriposs.tsdb.InternalKey; import com.ctriposs.tsdb.common.IFileIterator; import com.ctriposs.tsdb.storage.FileMeta; import com.ctriposs.tsdb.table.InternalKeyComparator; import com.ctriposs.tsdb.table.MapFileLogReader; import com.ctriposs.tsdb.table.MemTable; import com.ctriposs.tsdb.util.FileUtil; public class FileManager { public final static long MAX_FILE_SIZE = 2*1024*1024*1024L; public final static int MAX_FILES = 30; private String dir; private AtomicLong maxFileNumber = new AtomicLong(1L); private InternalKeyComparator internalKeyComparator; private NameManager nameManager; private long maxPeriod; private int levelNum = 1; private Comparator<FileMeta> fileMetaComparator = new Comparator<FileMeta>(){ @Override public int compare(FileMeta o1, FileMeta o2) { return (int) (o2.getFileNumber() - o1.getFileNumber()); } }; private Comparator<ISeekIterator> iteratorComparator = new Comparator<ISeekIterator>(){ @Override public int compare(ISeekIterator o1,ISeekIterator o2) { if(o2.priority() == o1.priority()){ return 0; }else{ if(o2.priority() < o1.priority()){ return 1; }else{ return -1; } } } }; private Comparator<IFileIterator> fileIteratorComparator = new Comparator<IFileIterator>(){ @Override public int compare(IFileIterator o1,IFileIterator o2) { if(o2.priority() == o1.priority()){ return 0; }else{ if(o2.priority() < o1.priority()){ return -1; }else{ return 1; } } } }; private Comparator<MemTable> memTableComparator = new Comparator<MemTable>() { @Override public int compare(MemTable o1, MemTable o2) { return (int)(o2.getFileNumber()-o1.getFileNumber()); } }; public FileManager(String dir,long maxPeriod, InternalKeyComparator internalKeyComparator, NameManager nameManager){ this.dir = dir; this.internalKeyComparator = internalKeyComparator; this.nameManager = nameManager; this.maxPeriod = maxPeriod; } public void setLevel(int levelNum){ this.levelNum = levelNum; } public int getLevelNum(){ return this.levelNum; } public int compare(InternalKey o1, InternalKey o2){ return internalKeyComparator.compare(o1,o2); } public void delete(File file)throws IOException { FileUtil.forceDelete(file); } public String getStoreDir(){ return dir; } public long getFileNumber(){ return maxFileNumber.getAndIncrement(); } public void upateFileNumber(long fileNumber){ long l = maxFileNumber.get(); if(fileNumber>l){ maxFileNumber.set(fileNumber); } } public short getCode(String name) throws IOException { return nameManager.getCode(name); } public String getName(short code) { return nameManager.getName(code); } public InternalKeyComparator getInternalKeyComparator() { return internalKeyComparator; } public long getMaxPeriod() { return maxPeriod; } public void recoveryName()throws IOException { List<File> list = FileUtil.listFiles(new File(dir),"name"); for(File file:list){ ILogReader logReader = new MapFileLogReader(file,0,internalKeyComparator); boolean delete = false; for(Entry<String,Short>entry:logReader.getNameMap().entrySet()){ nameManager.add(entry.getKey(), entry.getValue()); delete = true; } logReader.close(); if(delete){ FileUtil.forceDelete(file); } } } public Comparator<FileMeta> getFileMetaComparator(){ return fileMetaComparator; } public Comparator<ISeekIterator> getIteratorComparator(){ return iteratorComparator; } public Comparator<IFileIterator> getFileIteratorComparator(){ return fileIteratorComparator; } public Comparator<MemTable> getMemTableComparator(){ return memTableComparator; } }