...
- 一个InsertPlan先到达StorageEngine,此前其已经在MManager中取到相应的元数据,现在开始进行数据写入
- StorageEngine根据InsertPlan中的逻辑存储组名找到对应的VirtualStorageGroupManager(注意:我们每一种InsertPlan都仅写入一个存储组的数据)
- VitrualStorageGroupManager根据InsertPlan中的设备名进行hash,确定其虚拟存储组号,找到对应的StorageGroupProcessor(注意:我们每一种InsertPlan都仅写入一个设备的数据)
- StorageGroupProcessor根据时间分区切分InsertPlan,将其转发给响应分区的TsfileProcessor
- TsfileProcessor将数据写入内存缓冲区,当内存控制触发后,写入其对应的tsfile文件
3. Storage Group Processor中和时间有关的map的说明
(1)latestTimeForEachDevice
作用:记录每一个时间分区的每一个设备的最后写入时间,用以在刷盘时更新partitionLatestFlushedTimeForEachDevice
更新方式:每一次insert成功后,更新为相应设备的最大写入时间戳
键值关系:时间分区 → 设备名称 → 最后写入时间
(2)partitionLatestFlushedTimeForEachDevice
作用:记录每一个时间分区的每一个设备的最后刷盘时间,以此确定该设备的新数据点是顺序还是乱序数据
更新方式:在每一次Flush操作后,通过updateLatestFlushTimeCallback这个回调函数,更新为相应设备刷盘之后的最大写入时间戳
键值关系:时间分区 → 设备名称 → 最后刷盘时间
(3)globalLatestFlushedTimeForEachDevice
作用:记录每个设备全局(跨时间分区)的最后刷盘时间,用来在更新last cache的时候确定新写入的数据是否为last数据
更新方式:在每一次Flush操作后,通过updateLatestFlushTimeCallback这个回调函数,更新为相应设备刷盘之后的最大写入时间戳
键值关系:设备名称 → 最后刷盘时间
(4)newlyFlushedPartitionLatestFlushedTimeForEachDevice
作用:在文件升级时记录升级成功文件的每一个时间分区的刷盘时间,用于最终更新partitionLatestFlushedTimeForEachDevice,单独设定一个变量的原因是,升级与写入是异步操作,如果直接更改partitionLatestFlushedTimeForEachDevice的话有可能会有并发冲突,所以只更新这个临时变量,最终拿写锁再将这两个map合并
更新方式:在每一个文件升级成功后,通过upgradeTsFileResourceCallBack这个回调函数,更新为相应设备的最大时间戳
键值关系:时间分区 → 设备名称 → 最后升级时间