已关闭
[Bug]: ustore长稳运行1x24h 出现备机core dump 主备复制中断 #8449
wuchenlong创建于  22 天前关闭于  9 天前
wuchenlong
wuchenlong成员
22 天前 创建

测试类型

SQL功能
并发
压力长稳

测试版本

7.0.0LTS

操作系统和硬件信息

openEuler 22.03 / 24.03 aarch64(长稳 env2 139/141/143;最小复现 cmp 224/226/228)

测试环境

企业版主备

操作步骤

根因(开发分析,已复验)

备库回放 standby lock WAL 时,若备库存在持有同一关系 AccessShareLock 的长事务,会进入 ResolveRecoveryConflictWithLock() / StandbyAcquireAccessExclusiveLock()。受影响代码中原子 CAS 第二个参数误传字面量 0(应为 uint64 *),触发 NULL 地址访问 → SIGSEGV。

pg_atomic_compare_exchange_u64(&t_thrd.proc->waitStart, 0, waitStart);

最小复现(已复现成功)

环境:openGauss 7.0.0 build 93bfec54,Primary=224,Standby=226,socket=/home/wcl0716/cluster/tmp,端口 15700

1. 备机持 pg_class(OID 1259) AccessShareLock 长事务

# 在备机 226
export GAUSSHOME=/home/wcl0716/cluster/app
export LD_LIBRARY_PATH=$GAUSSHOME/lib:$LD_LIBRARY_PATH
export PATH=$GAUSSHOME/bin:$PATH
export PGPASSWORD='OpenGauss@123'

nohup gsql -X -q \
  -h /home/wcl0716/cluster/tmp -p 15700 -d postgres \
  -c "BEGIN;
      SET statement_timeout = 0;
      SELECT count(*) FROM pg_catalog.pg_class;
      SELECT pg_sleep(3600);" \
  >/tmp/repro_lock226.out 2>&1 </dev/null &

gsql -X -Atqc \
  "select pid,mode,granted from pg_locks where relation=1259" \
  -h /home/wcl0716/cluster/tmp -p 15700 -d postgres

应看到:<pid>|AccessShareLock|t

2. 主机生成 AccessExclusive standby-lock WAL

# 在主机 224
gsql -X -v ON_ERROR_STOP=1 \
  -h /home/wcl0716/cluster/tmp -p 15700 -d postgres \
  -c "SET xc_maintenance_mode = on;
      BEGIN;
      LOCK TABLE pg_catalog.pg_class IN ACCESS EXCLUSIVE MODE;
      COMMIT;"

xc_maintenance_mode 仅用于允许对系统目录加锁,不是 core 原因。

3. 检查备机

ps -ef | grep '[g]aussdb' | grep wcl0716
ls -lh /home/wcl0716/core/core-startup-*

长稳原始场景(首次发现)

  1. env2 三节点 ustore TPCC:主写 + 双备只读(enable_remote_execute=off
  2. 跑约一天后备库 143 SIGSEGV,bbox core:/usr2/og_cw/corefile/core-gaussdb-3463674-2026_08_28_08_41_09-bbox.lz4
  3. 关备读后同类长稳崩溃不再出现

预期输出

- 备库处理锁冲突后取消冲突查询并继续回放
- 不落 core,cluster_state 保持 Normal

实际输出

【cmp 最小复现 2026-08-28 14:23 +08】
- Primary LOCK 成功;Standby 226 立即 SIGSEGV,进程消失
- gs_om: 226 S Down Manually stopped;集群 Degraded
- core: /home/wcl0716/core/core-startup-1395163-1787898195 (7.3G)
  sha256: 25bbc67138ebbd2a7882b721dab8b9beb62f88387458840593eea6fea13586d0
- gdb 崩溃线程栈(与开发预期一致):
  #0 StandbyAcquireAccessExclusiveLock(...)
  #1 standby_redo(XLogReaderState*)
  #2 ApplyRedoRecord(XLogReaderState*)
  #3 parallel_recovery::ApplyReadyTxnLogRecords(...)
  #4 parallel_recovery::ProcessPendingRecords(bool)
  #5 parallel_recovery::DispatchRedoRecordToFile(...)
  #6 StartupXLOG()
  #7 StartupProcessMain()
- 另有线程仍停在 pg_sleep(AccessShareLock 持有者)

【长稳 env2 原始现场】
- 143 SIGSEGV,bbox core 约 1.9G
- 部分栈曾见 UBTreeCheckKeys(查询线程);本次最小复现定位到回放路径 StandbyAcquireAccessExclusiveLock

日志信息

  1. cmp 复现 core(保留勿删)20.20.20.226:/home/wcl0716/core/core-startup-1395163-1787898195
  2. env2 长稳 core:本地归档 issues/opengauss_openGauss-server_8449/corefile/core-gaussdb-3463674-2026_08_28_08_41_09-bbox.lz4;原机 /usr2/og_cw/corefile/
  3. 本地材料:issues/opengauss_openGauss-server_8449/cmp_repro/(gdb_bt.txt / result.txt / repro_cmp.sh)
  4. 使用系统目录 pg_class(OID 1259) 以便 ENABLE_MULTIPLE_NODES 构建也会走 StandbyAcquireAccessExclusiveLock

提交组织

测试团队

likedislike
wuchenlongwuchenlong成员
22 天前 添加了label:bug
opengauss_bot
opengauss_bot成员
22 天前 评论:

This issue requires an assignee. Since you haven't specified one, we've assigned TestManager as the default assignee for this issue.

likedislike
opengauss_botopengauss_bot成员
22 天前 将 TestManager 设为负责人
opengauss_bot
opengauss_bot成员
22 天前 评论:

Welcome To openGauss Community

Hey @wuchenlong , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands. You can self-configure the PR merge rules for this repository. For more details, please refer to Here.

Contact Guide

If you have any questions, please contact the SIG: StorageEngine, AI, CM, CloudNative, SecurityTechnology, SQLEngine ,
and any of the maintainers: @CarrotGo, @chendong76, @chenxiaobin19, @congzhou2603, @dodders, @hwworkholic, @jemappellehc, @libiao2024, @muyulinzhong, @quemingjian, @shenzheng4, @shirley_zhengx, @superlchf, @totaj, @wlff234, @wofanzheng, @ywzq1161327784 ,
and any of the committers: @Igali, @bihua111, @cailei19, @h_ray, @levy53071, @libiao2024, @lihaixiao, @mrzack, @wangfeihuo, @wuyuechuan, @xiong_xjun, @zhangfengzhi123, @zhangxubo, @zhangzq131, @zjh_hw .

likedislike
opengauss_botopengauss_bot成员
22 天前 添加了label:sig/StorageEngine
此处折叠了14条事件消息 查看更多
xudabiao2024xudabiao2024成员
17 天前 issue状态由 待办的 改变为 待回归
xudabiao2024
xudabiao2024成员
17 天前 评论:

验证版本:700B21
验证结果:通过
image.png
image.png

likedislike
wuchenlong
wuchenlong成员
10 天前 评论:

回归版本:openGauss 7.0.0 build bc72a519(B022);修复前对照 build 93bfec54
回归环境:224/226/228 三节点主备(ARM),profile=cmp(wcl0716:15700),cluster_state=Normal
结论:通过(备库不再 SIGSEGV,集群保持 Normal)

说明:按 issue 最小复现流程在修复前与修复后各执行一次。

  • 修复前 93bfec54:备库 226 持 pg_class(1259) AccessShareLock 长事务 + 主库 224 生成 AccessExclusive standby-lock WAL → 备库 SIGSEGV,进程消失,落 core,集群 Degraded。
  • 修复后 B022 (bc72a519):同样步骤备库不再崩溃,进程存活、15700 正常、无新 core,集群保持 Normal。

修复前 93bfec54(对照复现)

-- 步骤1 备机 226 持 AccessShareLock
BEGIN;
SET statement_timeout = 0;
SELECT count(*) FROM pg_catalog.pg_class;
SELECT pg_sleep(3600);
-- 步骤1 持锁确认
select pid,mode,granted from pg_locks where relation=1259;
→ 281466992709504|AccessShareLock|t

-- 步骤2 主机 224 生成 AccessExclusive WAL
SET xc_maintenance_mode = on;
BEGIN;
LOCK TABLE pg_catalog.pg_class IN ACCESS EXCLUSIVE MODE;
COMMIT;
→ SET / COMMIT 成功

-- 步骤3 备机 226
- 备机 gaussdb 进程消失,15700 无监听
- gsql: failed to connect Unknown:15700
- core: /home/wcl0716/core/core-startup-2166229-1788948709 (6.8G)
- gs_om: 226 S Down Manually stopped;集群 Degraded

-- gdb 崩溃栈(与 issue 完全一致)
Program terminated with signal SIGSEGV, Segmentation fault.
#0  StandbyAcquireAccessExclusiveLock(unsigned long, unsigned int, unsigned int, unsigned int)
#1  standby_redo(XLogReaderState*)
#2  ApplyRedoRecord(XLogReaderState*)
#3  parallel_recovery::ApplyReadyTxnLogRecords(...)
#4  parallel_recovery::ProcessPendingRecords(bool)
#5  parallel_recovery::DispatchRedoRecordToFile(...)
#6  StartupXLOG()
#7  StartupProcessMain()

修复后 B022 / bc72a519(回归)

-- 步骤1 备机 226 持 AccessShareLock
BEGIN;
SET statement_timeout = 0;
SELECT count(*) FROM pg_catalog.pg_class;
SELECT pg_sleep(3600);
-- 步骤1 持锁确认
select pid,mode,granted from pg_locks where relation=1259;
→ 281467005292416|AccessShareLock|t

-- 步骤2 主机 224 生成 AccessExclusive WAL
SET xc_maintenance_mode = on;
BEGIN;
LOCK TABLE pg_catalog.pg_class IN ACCESS EXCLUSIVE MODE;
COMMIT;
→ SET / COMMIT 成功

-- 步骤3 备机 226(修复后)
- 备机 gaussdb 进程存活(-M standby,监听 15700)
- 无新 core(core-startup-* 仅修复前残留,本次未新增)
- 期间短暂 failed to connect(备库处理锁冲突/取消冲突查询),随后自动恢复
- gs_om: 224 P Primary Normal / 226 S Standby Normal / 228 S Standby Normal,cluster_state=Normal

说明:

  1. 本次把 226 core_pattern 临时改为 wcl0716 可写的 /home/wcl0716/core(原为 wcl0716 无权限的 /home/wcl0623/core),故修复前崩溃成功落得 core-startup-2166229-1788948709,与 issue 原始 core 命名一致。
  2. 与长稳 env2(139/141/143,ustore TPCC 主写 + 双备只读)持续运行 1x24h 备库不再 core dump、主备复制不再中断的结论一致。
likedislike
sungang14sungang14成员
9 天前 issue状态由 待回归 改变为 已验收
sungang14sungang14成员
9 天前 关闭了 issue