All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.ltsopensource.kv.data.DataBlockFileHeader Maven / Gradle / Ivy

package com.github.ltsopensource.kv.data;

import com.github.ltsopensource.kv.AbstractFileHeader;

import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 文件头部
 * 1. magic             2 byte
 * 2. fileLength            4 byte      // 文件的长度
 * 3. totalNum              4 byte      // 总的记录数
 * 4. aliveNum              4 byte      // 存活的记录数
 * 5. isFull                4 byte      // 是否满了 1:满了 0 没满
 * 6. storeTxLogPosition    8 byte      // 刷盘到的最后一条事务日志ID
 * 

* * @author Robert HG ([email protected]) on 12/17/15. */ public class DataBlockFileHeader extends AbstractFileHeader { // 2 byte private final static short magic = (short) 0xBE01; // 8 byte (文件长度) private long fileLength; // 4 byte (这个Block总的记录个数) private AtomicInteger totalNum = new AtomicInteger(0); // 4 byte (这个Block存活的记录个数) private AtomicInteger aliveNum = new AtomicInteger(0); // 4 byte (0:没满 , 1:满了) private int isFull; // 8 byte (最后的一个txLog的记录ID) private long storeTxLogRecordId; @Override public int getLength() { return 2 + 8 + 4 + 4 + 4 + 8; } public long getFileLength() { return fileLength; } public void setFileLength(long fileLength) { this.fileLength = fileLength; } public AtomicInteger getTotalNum() { return totalNum; } public void setTotalNum(int totalNum) { this.totalNum.set(totalNum); } public AtomicInteger getAliveNum() { return aliveNum; } public void setAliveNum(int aliveNum) { this.aliveNum.set(aliveNum); } public boolean isFull() { return isFull == 1; } public void markFull() { this.isFull = 1; } public int getIsFull() { return isFull; } public void setIsFull(int isFull) { this.isFull = isFull; } public long getStoreTxLogRecordId() { return storeTxLogRecordId; } public void setStoreTxLogRecordId(long storeTxLogRecordId) { this.storeTxLogRecordId = storeTxLogRecordId; } @Override public void read(FileChannel fileChannel) throws IOException { fileChannel.position(0); fileChannel.read(byteBuffer()); byteBuffer().position(0); short readMagic = byteBuffer().getShort(); if (readMagic != magic) { throw new IOException("Invalid file type magic number 0x" + Integer.toHexString(readMagic & 0xFFFF)); } this.fileLength = byteBuffer().getLong(); this.totalNum.set(byteBuffer().getInt()); this.aliveNum.set(byteBuffer().getInt()); this.isFull = byteBuffer().getInt(); this.storeTxLogRecordId = byteBuffer().getLong(); } @Override public void write(FileChannel fileChannel) throws IOException { byteBuffer().position(0); byteBuffer().putShort(magic); byteBuffer().putLong(fileLength); byteBuffer().putInt(totalNum.get()); byteBuffer().putInt(aliveNum.get()); byteBuffer().putInt(isFull); byteBuffer().putLong(storeTxLogRecordId); byteBuffer().flip(); fileChannel.position(0); fileChannel.write(byteBuffer()); fileChannel.force(true); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy