package com.alibaba.doris.dataserver.store.log.db.impl; import java.io.IOException; import java.nio.ByteBuffer; import com.alibaba.doris.dataserver.store.log.LogStorageException; import com.alibaba.doris.dataserver.store.log.db.ClumpConfigure; import com.alibaba.doris.dataserver.store.log.db.LogClumpHead; import com.alibaba.doris.dataserver.store.log.db.LogFile; import com.alibaba.doris.dataserver.store.log.db.LogFile.AccessMode; import com.alibaba.doris.dataserver.store.log.entry.ClumpHeadEntry; import com.alibaba.doris.dataserver.store.log.serialize.LogSerializer; import com.alibaba.doris.dataserver.store.log.serialize.impl.DefaultLogSerializer; import com.alibaba.doris.dataserver.store.log.utils.LogFileUtil; /** * Not thread safety * * @author ajun Email:jack.yuj@alibaba-inc.com */ public class DefaultLogClumpHeadImpl implements LogClumpHead { public DefaultLogClumpHeadImpl(ClumpConfigure config, String clumpName) { this.clumpName = clumpName; this.config = config; } public void open() { logHeader = new LogFile(LogFileUtil.generateHeadFileName(config.getPath(), clumpName)); try { logHeader.open(AccessMode.RW); read(logHeader); } catch (IOException e) { throw new LogStorageException(e); } } public void loadLogHeader() { LogFile headerFile = new LogFile(LogFileUtil.generateHeadFileName(config.getPath(), clumpName)); try { headerFile.open(AccessMode.R); read(headerFile); } catch (IOException e) { throw new LogStorageException(e); } finally { headerFile.close(); } } private void read(LogFile headerFile) throws IOException { headBuffer = ByteBuffer.allocate(DEFAULT_LOG_READER_BUFFER_SIZE); headerFile.read(headBuffer); headBuffer.flip(); head = serializer.readHead(headBuffer); } public void close() { flush(); logHeader.close(); } public void flush() { if (head.isChanged()) { try { headBuffer.clear(); serializer.writeHead(headBuffer, head); headBuffer.flip(); logHeader.seek(0); logHeader.write(headBuffer); head.setChanged(false); } catch (Exception e) { throw new LogStorageException(e); } } } public ClumpHeadEntry getClumpHeadEntry() { return head; } private ClumpConfigure config; private String clumpName; private ClumpHeadEntry head; private ByteBuffer headBuffer; private LogFile logHeader; private static LogSerializer serializer = new DefaultLogSerializer(); private static final int DEFAULT_LOG_READER_BUFFER_SIZE = 1024 * 1024; }