内存缓冲区 memtable 达到一定阈值后,会交给 FlushManager 进行异步的持久化,不阻塞正常写入。持久化的过程采用流水线的方式。
org.apache.iotdb.db.engine.flush.FlushManager
Memtable 的 Flush 任务管理器。
org.apache.iotdb.db.engine.flush.MemtableFlushTask
负责持久化一个 Memtable。
FlushManager 可以接受 memtable 的持久化任务,提交者有两个,第一个是 TsFileProcessor,第二个是持久化子线程 FlushThread。
每个 TsFileProcessor 同一时刻只会有一个 flush 任务执行,一个 TsFileProcessor 可能对应多个需要持久化的 memtable
背景:每个 memtable 可包含多个 device,每个 device 可包含多个 measurement。
一个 memtable 的持久化的过程有三个线程,只有当所有任务都完成后,主线程工作才结束。
MemTableFlushTask 所在线程
持久化主线程兼排序线程,负责给每个 measurement 对应的 chunk 排序。
encodingTask 线程
编码线程,负责给每个 Chunk 进行编码,编码成字节数组。
ioTask 线程
IO线程,负责将编码好的 Chunk 持久化到磁盘的 TsFile 文件上。
三个线程之间通过两个任务队列交互
encodingTaskQueue: 排序线程->编码线程,包括三种任务
StartFlushGroupIOTask:开始持久化一个 device (ChunkGroup), encoding 不处理这个命令,直接发给 IO 线程。
Pair<TVList, MeasurementSchema>:编码一个 Chunk
EndChunkGroupIoTask:结束一个 device (ChunkGroup) 的持久化,encoding 不处理这个命令,直接发给 IO 线程。
ioTaskQueue: 编码线程->IO线程,包括三种任务
StartFlushGroupIOTask:开始持久化一个 device (ChunkGroup)。
IChunkWriter:持久化一个 Chunk 到磁盘上
EndChunkGroupIoTask:结束一个 device (ChunkGroup) 的持久化。