package com.alibaba.doris.dataserver.store.log.db.impl;
import java.io.File;
import java.nio.ByteBuffer;
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.LogClumpHead;
import com.alibaba.doris.dataserver.store.log.db.ReadWindow;
import com.alibaba.doris.dataserver.store.log.db.WriteWindow;
import com.alibaba.doris.dataserver.store.log.entry.ClumpHeadEntry;
import com.alibaba.doris.dataserver.store.log.utils.LogFileUtil;
/**
* @author ajun Email:jack.yuj@alibaba-inc.com
*/
public class DefaultLogClumpImpl implements LogClump {
public DefaultLogClumpImpl(ClumpConfigure config, String clumpName) {
this.config = config;
this.clumpName = clumpName;
this.no = LogFileUtil.getClumpNoFromClumpName(clumpName);
}
public int getNo() {
return this.no;
}
public ClumpHeadEntry getClumpHeadEntry() {
synchronized (lock) {
if (null != writeWindow) {
return writeWindow.getClumpHeadEntry();
}
if (head == null) {
LogClumpHead clumpHeader = new DefaultLogClumpHeadImpl(config, getName());
clumpHeader.loadLogHeader();
head = clumpHeader.getClumpHeadEntry();
}
return head;
}
}
public long size() {
synchronized (lock) {
if (null != writeWindow && writeWindow.isOpen()) {
return writeWindow.size();
}
if (null == file) {
file = new File(LogFileUtil.generateDataFileName(config.getPath(), clumpName));
}
return file.length();
}
}
public String getName() {
return clumpName;
}
/**
* ReadWindow 每次获取都生成一个新的ReadWindow实例
*/
public ReadWindow getReadWindow() {
return new DefaultReadWindowImpl(config, clumpName);
}
/**
* 一个LogClump只能存在一个writewdindow
*/
public WriteWindow getWriteWindow() {
return this.getWriteWindow(null);
}
/**
* 一个LogClump只能存在一个writewdindow
*/
public WriteWindow getWriteWindow(ByteBuffer buffer) {
synchronized (lock) {
if (null != writeWindow && writeWindow.isOpen()) {
return writeWindow;
}
writeWindow = new DefaultWriteWindowImpl(config, clumpName, buffer);
return writeWindow;
}
}
private ClumpConfigure config;
private String clumpName;
private WriteWindow writeWindow;
private ClumpHeadEntry head;
private Object lock = new Object();
private int no;
private File file;
}