Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
5.0-alpha
-
None
-
None
Description
There is inconsistent behavior when multi-level partition model is modified to a full build model.
Added parameter check items for /api/models/semantic API. If PartitionDesc is null, then set MultiPartitionDesc to null。
Detailed Description:
行为1:在模型编辑页面从增量改成全量后,需要把分区设为无分区后,再点击构建才能正常构建。
行为2:直接在模型列表处,点击构建,然后选择全量构建,可以构建成功
二者不一致。
行为1:
- 创建多级分区模型,并构建segment成功
- 编辑多级分区模型--将增量构建修改为全量构建 --修改成功
- 在模型页面直接点击构建,选择全量构建
在模型保存页面将增量模型更改为全量模型,弹框提示“修改模型分区设置后,系统将删除所有 Segment 及数据,模型将无法服务于业务查询。同时正在执行的构建任务将被终止。是否要继续保存?”,点击保存后,可以观察到调用了/api/models/semantic接口,如图1所示,向接口传递的数据只把PartitionDesc置为了null,而多级子分区multi_partition_desc 并没有置为null,故而对该模型发起全量构建的过程中会判定为该模型为MultiPartitionJob
同时,通过追踪全量构建调用链路可以发现,在constructFullBuild方法中new的jobParam并没有传递setTargetPartitions
所以在后续的computeJobBucket方法中爆出了无法添加任务,子分区值为空。请检查后重试。异常,导致无法正常构建。
行为2:
- 创建多级分区模型,并构建segment成功
- 在模型页面直接点击构建,选择全量构建
在模型页面直接点击构建,选择全量构建后,弹框提示“修改模型分区设置后,系统将删除所有 Segment 及数据,模型将无法服务于业务查询。同时正在执行的构建任务将被终止。是否要继续保存?”点击保存后会调用api/models/{model_id}/partition 接口更新模型分区数据,接口内数据为:
{"project":"caixukun","partition_desc":null}
由于没有传递MultiPartitionDesc参数,所以request中的MultiPartitionDesc为null,所以updatePartitionColumn的时候也会把MultiPartitionDesc置为null。所以当执行到computeJobBucket的时候会因为不是MultiPartitionJob而直接return。所以可以成功发起构建
Fix Design:
前端改动:如果一个模型的PartitionDesc被置为了null,那么这个模型的multi_partition_desc必定为null。
故而,基于此逻辑,可以在/api/models/semantic接口中,对multi_partition_desc做检查,如果传递过来的PartitionDesc为null,那么也把multi_partition_desc置为null。
后端改动:在下面判断逻辑中新增对时间分区列的判断,只有时间分区列不为null且子分区不为空才能判定为多级分区模型。