diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockFinder.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockFinder.java index 452e0ce9d..f812b997a 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockFinder.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockFinder.java @@ -18,6 +18,11 @@ public class BlockFinder { if (index == null) { index = l2Cache.find(timestamp); } + + if (index == null) { + index = System.currentTimeMillis(); + } + return index; } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockIndexUpdator.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockIndexUpdator.java index c71090c89..2e44a0c0c 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockIndexUpdator.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/BlockIndexUpdator.java @@ -9,8 +9,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static com.a.eye.skywalking.storage.config.Config.DataFileIndex.DATA_FILE_INDEX_FILE_NAME; -import static com.a.eye.skywalking.storage.config.Config.DataFileIndex.STORAGE_BASE_PATH; +import static com.a.eye.skywalking.storage.config.Config.BlockIndex.DATA_FILE_INDEX_FILE_NAME; +import static com.a.eye.skywalking.storage.config.Config.BlockIndex.STORAGE_BASE_PATH; public class BlockIndexUpdator { diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/L2Cache.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/L2Cache.java index f1ed5ad01..9b60a0ee3 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/L2Cache.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/block/index/L2Cache.java @@ -18,7 +18,7 @@ public class L2Cache { this.cacheData.addAll(cacheData); } - public long find(long timestamp) { + public Long find(long timestamp) { Lock lock = updateLock.readLock(); try { lock.lock(); diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java index 6e67945ee..ea20dd76a 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/config/Config.java @@ -4,7 +4,7 @@ package com.a.eye.skywalking.storage.config; * Created by xin on 2016/11/2. */ public class Config { - public static class DataFileIndex { + public static class BlockIndex { public static String STORAGE_BASE_PATH = "/tmp/skywalking/index"; @@ -14,5 +14,12 @@ public class Config { public static class DataFile { public static String BASE_PATH = ""; + + public static long MAX_LENGTH = 3 * 1024 * 1024 * 1024; + } + + + public static class DataIndex { + public static String TABLE_NAME = "data_index"; } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/IndexMetaInfoCategory.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/IndexMetaInfoCategory.java new file mode 100644 index 000000000..0a4742a2d --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/IndexMetaInfoCategory.java @@ -0,0 +1,28 @@ +package com.a.eye.skywalking.storage.data; + +import com.a.eye.skywalking.storage.block.index.BlockFinder; +import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class IndexMetaInfoCategory { + + public static Map> categorizeByDataIndexTime(List indexMetaInfo, + BlockFinder finder) { + Map> categorizeMetaInfo = new HashMap>(); + + for (IndexMetaInfo info : indexMetaInfo) { + long timestamp = finder.find(info.getStartTime()); + + List metaInfos = categorizeMetaInfo.get(timestamp); + if (metaInfos == null) { + metaInfos.add(info); + categorizeMetaInfo.put(timestamp, metaInfos); + } + } + + return categorizeMetaInfo; + } +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanData.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanData.java index 7461daf47..6828bd10c 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanData.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanData.java @@ -1,10 +1,8 @@ package com.a.eye.skywalking.storage.data; -/** - * Created by xin on 2016/11/4. - */ public interface SpanData { - long getTimestamp(); - byte[] convertToByte(); + long getStartTime(); + + byte[] toByteArray(); } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataBuilder.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataBuilder.java deleted file mode 100644 index 9ea41d14d..000000000 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataBuilder.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.a.eye.skywalking.storage.data; - -/** - * Created by xin on 2016/11/4. - */ -public class SpanDataBuilder { -} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataConsumer.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataConsumer.java new file mode 100644 index 000000000..8ee27865d --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataConsumer.java @@ -0,0 +1,36 @@ +package com.a.eye.skywalking.storage.data; + +import com.a.eye.datacarrier.consumer.IConsumer; +import com.a.eye.skywalking.storage.block.index.BlockIndexEngine; +import com.a.eye.skywalking.storage.data.file.DataFileWriter; +import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; +import com.a.eye.skywalking.storage.data.index.IndexOperator; +import com.a.eye.skywalking.storage.data.index.IndexOperatorCache; + +import java.util.List; +import java.util.Map; + +public class SpanDataConsumer implements IConsumer { + + private IndexOperatorCache cache; + private DataFileWriter fileWriter; + + @Override + public void consume(List data) { + List indexMetaInfo = fileWriter.write(data); + + Map> categorizedMetaInfo = + IndexMetaInfoCategory.categorizeByDataIndexTime(indexMetaInfo, BlockIndexEngine.newFinder()); + + for (Map.Entry> indexEntry : categorizedMetaInfo.entrySet()) { + IndexOperator indexOperator = cache.get(indexEntry.getKey()); + indexOperator.update(indexEntry.getValue()); + } + + } + + @Override + public void onError(List list, Throwable throwable) { + + } +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataWriterConsumer.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataWriterConsumer.java deleted file mode 100644 index 45466af03..000000000 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/SpanDataWriterConsumer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.a.eye.skywalking.storage.data; - -import com.a.eye.datacarrier.consumer.IConsumer; -import com.a.eye.skywalking.storage.data.file.DataFileWriter; -import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; -import com.a.eye.skywalking.storage.data.index.IndexOperator; -import com.a.eye.skywalking.storage.data.index.IndexOperatorFactory; - -import java.util.List; - -public class SpanDataWriterConsumer implements IConsumer { - - private DataFileWriter writer; - - @Override - public void consume(List list) { - for (SpanData data : list) { - IndexOperator operator = IndexOperatorFactory.get(data.getTimestamp()); - IndexMetaInfo metaInfo = writer.write(data.convertToByte()); - operator.update(metaInfo); - } - } - - @Override - public void onError(List list, Throwable throwable) { - - } -} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/DataFileNotFoundException.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/DataFileNotFoundException.java deleted file mode 100644 index 02cd791c1..000000000 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/DataFileNotFoundException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.a.eye.skywalking.storage.data.exception; - -/** - * Created by xin on 2016/11/4. - */ -public class DataFileNotFoundException extends Exception { - public DataFileNotFoundException(String message, Exception e) { - super(message, e); - } -} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/FileReaderCreateFailedException.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/FileReaderCreateFailedException.java deleted file mode 100644 index 6511ac029..000000000 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/exception/FileReaderCreateFailedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.a.eye.skywalking.storage.data.exception; - -/** - * Created by xin on 2016/11/4. - */ -public class FileReaderCreateFailedException extends Throwable { - public FileReaderCreateFailedException(String message, Exception e) { - super(message, e); - } -} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFile.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFile.java index 6a58f99b9..fd642d613 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFile.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFile.java @@ -1,27 +1,10 @@ package com.a.eye.skywalking.storage.data.file; +/** + * 数据文件 + */ public class DataFile { - - private static final long MAX_LENGTH = 3 * 1024 * 1024 * 1024; - - private String name; - private long currentLength; - public boolean overLimitLength() { - return currentLength > MAX_LENGTH; - } - - - public long writeAndFlush(byte[] data) { - - return 0; - } - - public String getName() { - return name; - } - - public void close() { - + return false; } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileLoader.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileLoader.java new file mode 100644 index 000000000..9d5bbe50c --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileLoader.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.storage.data.file; + +import java.util.ArrayList; +import java.util.List; + +public class DataFileLoader { + + public DataFileLoader(String basePath) { + + } + + public List load() { + return new ArrayList(); + } + + +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileOperatorFactory.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileOperatorFactory.java index 5e5e2b6dc..126ca5061 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileOperatorFactory.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileOperatorFactory.java @@ -1,20 +1,10 @@ package com.a.eye.skywalking.storage.data.file; -import com.a.eye.skywalking.storage.data.exception.DataFileNotFoundException; -import com.a.eye.skywalking.storage.data.exception.FileReaderCreateFailedException; import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; + public class DataFileOperatorFactory { - - public static DataFileReader newReader(IndexMetaInfo indexMetaInfo) throws FileReaderCreateFailedException { - try { - return new DataFileReader(indexMetaInfo); - } catch (DataFileNotFoundException e) { - throw new FileReaderCreateFailedException("Cannot create DataFileReader.", e); - } - } - - public static DataFileWriter newWriter() { - return new DataFileWriter(); + public static DataFileReader getDataFileReader(IndexMetaInfo info) { + return new DataFileReader(info); } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileReader.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileReader.java index 53d0ebd43..67f611d9f 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileReader.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileReader.java @@ -1,45 +1,17 @@ package com.a.eye.skywalking.storage.data.file; -import com.a.eye.skywalking.storage.config.Config; -import com.a.eye.skywalking.storage.data.exception.DataFileNotFoundException; import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; +/** + * Created by xin on 2016/11/4. + */ public class DataFileReader { - private static Logger logger = LogManager.getLogger(DataFileReader.class); + public DataFileReader(IndexMetaInfo info) { - private long offset; - private int length; - private String fileName; - private FileInputStream reader; - - public DataFileReader(IndexMetaInfo indexMetaInfo) throws DataFileNotFoundException { - try { - reader = new FileInputStream(new File(Config.DataFile.BASE_PATH, indexMetaInfo.getFileName())); - this.offset = indexMetaInfo.getOffset(); - this.length = indexMetaInfo.getLength(); - this.fileName = indexMetaInfo.getFileName(); - } catch (FileNotFoundException e) { - throw new DataFileNotFoundException(indexMetaInfo.getFileName() + " not found.", e); - } } public byte[] read() { - try { - reader.getChannel().position(this.offset); - byte[] dataByte = new byte[length]; - reader.read(dataByte, 0, length); - return dataByte; - } catch (IOException e) { - logger.error("Failed to read file:{} position:{} length:{}", fileName, offset, length); - return null; - } + return new byte[0]; } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileWriter.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileWriter.java index f627390a6..7f79804dc 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileWriter.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFileWriter.java @@ -1,27 +1,24 @@ package com.a.eye.skywalking.storage.data.file; +import com.a.eye.skywalking.storage.data.SpanData; import com.a.eye.skywalking.storage.data.index.IndexMetaInfo; +import java.util.List; + public class DataFileWriter { private DataFile dataFile; public DataFileWriter() { - + dataFile = DataFilesManager.createNewDataFile(); } - public IndexMetaInfo write(byte[] data) { + public List write(List spanData) { + if (dataFile.overLimitLength()) { - convertDataFile(); + dataFile = DataFilesManager.createNewDataFile(); } - long offset = dataFile.writeAndFlush(data); - return new IndexMetaInfo(dataFile.getName(), offset, data.length); + return null; } - - private void convertDataFile() { - dataFile.close(); - dataFile = new DataFile(); - } - } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFilesManager.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFilesManager.java new file mode 100644 index 000000000..04adb9341 --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/DataFilesManager.java @@ -0,0 +1,29 @@ +package com.a.eye.skywalking.storage.data.file; + +import com.a.eye.skywalking.storage.config.Config; + +import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; + +/** + * 管理数据文件,目前主要是用来加载所有未满的数据文件,以及创建数据文件 + */ +public class DataFilesManager { + + private static ConcurrentLinkedDeque unFinishedDataFiles = new ConcurrentLinkedDeque<>(); + + public static void init() { + List allDataFile = new DataFileLoader(Config.DataFile.BASE_PATH).load(); + unFinishedDataFiles = new ConcurrentLinkedDeque<>(new UnFinishedDataFilePicker(allDataFile).pickUp()); + } + + public static DataFile createNewDataFile() { + DataFile dataFile = unFinishedDataFiles.poll(); + if (dataFile == null) { + dataFile = new DataFile(); + } + + return dataFile; + } + +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/UnFinishedDataFilePicker.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/UnFinishedDataFilePicker.java new file mode 100644 index 000000000..21f1a0157 --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/file/UnFinishedDataFilePicker.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.storage.data.file; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用于选择所有没有达到最大容量的数据文件 + */ +public class UnFinishedDataFilePicker { + + private List dataFiles; + + public UnFinishedDataFilePicker(List dataFiles) { + + } + + public List pickUp() { + return new ArrayList(); + } +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java index 27abeb362..b08f4528f 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexMetaInfo.java @@ -1,9 +1,7 @@ package com.a.eye.skywalking.storage.data.index; -/** - * Created by xin on 2016/11/3. - */ public class IndexMetaInfo { + private String traceId; private String fileName; @@ -11,12 +9,7 @@ public class IndexMetaInfo { private int length; - public IndexMetaInfo(String name, long offset, int length) { - this.fileName = name; - this.offset = offset; - this.length = length; - } - + private long startTime; public String getFileName() { return fileName; @@ -29,4 +22,8 @@ public class IndexMetaInfo { public int getLength() { return length; } + + public long getStartTime() { + return startTime; + } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperator.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperator.java index 252b95895..e6659906e 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperator.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperator.java @@ -1,17 +1,54 @@ package com.a.eye.skywalking.storage.data.index; +import java.sql.Connection; +import java.util.ArrayList; import java.util.List; -/** - * Created by xin on 2016/11/3. - */ +import static com.a.eye.skywalking.storage.config.Config.DataIndex.TABLE_NAME; + public class IndexOperator { - public List find(String traceId) { - return null; - } + private Connection connection; + private long timestamp; - public void update(IndexMetaInfo meta) { + private IndexOperator(long timestamp) { } + + public List find(String taceId) { + return new ArrayList(); + } + + + public void update(List metaInfo) { + + } + + private Connection getConnection() { + return connection; + } + + public static class Builder { + private IndexOperator operator; + private IndexOperatorHelper indexOperatorHelper; + + private Builder(long timestamp) { + operator = new IndexOperator(timestamp); + indexOperatorHelper = new IndexOperatorHelper(operator.getConnection()); + } + + public static Builder newBuilder(long timestamp) { + return new Builder(timestamp); + } + + public IndexOperator build() { + if (indexOperatorHelper.validateIsReady(TABLE_NAME)) { + indexOperatorHelper.maintain(); + } + + return operator; + } + + } + } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorCache.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorCache.java new file mode 100644 index 000000000..477015fc3 --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorCache.java @@ -0,0 +1,65 @@ +package com.a.eye.skywalking.storage.data.index; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class IndexOperatorCache { + + private static final int MAX_CACHE_SIZE = 5; + + private LRUCache cachedOperators; + + public IndexOperatorCache() { + cachedOperators = new LRUCache(MAX_CACHE_SIZE); + } + + public IndexOperator get(long timestamp) { + return cachedOperators.get(timestamp); + } + + public void updateCache(long timestamp, IndexOperator operator) { + cachedOperators.put(timestamp, operator); + } + + private static class LRUCache { + private final int MAX_CACHE_SIZE; + private final float DEFAULT_LOAD_FACTOR = 0.75f; + private LinkedHashMap map; + private ReadWriteLock cacheLock = new ReentrantReadWriteLock(); + + public LRUCache(int cacheSize) { + MAX_CACHE_SIZE = cacheSize; + int capacity = (int) Math.ceil(MAX_CACHE_SIZE / DEFAULT_LOAD_FACTOR) + 1; + map = new LinkedHashMap(capacity, DEFAULT_LOAD_FACTOR, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_CACHE_SIZE; + } + }; + } + + public void put(K key, V value) { + Lock lock = cacheLock.writeLock(); + try { + lock.lock(); + map.put(key, value); + } finally { + lock.unlock(); + } + } + + public V get(K key) { + Lock lock = cacheLock.readLock(); + try { + lock.lock(); + return map.get(key); + } finally { + lock.unlock(); + } + } + + } +} diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorFactory.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorFactory.java index 21b9da753..11d17b986 100644 --- a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorFactory.java +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorFactory.java @@ -1,8 +1,20 @@ package com.a.eye.skywalking.storage.data.index; +/** + * Created by xin on 2016/11/4. + */ public class IndexOperatorFactory { - public static IndexOperator get(long timestamp) { - return null; + private static IndexOperatorCache operatorCache; + + public static IndexOperator getIndexOperator(long timestamp) { + IndexOperator operator = operatorCache.get(timestamp); + + if (operator == null) { + operator = IndexOperator.Builder.newBuilder(timestamp).build(); + operatorCache.updateCache(timestamp, operator); + } + + return operator; } } diff --git a/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorHelper.java b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorHelper.java new file mode 100644 index 000000000..292b42a05 --- /dev/null +++ b/skywalking-storage-center/skywalking-storage/src/main/java/com/a/eye/skywalking/storage/data/index/IndexOperatorHelper.java @@ -0,0 +1,27 @@ +package com.a.eye.skywalking.storage.data.index; + +import java.sql.Connection; + +public class IndexOperatorHelper { + + public IndexOperatorHelper(Connection connection) { + + } + + public boolean validateIsReady(String tableName) { + return false; + } + + public void maintain() { + createTable(); + createIndex(); + } + + private void createIndex() { + + } + + private void createTable() { + + } +}