已开启
[Bug]: [数据分支] 父合子 merge 时 source-only destructive DDL(TRUNCATE)不再自动重放,rc=1 #123
wuchenlong创建于 7 天前
7 天前 添加了label:bug
7 天前 修改了issue 的描述
wangjingyuan8
6 天前 评论:
6 天前 评论:
问题A:(没问题)
CREATE TABLE p_tmp(a int); 此表没有主键,无法自动合入

若sql改为CREATE TABLE p_tmp(a int primary key);INSERT INTO p_tmp VALUES (1); DROP TABLE p_tmp;可以正常merge



wangjingyuan8
6 天前 评论:
6 天前 评论:
问题B:(有问题)
没有自动merge



5 天前 修改了issue 的描述
5 天前 修改了issue 的描述
测试类型
接口功能
测试版本
8.0.0-RC1(build latest1027,编译 2026-10-26;neon 扩展 1.1;og_storage 090d116d… / og_compute deea2275…)
问题描述
父合子 merge 对 source-only destructive DDL(TRUNCATE) 未自动重放,且失败仅返回笼统 HTTP 500。开发已在评论中拆分确认;T39 A/B 实测(2026-10-30)进一步确认老 build 亦复现、错误原文逐字一致 → 既有缺陷、两版均需修、非新 build 回归(详见「版本基线」)。
问题 B(缺陷,开发已确认):业务表
items(id int primary key)父侧执行TRUNCATE items;后,父→子branch merge --incremental-oggit:--strategy fail:rc=1,HTTP 500,causes含oggit object change public.items (TRUNCATE) cannot be replayed automatically;--strategy manual:status=blocked conflicts=1 applied=0,未自动 merge。两条路径均未自动重放;子侧 items 数据未变。开发评论:问题B(有问题)— 没有自动 merge(截图
env/repro/c123_dev_commentB.png)。设计依据:《ServerlessDB 支持父分支向子分支合并特性设计说明书》§3.2 总体方案(sources/parent2child_docker/ServerlessDB支持父分支向子分支合并特性设计说明书.mdL71)明确「source-only semantic/destructive DDL:父合子允许自动重放,仍需通过其他检查」→ 预期applied且子侧items行数=0。问题 A(已排除,非缺陷):原记录中
CREATE TABLE p_tmp(a int); INSERT INTO p_tmp VALUES (1); DROP TABLE p_tmp;的 p_tmp 无主键,无法自动合入属预期行为;开发确认改为CREATE TABLE p_tmp(a int primary key); INSERT INTO p_tmp VALUES (1); DROP TABLE p_tmp;后可以正常 merge(问题A(没问题)— 无主键无法自动合入)。该部分不作为缺陷跟踪,本 issue 仅跟踪问题 B(TRUNCATE)。影响:父分支对业务表执行 TRUNCATE 等 destructive DDL 后,子分支数据不会随之清空,父子数据漂移;且失败仅返回笼统 HTTP 500(或 blocked 无原因),运维/测试无法区分「安全策略拒绝 / 对象冲突 / replay 失败」。
建议修复方向:父合子方向 source-only destructive DDL 按设计 §3.2 自动重放(TRUNCATE 重放后子侧行数=0);错误信息返回可区分原因/错误码;补 destructive DDL 父合子回归(两版均需修)。
操作系统和硬件信息
openEuler 24.03 LTS-SP2 aarch64(Docker 容器化,arm 镜像)
测试环境
轻量版容器化(Docker neon_poc 数据分支实验环境:main 55432 / dev1 55435 / main2 55436;账号 branch_merge;两端 oggit active)。开发评论截图使用 main → branch1(同构环境)。
被测功能
数据分支父合子合并(branch merge --incremental-oggit,source=父分支 / target=子分支)对 source-only destructive DDL(TRUNCATE)的自动重放
预置条件
latest1027;openGauss 8.0.0-RC1(编译 2026-10-26),neon 扩展 1.1。--enable-oggit --oggit-database postgres启动,oggit worker 状态 active。items(id int primary key, name text, price int, v text)两端同构,有主键,子侧基线 11 行。操作步骤(问题 B:最小复现,3 条命令)
source /opt/neon-work/scripts/env.sh cd /opt/neon-work/branching # 1) 父侧 TRUNCATE(items 有主键,排除问题 A 的无主键因素);子侧基线 11 行 gsql -d postgres -U branch_merge -W 'Branch_merge@123' -h 127.0.0.1 -p 55432 -c "TRUNCATE items;" # 2) 父→子 merge(strategy fail)→ rc=1,错误原文见「实际输出」 neon_local branch merge --source-endpoint main --target-endpoint dev1 --database postgres --incremental-oggit --strategy fail; echo "rc=$?" # 3) 查子侧行数(未被 TRUNCATE 重放,仍 11 行) gsql -d postgres -U branch_merge -W 'Branch_merge@123' -h 127.0.0.1 -p 55435 -c "SELECT count(*) FROM items;"预期输出
实际输出
版本基线(A/B 实测 2026-10-30)
TRUNCATE items→ 父→子 merge--strategy failoggit object change public.items (TRUNCATE) cannot be replayed automatically复跑:
env/repro/issue123_script.sh(新 build 3/3 OK、老 build 1/1 OK);运行日志env/repro/run_logs/i123_new.log/i123_old.log;材料env/repro/issue123_minimal.md、env/repro/OLDVSNEW_ANALYSIS.md§7/§9。日志信息
env/repro/c123_dev_commentB.png(评论内嵌图;另见评论 URL)env/repro/issue123_minimal.md、env/repro/OLDVSNEW_ANALYSIS.md§7(#123 A/B)与 §9(A/B 总览)、env/repro/run_logs/i123_new.log、env/repro/run_logs/i123_old.logenv/runs/all/L-P2C-05.log(fail 路径 STEP 2/4 RC=1、HTTP 500、probe 11 行)sources/parent2child_docker/ServerlessDB支持父分支向子分支合并特性设计说明书.md§3.2(L71:父合子 source-only semantic/destructive DDL 允许自动重放)env/DIFF_OLDNEW.md+env/repro/OLDVSNEW_ANALYSIS.md(两版 neon 扩展实测均为 1.1;A/B 2026-10-30)提单组织
测试团队