Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[BugFix][Cherry-pick][Branch-3.0] Recalculate max_continuous_version …
…after schema change finished (#28473) (#28522) We will create a new tablet for each original tablet and we will write original tablet and new tablet during schema change. We will construct a `version_graph` to keep versions info for each table and the following code is how to update `version_graph`: ``` void VersionGraph::add_version_to_graph(const Version& version) { _add_version_to_graph(version); if (version.first == _max_continuous_version + 1) { _max_continuous_version = _get_max_continuous_version_from(_max_continuous_version + 1); } else if (version.first == 0) { // We need to reconstruct max_continuous_version from zero if input version is starting from zero // e.g. // 1. Tablet A is doing schema change // 2. We create a new tablet B releated A, and we will create a initial rowset and _max_continuous_version // will be updated to 1 // 3. Tablet A has a rowset R with version (0, m) // 4. Schema change will try convert R // 5. The start version of R (0) is not equal to `_max_continuous_version + 1`, and the _max_continuous_version // will not update _max_continuous_version = _get_max_continuous_version_from(0); } } ``` There exists a scenario where _max_continuous_version cannot be updated correctly e.g. 1. create a new tablet `t2` for origin tablet `t1` during schema change and `t2` has version 91,92,93,95,96,97,98. version 94 write failed. 2. when running schema change job, alter version is 98 and `t1` has version [0-90], [91-96], 97, 98 3. `max_continuous_version` of `t2` is 0 before convert rowset. After convert version [0-90], `max_continuous_version` is update to 93 because `t2` has version 91-93 before. 4. `max_continuous_version` don't update because the left rowsets version is not satisfy update condition(version.fisrt == 0 or version.first == _max_continuous_verison + 1). So the `max_continuous_version` will keep 93 after convert rowset finished. 5. we will check the max_continuous_version of `t2` at last and it should not less than alter version. But max_continuous_version(93) is less than alter version(98), so the alter job failed at last. The main reason is we don't update `_max_continuous_version` correctly during alter job, we should recalculate the `max_continuous_version` after rowset conversion. --------- Signed-off-by: zhangqiang <[email protected]>
- Loading branch information