package com.ctriposs.tsdb.manage; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import com.ctriposs.tsdb.storage.FileName; import com.ctriposs.tsdb.table.MapFileLogWriter; import com.ctriposs.tsdb.table.MemTable; import com.ctriposs.tsdb.util.FileUtil; public class NameManager { private Map<String,Short> nameMap = new ConcurrentHashMap<String,Short>(); private Map<Short,String> codeMap = new ConcurrentHashMap<Short,String>(); private Lock lock = new ReentrantLock(); private AtomicInteger maxCode = new AtomicInteger(0); private MapFileLogWriter fileWriter; private boolean hasData = false; private String dir; public NameManager(String dir) throws IOException { this.dir = dir; this.fileWriter = new MapFileLogWriter( dir, FileName.nameFileName(0), MemTable.MAX_MEM_SIZE) ; } public short getCode(String name) throws IOException { Short code = nameMap.get(name); if(code == null){ try{ lock.lock(); code = nameMap.get(name); if(code==null){ code = (short) maxCode.incrementAndGet(); nameMap.put(name, code); codeMap.put(code, name); if(!fileWriter.add(name, code)){ fileWriter.close(); fileWriter = new MapFileLogWriter( dir, FileName.nameFileName(0), MemTable.MAX_MEM_SIZE) ; fileWriter.add(name, code); } hasData = true; } } finally { lock.unlock(); } } return code; } public String getName(short code){ return codeMap.get(code); } public void add(String name,short code){ nameMap.put(name, code); codeMap.put(code, name); maxCode.incrementAndGet(); } public void close() throws IOException{ fileWriter.close(); if(!hasData){ FileUtil.forceDelete(new File(fileWriter.getName())); } } }