好吧,在理解完compaction流程之后,发现问题还是没有解决,那么就一起来看下 一个 alter task提交到doris之后经历了什么吧! (rollup也是alter table)
背景知识:由AgentServer提供统一的接口,内部通过task pool方式来调度各种任务。
入口:olap/task/engine_alter_tablet_task.cpp :: execute() → process_alter_tablet_v2()
1、先来看下request的关键参数
- base_tablet_id
- base_schema_hash
- new_tablet_id
-
new_schema_hash
- alter_version
-
alter_version_hash 因为需要转换历史数据,所以需要base_tablet -> new_tablet,在此期间需要锁住base_talet meta信息,一直到历史数据转换完成。alter version是含义为:base tablet下小于等于rowset version的代表需要转换的历史数据。因为对于当日实时写入的分区 在新的alter tablet下会同步写入。
2、do_process_alter_tablet_v2()
首先检查base tablet 和 new tablet 是否都存在,如果不存在说明execute之前没处理好。
然后检查 new tablet的 state,这里的状态如果不是not ready 说明new tablet 已经转换完成。此时需要通过rowset version去check是否正确。检查new tablet下rowset meta信息,找到从0开始的最长连续version,如果max version小于 alter version的话,说明数据转换有问题。
接着检查base tablet 的version是否改变,这里通过max version是否连通去判断version是否已经改变。 这里没看明白,因为不知道 _version_graph的逻辑
检查base tablet 的max version要大于alter version,理由和上面检查new tablet时一样
删除new tablet 中小于 base_talbet → max version的rowset。防止数据重复。
对于物化视图的schema change,遍历物化视图的创建参数,转换其中的表达式 eg:bitmap or count(1)
3、开始执行历史数据转化。
首先根据schema change条件判断待转化的任务类型:需要重新排序 or 直接转化 (比如新加一个字段,这种就不需要重新排序 1 v 1直接load rowset即可)(这里的详细规则我没看)
遍历base tablet下的需要转化的rowset(在上一个步骤生成) 生成rowsetWrite(用来写入rowset的),将原rowset属性copy过来。
处理生成新的rowset (具体逻辑没看)
处理完成后将new tablet状态置为 running
至此流程结束,tablet 的状态设置为running之后 compaction的动作就可以开始了! 好吧问题还是没有解决,talbet的调度顺序是怎样的呢?还要听下回分解。