已开启
[Bug]: [数据分支] 父合子 merge 时 source-only destructive DDL(TRUNCATE)不再自动重放,rc=1 #123
wuchenlong创建于  7 天前
wuchenlong
wuchenlong成员
7 天前 创建

测试类型

接口功能

测试版本

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支持父分支向子分支合并特性设计说明书.md L71)明确「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)的自动重放

预置条件

  1. 部署:Docker neon_poc(数据分支实验环境),build latest1027;openGauss 8.0.0-RC1(编译 2026-10-26),neon 扩展 1.1。
  2. endpoint:父 main = 55432,子 dev1 = 55435;两端以 --enable-oggit --oggit-database postgres 启动,oggit worker 状态 active。
  3. 账号:branch_merge(Branch_merge@123);业务表 items(id int primary key, name text, price int, v text) 两端同构,有主键,子侧基线 11 行。
  4. 客户端:source /opt/neon-work/scripts/env.sh 后使用 neon_local(docker_local)与 gsql。

操作步骤(问题 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;"

3 条命令 3/3 稳定(env/repro/issue123_script.sh:新 build 3/3 OK、老 build 1/1 OK)。同一场景改用 --strategy manual → status=blocked conflicts=1 applied=0(开发评论 B 现象);fail / manual 两条路径均未自动重放。

预期输出

# 2) 父合子 merge 成功,destructive DDL 被自动重放
status=applied  conflicts=0  applied>=1
rc=0

# 3) TRUNCATE 重放后子侧 items 行数 = 0
count=0

实际输出

# 新 build(8.0.0-RC1 / CP 34424d9d2 / build latest1027),2026-10-30
BASELINE: parent=11 child=11 history=0
TRUNCATE TABLE
$ neon_local branch merge --source-endpoint main --target-endpoint dev1 --database postgres --incremental-oggit --strategy fail
POST /v1/branch/merge failed: HTTP 500: {"causes":["branch merge failed","oggit object change public.items (TRUNCATE) cannot be replayed automatically"],"error":"branch merge failed"}
MERGE_RC=1
CHILD_ITEMS_AFTER=11 (before=11)      # 未重放
HISTORY_DELTA=0 (before=0 after=0)    # 失败不落 merge_history

# 同场景 --strategy manual(开发评论 B 截图 env/repro/c123_dev_commentB.png)
status=blocked  conflicts=1  applied=0

版本基线(A/B 实测 2026-10-30)

检查项 新 build(8.0.0-RC1 / CP 34424d9d2 / latest1027) 老 build(7.0.0 / CP 79c04b9 / 镜像 2026-10-14)
场景 父 TRUNCATE items → 父→子 merge --strategy fail 同
merge 结果 rc=1:oggit object change public.items (TRUNCATE) cannot be replayed automatically rc=1,错误原文逐字一致
子侧 items 11 行未变(before=11 → after=11) 0 行未变(before=0 → after=0;父侧补种 11 行)
merge_history 无本次新增(失败不落库) 无本次新增
定性 既有缺陷,两版均需修;非新 build 回归 同

复跑: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。

日志信息

  • 开发评论(2026-10-29,@wangjingyuan8):
  • 问题 B 截图:env/repro/c123_dev_commentB.png(评论内嵌图;另见评论 URL)
  • 最小复现与 A/B: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.log
  • 自动化用例日志:env/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)

临时仓库提单,待与产品/开发确认后转正式仓。

提单组织

测试团队

likedislike
wuchenlongwuchenlong成员
7 天前 添加了label:bug
wuchenlongwuchenlong成员
7 天前 修改了issue 的描述
wangjingyuan8
wangjingyuan8
6 天前 评论:

问题A:(没问题)
CREATE TABLE p_tmp(a int); 此表没有主键,无法自动合入
017e1bfc-78bc-4bb0-ac83-8767d245f300.png
若sql改为CREATE TABLE p_tmp(a int primary key);INSERT INTO p_tmp VALUES (1); DROP TABLE p_tmp;可以正常merge
image.png

likedislike
wangjingyuan8
wangjingyuan8
6 天前 评论:

问题B:(有问题)

没有自动merge
f8dc7653-cb09-4e53-bc53-13764b201e0c.png

likedislike
wuchenlongwuchenlong成员
5 天前 修改了issue 的描述
wuchenlongwuchenlong成员
5 天前 修改了issue 的描述