LogSegment
class
LogSegment(
val
log
: FileMessageSet,
val
index
: OffsetIndex,
val baseOffset : Long, //这个Segment存储的消息的partition起始的消息偏移量
val indexIntervalBytes : Int,
val rollJitterMs : Long,
val baseOffset : Long, //这个Segment存储的消息的partition起始的消息偏移量
val indexIntervalBytes : Int,
val rollJitterMs : Long,
time: Time)
//LogSegment.rollJitterMs字段说明
//如果这个segment即将写满,就开始创建新的segment进行回滚,并返回需要写入的segment
//segment.size这个LogSegment已经写入的消息占用的字节大小
//1.目前的segment空闲字节不足,segment.size > config.segmentSize - messagesSize
//2.按照时间间隔进行回滚
//3.segment索引文件满,segment.index.isFull
//config.segmentMs是段对象存活的时间@param segmentMs
//为避免config.segmentMs后segment同时进行回滚,用@param segmentJitterMs 来错开进行回滚
//roll,进行回滚操作
//1.取出segments.lastEntry的segment,把索引文件缩小到当前存储的索引个数的长度
//2.创建LogSegment
//3.添加到成员变量this.segments
//key为这个Segment存储的消息的partition起始的消息偏移量
//value为LogSegment
//4.flush
//1).把this.recoveryPoint到newOffset的partition的绝对偏移量的segment列表,来逐个flush
//segment.flush就是把index和log文件进行flush
//2).用参数newOffset来设置this.recoveryPoint
//如果这个segment即将写满,就开始创建新的segment进行回滚,并返回需要写入的segment
//segment.size这个LogSegment已经写入的消息占用的字节大小
//1.目前的segment空闲字节不足,segment.size > config.segmentSize - messagesSize
//2.按照时间间隔进行回滚
//3.segment索引文件满,segment.index.isFull
//config.segmentMs是段对象存活的时间@param segmentMs
//为避免config.segmentMs后segment同时进行回滚,用@param segmentJitterMs 来错开进行回滚
//roll,进行回滚操作
//1.取出segments.lastEntry的segment,把索引文件缩小到当前存储的索引个数的长度
//2.创建LogSegment
//3.添加到成员变量this.segments
//key为这个Segment存储的消息的partition起始的消息偏移量
//value为LogSegment
//4.flush
//1).把this.recoveryPoint到newOffset的partition的绝对偏移量的segment列表,来逐个flush
//segment.flush就是把index和log文件进行flush
//2).用参数newOffset来设置this.recoveryPoint
//3).this.lastflushedTime设置当前时间time.milliseconds
//LogSegment.created创建这个LogSegment记录的时间戳
var created = time.milliseconds
//this.bytesSinceLastIndexEntry记录写入的字节数,如果字节数超过成员indexIntervalBytes,就开始写入到索引中
private var bytesSinceLastIndexEntry = 0
//
把消息集合写入到log中
,如果bytesSinceLastIndexEntry字节超过indexIntervalBytes,
//就先把下一条的绝对offset和在这个seg的物理字节偏移写入索引中
def append(offset: Long, messages: ByteBufferMessageSet)
//从startingFilePosition查找绝对offset的OffsetPosition信息
//先从索引中找一定的范围,之后再从log中具体的字节位置
//@参数offset 是在partition的绝对消息偏移量
//offset是在partition中的消息绝对位移
//position是partition中片段segment的物理的字节偏移量
//先从索引中找一定的范围,之后再从log中具体的字节位置
//@参数offset 是在partition的绝对消息偏移量
//offset是在partition中的消息绝对位移
//position是partition中片段segment的物理的字节偏移量
//case class OffsetPosition(val offset: Long, val position: Int)
private[log] def translateOffset(offset: Long, startingFilePosition: Int = 0): OffsetPosition
//从startOffset开始读,两个maxOffset和maxSize参数为从段中读取数据的上限