摘要:
当前的pack淘汰策略为LOCK_ONE, 在多线程切换时导致pack地址丢失。
新设计LOCK_ALL策略以保证多线程聚合正常工作。
设计思想:
- 多线程聚合运算期间, 对持有的pack不做淘汰
- 业务中对pack的读取和释放保持原有逻辑
架构设计:
静态结构:
动态结构:
- 上层业务通过VirtualColumn的LockSourcePacks函数获取对应MIIterator的pack
- MIIterator迭代器是multi iterator的简写,multi指代有多个维度表, 在VirtualColumn获取pack时, VCPackGuardian获取所有的维度表, 读取所有维度表的列的pack
-
- 是否预先准备线程池去并行读取所有维度表的列, 需要再考虑。本次设计在此处不并行
- VCPackGuardian中新增LockAll的策略, 不淘汰任何已读的pack
- LockAll策略对于已读pack的缓存使用 std::unordered_map<int, std::unordered_map<int, bool>