数据校验和的 TAP 测试暴露崩溃恢复竞态
Tomas Vondra 给刚进主干的在线切换数据校验和写了一套 TAP 测试,用大约 80 个注入点检查状态变更与 checkpointer 之间的竞态。状态分散在四处,各由不同的锁保护。测试发现崩溃恢复后的最终状态会在 on 和 off 之间摇摆,取决于启动器写 XLOG2_CHECKSUMS 记录与 checkpointer 读共享内存做 REDO 的先后。他质疑 DELAY_CHKPT_START 是否真能挡住这类竞态。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
当天收录 16 条。
Tomas Vondra 给刚进主干的在线切换数据校验和写了一套 TAP 测试,用大约 80 个注入点检查状态变更与 checkpointer 之间的竞态。状态分散在四处,各由不同的锁保护。测试发现崩溃恢复后的最终状态会在 on 和 off 之间摇摆,取决于启动器写 XLOG2_CHECKSUMS 记录与 checkpointer 读共享内存做 REDO 的先后。他质疑 DELAY_CHKPT_START 是否真能挡住这类竞态。
REPACK 的并发执行仍有正确性问题。Mihail Nikalayeu 报告说即使打上针对 SNAPBUILD_CONSISTENT 的最新修复,压力测试照样失败:唯一索引创建时报重复键,pgbench 侧出现除零错误。008 号并发测试被那个修复治好了,007 号仍稳定复现;把 need_shared_catalogs 置为 true 能绕过,说明当前方案有根本缺陷。Antonin Houska 承认要查旧问题。
Grigory Smolkin 提交第 5 版补丁,处理流复制与 WAL 归档之间的交互,问题出在管着数千个集群的生产环境里。v5 的主要改动是只传时间线 ID 和段号而不是完整 WAL 文件名,把一部分工作挪到归档进程,并为 walreceiver 与归档进程加共享内存协调。四个设计问题待定:备库要不要更新 pg_stat_archiver、两类 ready 文件怎么处理、切换点计算能否简化、强制归档是否全收进归档进程。
逻辑复制的冲突日志历史表卡在权限上:非超级用户的订阅所有者访问不了 pg_conflict 模式里的冲突日志表,原因是查询分析阶段过早做了 ACL 检查。Dilip Kumar 试过绕开模式检查和干脆取消限制,都不合适;Shveta Malik 提议单给订阅所有者授 USAGE,但订阅所有者本身没有授权的权限。最后 Amit Kapila 提议把该模式的使用权授给 pg_create_subscription 角色,表级操作仍限本人。
Christophe Pettus 回顾故障转移复制槽的两年。PostgreSQL 17 引入三件套:订阅的 failover 选项、备库的 sync_replication_slots、主库的 synchronized_standby_slots;18 只修缺陷;19 增加动态 wal_level 与 slotsync_skip_reason 列。它保证提升后新主库的槽位不会跑到订阅者前面。但槽位复制是异步的,提升前必须手动核对位置。
Richard Yen 讲清了拿 Postgres 做任务队列会撞上什么。高并发下大量工作进程用 SELECT FOR UPDATE SKIP LOCKED,多个事务会短暂引用同一行,产生的 MultiXact ID 堆进固定大小的 SLRU 缓冲区,后端排队在 LWLock:MultiXactSLRU 上,吞吐随之塌陷。任务行反复更新删除,死元组产生得比 autovacuum 回收快,几兆有效数据的队列表能涨到几十 GB。
Christophe Pettus 拆解了 PgQue 的做法:消费时完全不改事件表。事件写进轮转的表,事务 ID 作列默认值;一个 ticker 每秒抓一次 pg_snapshot,相邻两个快照之间就是一个批次,消费端据此判断可见性;三张表靠 TRUNCATE 轮转,不做垃圾回收。算法出自 Marko Kreen 2007 年前后的设计。代价是事件要等下一个 tick 才可见,端到端一到两秒。
Vibhor Kumar 借 pgBackRest 被原作者 David Steele 归档一事,把开源许可证和运营可持续性分开来谈。项目做了十三年,用的是 MIT 许可证,法律和结构上完全开放,谁都可以分支,但归档意味着它已无人维护。他的看法是一个项目可以在法律上开放、在运营上脆弱。给企业的建议是别只查许可证合规,还要问治理:有没有共享的维护权、透明的决策和可持续的资金。
Tom Lane 指出 load_hosts() 的返回类型声明不一致,并嫌函数名太泛,Daniel Gustafsson 认可修法。
Peter Eisentraut 要求改局部变量名并补锁,担心并发 DROP LABEL,同时反对顺手加 OidIsValid。
Nathan Bossart 要删已被移除的实现引用,Tom Lane 同意清死代码但主张保留 HAS_TEST_AND_SET。
Daniil Davydov 同意先作为 0003 提交,评审定案后再并回 0001 和 0002,以免 cfbot 报错。