PG Build 2021 将于2021年11月30日和12月1日 09:00-17:00 GMT 在线举行。 详情。
PostgresDAC 3.11,一个 PostgreSQL 直接访问组件套件,已发布。 http://microolap.com/products/connectivity/postgresdac/download/
JDBC 42.3.1 已发布。
ODB C++ ORM 版本 2.5.0-b.21 已发布。
DynamoDB FDW 1.0.0 已发布。
Babelfish,一个 PostgreSQL 的 MS SQL Server 兼容层, 已发布。
https://archives.postgresql.org/pgsql-jobs/2021-11/
Planet PostgreSQL: https://planet.postgresql.org/
本周 PostgreSQL 每周新闻由 David Fetter 为您呈现
请于太平洋时间每周日下午3:00前将新闻和公告提交至 david@fetter.org。
Tom Lane 推送了:
plpgsql:为变量初始化中的错误报告正确的行号。 此前,我们指向的是外层块的 BEGIN 关键字。如果 DECLARE 区域中有多个变量正在初始化,这是不够好的:可能会相当令人困惑且无用。我们确实知道变量声明的起始位置,因此只需要一点额外的错误报告基础设施就可以使用它。 讨论: https://postgr.es/m/713975.1635530414@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/acb2d7d5d2301f07d5857ee252995e62ce9e7055
避免备机进程释放大量锁时的 O(N^2) 行为。当重放在主服务器上持有大量排他锁的事务时,备机的 startup 进程在操作锁列表时会产生 O(N^2) 的开销。该代码在编写时是没有问题的,但提交 1cff1b95a 使得重复调用 list_delete_first() 变得低效,如其提交消息中所述。修复方式是正常遍历列表,并仅在完成后释放存储。(如果需要从中途发生的错误中恢复,这种方式就不够了;但我们不需要。)回溯移植到引入 1cff1b95a 的 v13。 Nathan Bossart 讨论: https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/6301c3adabd947394682e37c933b0f3f83353b28
文档:改进与 TAP 测试相关的 README 文件。重新整理 src/test/perl/README,使第一部分更清楚地描述"如何运行这些测试",其余部分描述"如何编写新测试"。添加了一些关于调试测试失败的基本信息。然后,在描述如何运行 TAP 测试的其他 README 文件中添加了对该 README 的交叉引用。 根据 Kevin Burke 的建议,但这不是他的原始补丁。 讨论: https://postgr.es/m/CAKcy5eiSbwiQnmCfnOnDCVC7B8fYyev3E=6pvvECP9pLE-Fcuw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b21415595cace7f3a45cfeb3023359b4b4d56b85
不要尝试在一次调用中读取数 GB 大小的 pg_stat_statements 文件。Windows 在请求 read() 超过 INT_MAX 字节时会失败,其他平台也可能有类似问题。让我们调整此代码,每次调用最多读取 1GB。(人们可能不会认为该文件能变得那么大,但现在我们有了故障报告,所以它确实可以。我们可能应该添加某种机制来单独限制查询文本文件的大小,与哈希表的大小分开。但那不是这个补丁。) 根据 Yusuke Egashira 的 Bug #17254。这个问题已经存在了一段时间,所以回溯移植到所有支持的分支。 讨论: https://postgr.es/m/17254-a926c89dc03375c2@postgresql.org https://git.postgresql.org/pg/commitdiff/a667b066837849c5e55e0d626f1f7c93e267b8b7
避免列表操作中的其他一些 O(N^2) 风险。与 6301c3ada 的精神相同,修复了更多在循环中使用 list_delete_first() 从而有 O(N^2) 行为风险的地方。不确定这些地方操作的列表是否能长到真正成为问题……但也不确定不会,而且修复很简单。同样,回溯移植到 v13。 讨论: https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/e9d9ba2a4ddc39e331dd8461b511aa59ec0dc8af
避免 SyncPostCheckpoint() 中的 O(N^2) 行为。与提交 6301c3ada 和 e9d9ba2a4 一样,避免执行重复的 list_delete_first() 操作,因为在有大量文件等待删除时这会很昂贵。这是比那些情况稍大的变更。我们必须为调用 AbsorbSyncRequests() 保持列表状态有效,因此需要发明一个"canceled"字段而不是立即删除 PendingUnlinkEntry 条目。另外,因为我们可能无法处理所有条目,我们需要一个新的列表原语 list_delete_first_n()。 list_delete_first_n() 几乎就是 list_copy_tail(),但它修改输入的 List 而不是创建新副本。我发现了几个现有的后者使用场景可以有效地使用新函数。(可能还有更多,但其他调用者看起来可能不应该覆盖输入 List。) 同样,回溯移植到 v13。 讨论: https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/65c6cab1365ac33b11a49a2a193f6b3f9c53e487
文档:更精确地描述关系名称之间的冲突。在所有这些对象类型的参考页面中使用类似"表的名称必须与同一模式中任何其他关系(表、序列、索引、视图、物化视图或外部表)的名称不同"的措辞。这里的主要变更是明确提及物化视图;尽管有几个页面之前完全没有说明名称冲突的内容。 根据 Daniel Westermann 的建议。 讨论: https://postgr.es/m/ZR0P278MB0920D0946509233459AF0DEFD2889@ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/af8c580e5cf32bb85dde70083a260c93a1f783eb
文档:整理一些提到 template1 但未提到 template0 的地方。改进在我们将 template0 添加到标准数据库集时未更新的旧文本。 根据 P. Luzanov 的建议。 讨论: https://postgr.es/m/163583775122.675.3700595100340939507@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/7d9ec0754afeabb9f336c5220ef415c3ea27a0b6
修复 ExecInitCoerceToDomain() 中的变量生命周期。这撤消了 1ec7679f1 中的一个错误:domainval 和 domainnull 原本应在循环迭代间保持存在,但被错误地移到了循环内部。其效果只是发出无用的额外 EEOP_MAKE_READONLY 步骤,所以这不是大问题;尽管如此,回溯移植到引入该错误的 v13。 Ranier Vilela 讨论: https://postgr.es/m/CAEudQAqXuhbkaAp-sGH6dR6Nsq7v28_0TPexHOm6FiDYqwQD-w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/01fc6527034a6f70ed44a078af8f636b1ab64947
确保日期时间和 float8 值的逻辑复制一致性。在 walreceiver 中,将发布者的相关 GUC(datestyle、intervalstyle、extra_float_digits)设置为与 pg_dump 使用的相同值,原因也相同:我们需要输出无论接收者的设置如何都能以相同方式读取。否则,订阅者可能会误解传输的值。虽然这显然是一个 bug 修复,但也不是没有缺点:将值存储为其他数据类型(如 text)的订阅者可能会得到与之前不同的结果,并且可能对此不满。鉴于之前没有收到投诉,似乎最好只在 HEAD 中更改此项,并将其作为 v15 中的不兼容变更进行说明。 Japin Li,根据 Sadhuprasad Patro 的报告 讨论: https://postgr.es/m/CAFF0-CF=D7pc6st-3A9f1JnOt0qmc+BcBPVzD6fLYisKyAjkGA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/f3d4019da5d026f2c3fe5bd258becf6fbb6b4673
尝试消除 hamerkop 上的 SSL 编译失败。构建农场成员 hamerkop 在过去几天一直出现失败,错误看起来像是 OpenSSL 的 X509 相关符号没有被导入到 be-secure-openssl.c 中。不清楚为什么会这样,但让我们尝试添加一个显式的 #include <openssl/x509v3.h>,就像 fe-secure-openssl.c 中长期以来的做法一样。 讨论: https://postgr.es/m/1051867.1635720347@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/24f9e49e430b4173d75a570e06abef8e3fd12c5e
修复 pg_basebackup 的 MSVC 构建。提交 23a1c6578 认为用新变量 BBOBJS 重构 pg_basebackup/Makefile 是个好主意,但我们的 MSVC 构建系统对此一无所知。根据构建农场。 https://git.postgresql.org/pg/commitdiff/d8bf0a1c1d3429cafb3019f2773e2f3aa68f3b65
第二次尝试消除 hamerkop 上的 SSL 编译失败。经过进一步调查,问题的原因似乎是我们最近决定开始定义 WIN32_LEAN_AND_MEAN。这导致 <windows.h> 不再包含 <wincrypt.h>,这意味着 OpenSSL 头文件无法通过 #undef 冲突的宏来防止与该头文件的冲突。显然,在 OpenSSL 头文件之后 be-secure-openssl.c #include 的某个其他系统头文件正在引入 <wincrypt.h>。具体发生在哪里以及为什么我们在其他 Windows 构建农场机器上没有看到这个问题还不清楚。但是,将 OpenSSL #include 移到列表末尾应该可以解决。为了面向未来,在 fe-secure-openssl.c 中也做同样的处理。顺便删除了无用的 <openssl/ssl.h> 重复包含。 感谢 Thomas Munro 追查相关信息。 讨论: https://postgr.es/m/1051867.1635720347@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/1241fcbd7e649414f09f9858ba73e63975dcff64
禁止通过 array_to_tsvector() 创建空词素。tsvector 数据类型一直禁止词素为空。但是,array_to_tsvector() 没有收到这个通知,允许空字符串数组元素成为空词素。这可能导致后续的 dump/restore 失败,更不用说原始禁止背后可能存在的语义问题了。但是,直接将纯文本输入作为词素值的其他函数不需要类似的限制,因为它们只是将字符串与现有的 tsvector 条目进行匹配。特别是让 ts_delete() 拒绝空字符串是个坏主意,因为这是清理可能通过此 bug 进入 tsvector 列的坏数据的最方便方法。考虑到这一点,让我们也移除 tsvector_delete_arr 和 tsvector_setweight_by_filter 中对 NULL 数组元素的禁止。忽略它们似乎更一致,就像忽略空字符串元素一样。有理由将此回溯移植,因为它显然是一个 bug 修复。但总的来说,它似乎不是在次要版本中应该更改的内容。 Jean-Christophe Arnu 讨论: https://postgr.es/m/CAHZmTm1YVndPgUVRoag2WL0w900XcoiivDDj-gTTYBsG25c65A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/cbe25dcff73a297adbada9dc1d6cad3df18014e9
尝试修复 MSVC pgcrypto 构建。提交 db7d1a7b0 去掉了 Mkvcbuild.pm 对构建 contrib/pgcrypto 的自定义支持,但忘记告知它该模块现在可以正常构建了。或者至少我猜它现在可以正常构建了。但这确实导致 bowerbird 失败,因为它试图测试一个它没有构建的模块。 https://git.postgresql.org/pg/commitdiff/3c2c391dc9f82fae181508ebcc2f7621ffefd024
文档:添加一些关于 List 函数性能的注释。 根据 Andres Freund 的建议。 讨论: https://postgr.es/m/20211104221248.pgo4h6wvnjl6uvkb@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/27ef132a805c8633ed8bb94ed70be995c681ab1f
contrib/sslinfo 也需要修复以使 hamerkop 正常工作。重新排列 #include 在这里有些问题,因为 libpq/libpq-be.h 需要包含 <openssl/ssl.h>。相反,让我们在所有 #include 之后 #undef 不需要的宏。这肯定比另一种方式更丑陋,但它应该能在未来可能的头文件重排中正常工作。(查看 OpenSSL 头文件表明 X509_NAME 是我们使用的唯一冲突符号。)顺便删除了 pg_backup_archiver.h 中一个相关但长期不正确的注释。 讨论: https://postgr.es/m/1051867.1635720347@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/568620dfd6912351b4127435eca5309f823abde8
消除未初始化变量的警告。相当多的构建农场机器对此发出警告,lapwing 实际上构建失败了(因为 -Werror)。据我所知这是误报,所以只需要在开始时将变量初始化为零。 讨论: https://postgr.es/m/YYXJnUxgw9dZKxlX@paquier.xyz https://git.postgresql.org/pg/commitdiff/c3ec4f8fe867807613c08fe16789434ab1a74a15
Michaël Paquier 推送了:
在 REINDEX CONCURRENTLY 中保留操作符类参数。旧索引的操作符类参数 Datum 以与谓词和表达式相同的方式获取,即直接从系统目录中获取,然后复制到将用于创建新副本的新 IndexInfo 中。这导致新索引使用默认参数而非用户预定义的参数进行重建。恢复具有正确操作符类参数的新索引的唯一方法是从头开始重新创建索引。 该问题由 911e702 引入。 作者:Michael Paquier 审查者:Zhihong Yu 讨论: https://postgr.es/m/YX0CG/QpLXcPr8HJ@paquier.xyz 回溯移植至:13 https://git.postgresql.org/pg/commitdiff/add5cf28d48149459466b9aff374d78aebf17482
为 pg_receivewal 添加时间线切换的 TAP 测试。pg_receivewal 能够跟随时间线切换,但这一点之前没有测试过。此测试使用一个空的归档位置并从一个槽重新启动,使其实现比重用现有归档目录稍微简单一些。 作者:Ronan Dunklau 审查者:Kyotaro Horiguchi、Michael Paquier 讨论: https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/0f9b9938a0367313fcf6a32fcb7fb5be9e281198
重构 pg_receivewal 的压缩选项。pg_receivewal 自 cada1af 以来包含 --compress 选项,允许使用 gzip 压缩 WAL 段,值为 0(默认值)表示不使用压缩。此提交引入了一个名为 --compression-method 的新选项,能够使用"none"(默认值)和"gzip"作为值,使其更具可扩展性。--compress=0 的情况在这个选项层中变得模糊,因此我们选择让 pg_receivewal 在使用"none"和非零压缩级别时返回错误,这意味着 --compress 的授权值现在是 [1,9] 而不是 [0,9]。不指定 --compress 并使用"gzip"作为压缩方法会使 pg_receivewal 使用 zlib 的默认值(Z_DEFAULT_COMPRESSION)。扫描现有归档以查找流起始 LSN 的代码被重构并使其更具可扩展性。同时,将 walmethods.c 中的"compression"重命名为"compression_level",以减少与压缩方法引入的混淆,即使 pg_basebackup 使用的 tar 方法不依赖于压缩方法(至少目前是这样),而只是依赖于压缩级别(这个领域实际上还可以进一步改进)。 这是为即将到来的为 pg_receivewal 添加 LZ4 支持的补丁做准备。 作者:Georgios Kokolatos 审查者:Michael Paquier、Jian Guo、Magnus Hagander、Dilip Kumar、Robert Haas 讨论: https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/d62bcc8b07f921bad105c7a826702c117ea7be58
修复 pg_receivewal --compression-method 的一些笔误。其中一条错误消息中的选项名称不正确,代码中使用了短选项 'I',但我们并不打算这样做。同时,修复文档以引用"方法"而非"级别"。 提交 d62bcc8 中的疏忽,在我对 pg_receivewal 的 LZ4 补丁进行更多审查后发现。 https://git.postgresql.org/pg/commitdiff/9588622945754305836555273a6a3be814db315c
在 pg_receivewal 中添加 LZ4 压缩支持。pg_receivewal 获得了一个新选项 --compression-method=lz4,在代码使用 --with-lz4 编译时可用。与 gzip 类似,这提供了使用 LZ4 压缩归档 WAL 段的可能性。此选项与 --compress 不兼容。实现使用 LZ4 帧,与简单的 lz4 命令兼容。与 gzip 一样,使用 --synchronous 确保任何数据都将在当前的 .partial 段内刷新到磁盘,这样即使从未完成的段中也可以检索尽可能多的 WAL 数据(这需要在解压后用零填充部分文件至后端支持的 WAL 段大小,但这与 gzip 相同)。流起始 LSN 的计算能够透明地查找和检查 LZ4 压缩的段。与 gzip 中未压缩大小直接存储在读取的对象中不同,LZ4 块协议默认不存储未压缩的数据。有 contentSize 可以与 LZ4 帧一起使用,但如果使用包含以"lz4"命令的默认设置压缩的段的归档(其中不存储此信息),则无济于事。 因此,此提交采用了最具可扩展性的方法,通过 64kB 块的空白输出缓冲区解压已归档的段以检查其未压缩大小(使用 8kB、16kB 或 32kB 未注意到实际性能差异,且操作本身实际上很快)。已添加测试以验证生成的 LZ4 文件的创建和正确性。后者通过使用"lz4"命令(如果在环境中找到)来实现。walmethods.c 中基于 tar 的 WAL 方法(现在仅由 pg_basebackup 使用)尚不了解 LZ4。其代码可以为此目的进行扩展。 作者:Georgios Kokolatos 审查者:Michael Paquier、Jian Guo、Magnus Hagander、Dilip Kumar 讨论: https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/babbbb595d2322da095a1e6703171b3f1f2815cb
改进 psql 对 COMMENT 的 Tab 补全。为更多对象类型添加了补全,如域约束、文本搜索相关对象或策略。此外,该区域已重新组织,将 COMMENT 支持的对象列表更改为与文档相同的顺序,以方便未来的添加。 作者:Ken Kato 审查者:Fujii Masao、Shinya Kato、Suraj Khamkar、Michael Paquier 讨论: https://postgr.es/m/6e0c2f3f657b229bea32d098d118f307@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/a5b336b8b9e04a93e7c8526302504d2e5201eb80
Álvaro Herrera 推送了:
在 DecodeXLogOp 中处理 XLOG_OVERWRITE_CONTRECORD。不这样做会导致逻辑解码无法处理 WAL 流。通过什么都不做来处理它。一直回溯移植到最早版本。 报告者:Petr Jelínek petr.jelinek@enterprisedb.com https://git.postgresql.org/pg/commitdiff/40c516bba864395c77bcfb1bae65ba9562ba8f71
改写 vacuumdb --analyze-in-stages 的文档说明。让用户意识到在具有现有统计信息的数据库中使用它可能会导致暂时性问题。 作者:Nikolai Berkoff nikolai.berkoff@pm.me 讨论: https://postgr.es/m/s-kSljtWXMWgMfGTztPTPcS80R8FHdOrBxDTnrQI6GMZbT7au1A4b0fzaSFtKwCI8nwN0MhgPLfVOTvJ7DwTjkip4P3d0o4VgrMJs4OLN-o=@pm.me https://git.postgresql.org/pg/commitdiff/00a354a13560dc529ac34a303c85c265aaf033b7
记录 log_startup_progress_interval 的默认值和可更改性。 对 9ce346eabf35 的审查。 作者:Álvaro Herrera alvherre@alvh.no-ip.org 审查者:Robert Haas robertmhaas@gmail.com 讨论: https://postgr.es/m/202110292123.bnf6axcp27vx@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/e543906e217509ad95c1e341de4e874f027f871b
管道模式不允许多命令字符串。……因此在 libpq 文档的适当位置提及这一点。回溯移植到 14。 报告者:RekGRpth rekgrpth@gmail.com 讨论: https://postgr.es/m/17235-53bb38fc5be593dc@postgresql.org https://git.postgresql.org/pg/commitdiff/105c1de0197473dac8ada55dc8cf773d782224cb
记录 ALTER TABLE .. TYPE 会移除统计信息。 共同作者:Nikolai Berkoff nikolai.berkoff@pm.me 讨论: https://postgr.es/m/vCc8XnwDmlP4ZnHBQLIVxzD405BiYHVC9qZlhIF7IsfxK0gC9mZ4PUUOH0-3y6kv5p-87-3_ljqT1KvQVAnb8OoWhPU3kcqWn2ZpmxRBCQg=@pm.me https://git.postgresql.org/pg/commitdiff/df80f9da5c6541e744eeb20eaca919c7fc189999
避免在并发 DROP 的罕见情况下崩溃。当正在删除的角色被同时也在被删除的目录对象引用时,尝试构造描述这些对象的字符串时可能导致崩溃。通过忽略描述返回为 NULL 的对象来解决这个问题。大多数相关代码点已经对此非常谨慎了;我们只是遗漏了几个。这是一个旧 bug,所以一直回溯移植到最早版本。 报告者:Alexander Lakhin exclusion@gmail.com 讨论: https://postgr.es/m/17126-21887f04508cb5c8@postgresql.org https://git.postgresql.org/pg/commitdiff/d74b54b3ddf710926a44bf3f9c87c00e6f82d825
Daniel Gustafsson 推送了:
Amit Kapila 推送了:
用更局部化的标志替换 XLOG_INCLUDE_XID 标志。提交 0bead9af484c 引入了 XLOG_INCLUDE_XID 标志来指示 WAL 记录包含 subXID-to-topXID 关联。它稍后使用该标志在 CurrentTransactionState 中标记 top-xid 已记录,这样我们就不应该在当前子事务中尝试使用下一条 WAL 记录再次记录它。但是,我们可以使用局部化变量来传递该信息。顺便更改了相关函数和变量名称,使它们与代码实际执行的操作一致。 作者:Dilip Kumar 审查者:Alvaro Herrera、Amit Kapila 讨论: https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/71db6459e6e4ef623e98f3b1e3e9fed1bfb0ae3b
将 MarkCurrentTransactionIdLoggedIfAny() 移出临界区。我们在这个函数中不修改任何可能导致并发会话出问题的共享状态。这将使其看起来类似于同一结构(TransactionState)的其他更新,避免未来代码读者的困惑。 作者:Dilip Kumar 审查者:Amit Kapila 讨论: https://postgr.es/m/E1mSoYz-0007Fh-D9@gemulon.postgresql.org https://git.postgresql.org/pg/commitdiff/335397456b7e3f9f619038cb322fbfc9dd649d4f
Fujii Masao 推送了:
pgbench:改进 pgbench 的错误处理。此前,初始连接失败和日志文件打开失败会导致 pgbench 继续基准测试,报告不完整的结果并以状态 2 退出。即使 pgbench 无法按规定启动也继续基准测试是没有意义的。 此提交改进了 pgbench,使得基准测试启动时发生的早期错误(如上述失败)应使 pgbench 立即以状态 1 退出。 作者:Yugo Nagata 审查者:Fabien COELHO、Kyotaro Horiguchi、Fujii Masao 讨论: https://postgr.es/m/TYCPR01MB5870057375ACA8A73099C649F5349@TYCPR01MB5870.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/cd29be5459f0e138c0f19d49ee588feeda78e3c9
pgbench:修复注释中的拼写错误。 讨论: https://postgr.es/m/f9041ec2-46b6-1b41-0e84-9c8a1e2d6bda@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/d8dba4d03068eeee1ea3ffc8e7c7b4fa3e35a7f4
Peter Geoghegan 推送了:
不要在并行 VACUUM 期间遗漏索引。提交 b4af70cb 简化了 VACUUM 管理的状态,并顺便重构了并行 VACUUM。对 leader 进程负责的确切任务详细信息的混淆导致代码可能使并行 VACUUM 完全遗漏表的部分索引。具体来说,低于 min_parallel_index_scan_size 大小阈值的索引被遗漏了。这些索引本应由 leader(连同任何不安全的并行索引一起)进行清理,但完全没有被清理。受影响的索引在堆 TID 被回收用于新堆元组后,很容易出现重复的堆 TID。这会产生几乎任何涉及索引与其表之间结构不一致的索引损坏的通用症状。 修复方式是确保并行 VACUUM leader 进程对恰好低于大小阈值的索引执行任何所需的索引清理。还记录了并行 VACUUM 中这些低于大小阈值索引的设计。 不清楚有多少用户可能受到此 bug 的影响。表上至少需要有三个索引才能触发此 bug:一个较小的索引,加上至少两个超过大小阈值的额外索引。只有一个额外索引的情况不会遇到问题,因为并行 VACUUM 成本模型要求表上有两个超过阈值的索引才能应用并行处理。还要注意,autovacuum 不受影响,因为它从不使用并行处理。 测试用例基于 Masahiko Sawada 更大的并行 VACUUM 测试补丁中的测试。非常感谢 Kamigishi Rei 在追踪此问题方面提供的宝贵帮助。 作者:Peter Geoghegan pg@bowt.ie 作者:Masahiko Sawada sawada.mshk@gmail.com 报告者:Kamigishi Rei iijima.yun@koumakan.jp 报告者:Andrew Gierth andrew@tao11.riddles.org.uk 诊断者:Andres Freund andres@anarazel.de Bug: #17245 讨论: https://postgr.es/m/17245-ddf06aaf85735f36@postgresql.org 讨论: https://postgr.es/m/20211030023740.qbnsl2xaoh2grq3d@alap3.anarazel.de 回溯移植:14-,重构提交出现的版本。 https://git.postgresql.org/pg/commitdiff/9bacec15b67d1a643915858f054790f36b2b7871
修复并行 amvacuumcleanup 安全 bug。提交 b4af70cb 反转了 parallel_processing_is_safe() 函数的返回值,但遗漏了 amvacuumcleanup 的测试。完全不支持并行清理的索引 AM 受到了影响。 此 bug 的实际后果并不很严重。Hash 索引受到影响,但由于它们在 hashvacuumcleanup 中只是返回块数,因此影响不大。 作者:Masahiko Sawada sawada.mshk@gmail.com 讨论: https://postgr.es/m/CAD21AoA-Em+aeVPmBbL_s1V-ghsJQSxYL-i3JP8nTfPiD1wjKw@mail.gmail.com 回溯移植:14-,提交 b4af70cb 出现的版本。 https://git.postgresql.org/pg/commitdiff/c59278a1aa5ef2ee8a6d5d83bd987a7ce5c89e84
在 git-blame-ignore-revs 中添加另一个旧提交。添加了另一个被初始工作(提交 8e638845)遗漏的历史 pgindent 提交。 https://git.postgresql.org/pg/commitdiff/581055c32fbb5018431265877754cbd8019bc012
向堆修剪代码添加各种断言。这些断言记录(并验证)我们关于修剪如何能够和不能影响目标堆页面中现有项的高级假设。例如,其中一个新断言验证修剪不会将仅堆元组设置为 LP_DEAD。 作者:Peter Geoghegan pg@bowt.ie 审查者:Andres Freund andres@anarazel.de 讨论: https://postgr.es/m/CAH2-Wz=vhvBx1GjF+oueHh8YQcHoQYrMi0F0zFMHEr8yc4sCoA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5cd7eb1f1c32e1b95894f28b277b4e4b89add772
添加加固措施以捕获索引中的无效 TID。在 heapam 索引元组删除路径中添加加固措施,以捕获索引页面中指向索引元组不应该指向的堆项的 TID。我们试图捕获的损坏特别难以检测,因为它通常涉及"额外的"(损坏的)索引元组,而不是索引中缺少必需的索引元组。例如,索引页面中的堆 TID 如果指向堆页面中的 LP_UNUSED 项,很有可能被其中一个新检查捕获。如果该特定检查在 Postgres 14 中就存在,那么最近修复的并行 VACUUM bug(见提交 9bacec15)很有可能会被捕获。不过目前不回溯移植此额外加固。 作者:Peter Geoghegan pg@bowt.ie 审查者:Andres Freund andres@anarazel.de 讨论: https://postgr.es/m/CAH2-Wzk-4_raTzawWGaiqNvkpwDXxv3y1AQhQyUeHfkU=tFCeA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e7428a99a13f973549aab30c57ec8380ddda1869
更新过时的堆修剪注释。添加新注释,阐明 VACUUM 对堆修剪的预期:修剪绝不能留下仍有元组存储的 DEAD 元组。至少从提交 8523492d 以来就是如此,该提交确立了 vacuumlazy.c 不必直接处理仍有元组存储的 DEAD 元组的原则,除非可能只是简单地重试修剪(以处理涉及并发事务中止的罕见边缘情况)。 顺便更新了快照可扩展性工作(特别是提交 dc7420c2c9)遗漏的一些旧符号名称的引用。 https://git.postgresql.org/pg/commitdiff/f214960adde6028a39ba3014b1ab2b224faeefed
更新 vacuumlazy.c 中过时的引用。提交 7ab96cf6 的疏忽。 https://git.postgresql.org/pg/commitdiff/02f9fd129432cab565b2a3cb9f3b3a5000dfe540
Peter Eisentraut 推送了:
修复不正确的格式占位符。 https://git.postgresql.org/pg/commitdiff/ef6f047d2c87b91318364341c058dd6b715951b2
pgcrypto:移除非 OpenSSL 支持。pgcrypto 有一些加密算法的内部实现,作为调用 OpenSSL 的替代方案。这些很少被使用,因为大多数生产环境都是使用 OpenSSL 构建的。此外,维护并行代码路径使代码更复杂且更难维护。此补丁移除了这些内部实现。现在,pgcrypto 仅在配置了 OpenSSL 支持时才会构建。 审查者:Daniel Gustafsson daniel@yesql.se 讨论: https://www.postgresql.org/message-id/flat/0b42f1df-8cba-6a30-77d7-acc241cc88c1%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/db7d1a7b0530e8cbd045744e1c75b0e63fb6916f
Heikki Linnakangas 推送了:
修复 lo_export 失败时的快照引用泄漏。如果 lo_export() 无法打开目标文件或写入文件,它会在顶层事务上下文和资源所有者中泄漏创建的 LargeObjectDesc 及其快照。这相当无害,毕竟只是一个小泄漏,但它会给用户一个"Snapshot reference leak"警告。 修复方式是为在一次函数调用中打开和关闭的临时 LargeObjectDesc 使用短生命周期的内存上下文且不使用资源所有者。使用 lo_export() 对不存在的目录最容易重现此泄漏,但原则上其他 lo_* 函数也可能失败。 回溯移植到所有支持的版本。 报告者:Andrew B 审查者:Alvaro Herrera 讨论:
https://www.postgresql.org/message-id/32bf767a-2d65-71c4-f170-122f416bab7e@iki.fi
https://git.postgresql.org/pg/commitdiff/6b1b405ebfdce9da47f59d8d4144b1168709fbce
更新备选预期输出文件。前一个提交向 'largeobject' 添加了测试,但忽略了备选预期输出文件 'largeobject_1.source'。 根据构建农场机器 'hamerkop' 上的失败。 讨论: https://www.postgresql.org/message-id/DBA08346-9962-4706-92D1-230EE5201C10@yesql.se https://git.postgresql.org/pg/commitdiff/d5ab0681bf1bbf6c0c2cba9a2d55fe8e080597b6
Robert Haas 推送了:
amcheck:添加额外的 TOAST 指针检查。扩展对 toast 属性的检查,在 rawsize 过大时发出警告。对于压缩属性,如果压缩似乎扩大了属性或压缩方法无效,也会发出警告。 Mark Dilger,由 Justin Pryzby、Alexander Alekseev、Heikki Linnakangas、Greg Stark 和我审查。 讨论: http://postgr.es/m/8E42250D-586A-4A27-B317-8B062C3816A8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/bd807be6935929bdefe74d1258ca08048f0aafa3
引入 'bbsink' 抽象以模块化基础备份代码。基础备份代码多年来积累了大量新功能,但由于没有真正的关注点分离,维护和进一步增强该代码变得越来越困难。例如,了解如何使用 libpq 协议向客户端发送数据的详细信息的代码分散在 basebackup.c 各处,而不是集中在一个地方。 为了改善这种情况,引入了一个新的 'bbsink' 对象,作为基础备份进程中生成的归档以及备份清单的接收者。此提交引入了三种类型的 bbsink:'copytblspc' bbsink 使用每个表空间一个 COPY OUT 操作和另一个用于清单将备份转发到客户端,'progress' bbsink 执行命令进度报告,'throttle' bbsink 执行速率限制。'progress' 和 'throttle' bbsink 类型还将数据转发给后继 bbsink;目前,链中的最后一个 bbsink 始终是 'copytblspc' 类型。计划在未来的提交中添加更多类型的 'bbsink'。 这个抽象在进度报告方面有点泄漏,但这仍然比我们之前的方式更清洁。 由我编写补丁,由 Andres Freund、Sumanta Mukherjee、Dilip Kumar、Suraj Kharage、Dipesh Pandit、Tushar Ahuja、Mark Dilger 和 Jeevan Ladhe 审查和测试。 讨论: https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论: https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bef47ff85df18bf4a3a9b13bd2a54820e27f3614
引入 'bbstreamer' 抽象以模块化 pg_basebackup。pg_basebackup 知道如何对从服务器获取的备份做很多事情,比如直接写出文件,或先压缩它们,甚至解析 tar 格式并将修改后的 postgresql.auto.conf 文件注入到服务器生成的归档中。不幸的是,这使得 pg_basebackup.c 成为一个非常大的源文件,而且也有些难以增强,因为例如服务器发送给我们的是 'tar' 文件而不是其他类型归档的知识分散在各处而不是集中管理。 为了改善这种情况,此提交发明了一个新的 'bbstreamer' 抽象。从服务器接收的每个归档都被馈送到一个 bbstreamer,后者可以选择处理它或将其传递给其他某个 bbstreamer。块也可以根据它们是归档中文件的载荷数据还是归档元数据的一部分来"标记"。 因此,例如,如果我们想获取一个 tar 文件,修改它包含的 postgresql.auto.conf 文件,然后 gzip 结果并写出,我们可以使用 bbstreamer_tar_parser 解析从服务器接收的 tar 文件,bbstreamer_recovery_injector 修改 postgresql.auto.conf 的内容,bbstreamer_tar_archiver 用为前一步中修改的文件新构建的正确 tar 头替换 tar 头,以及 bbstreamer_gzip_writer 对结果数据进行 gzip 并写入。只有名称中包含"tar"的对象知道 tar 归档格式的任何信息,理论上如果有人想编写代码,我们可以使用其他格式而不是"tar"重新归档。 这些更改确实添加了大量代码,但我认为结果在可维护性和可扩展性方面好得多。pg_basebackup.c 本身缩减了大约三分之一,之前包含在其中的很多复杂性移到了新添加的文件中。 由我编写补丁。包含此补丁的更大补丁系列在不同时间由 Andres Freund、Sumanta Mukherjee、Dilip Kumar、Suraj Kharage、Dipesh Pandit、Tushar Ahuja、Mark Dilger、Sergei Kornilov 和 Jeevan Ladhe 审查和测试。 讨论: https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论: https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/23a1c6578c87fca0e361c4f5f9a07df5ae1f9858
不要在没有理由时设置 ThisTimeLineID。在 slotfuncs.c 中,pg_replication_slot_advance() 需要确定槽应该推进到的 LSN,但这并不要求我们更新 ThisTimeLineID,因为此处调用的代码都不依赖于它。如果复制槽是逻辑的,pg_logical_replication_slot_advance 将调用 read_local_xlog_page,它确实使用 ThisTimeLineID,但也会确保它是最新的。如果复制槽是物理的,时间线根本不用于任何事情。 在 logicalfuncs.c 中,pg_logical_slot_get_changes_guts() 有相同的问题:我们将要运行的关心时间线的唯一代码在 read_local_xlog_page 中或其下游,它已经确保设置了正确的值。因此,不要在这里做。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caf1f675b88d1aa67ea3fb642e8f38b470cc911e
移除 xlog.c 之外所有对 ThisTimeLineID 全局变量的使用。所有此类代码以三种方式之一处理此全局变量。有时同一函数同时以多种方式使用它。 首先,有时它是 xlog.c 或其他地方调用的一个或多个函数的隐式参数,必须在调用这些函数之前设置为适当的值,否则它们会出现问题。在这些情况下,现在改为作为显式参数传递。 其次,有时它用于在恢复结束后获取当前时间线,即正在写入和刷新 WAL 的时间线。此类代码现在调用 GetWALInsertionTimeLine() 或依赖于添加到 GetFlushRecPtr() 的新输出参数。 第三,有时在恢复期间用于存储当前重放时间线。这可能会改变,因此此类代码通常必须在每次使用前更新该值。它仍然可以这样做,但现在必须使用局部变量。 这些更改的净效果是大幅减少了直接访问此全局变量的代码量。这是好事,因为历史表明,我们并不总是清楚地考虑在任何给定时间点它应该包含哪个时间线 ID,或者实际上它是否在代码中的任何给定点已经或需要被初始化。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e997a0c642860a96df0151cbeccfecbdf0450d08
将 ThisTimeLineID 从全局变量更改为局部变量。StartupXLOG() 仍然将 ThisTimeLineID 作为局部变量,但 xlog.c 中的其余代码现在需要通过其他方式获取相关的 TimeLineID。大多数情况下,这意味着我们现在将其作为函数参数传递给以前不需要的许多函数。但是,一些情况需要特殊处理: - 对于可能被不一定知道应指定哪个时间线的外部调用者调用的函数,我们从共享内存获取时间线 ID。在大多数情况下可以使用 XLogCtl->ThisTimeLineID,因为在调用这些函数时已知恢复已完成。在 xlog_redo() 中,我们可以使用 XLogCtl->replayEndTLI。 - XLogFileClose() 需要知道打开的日志文件的 TLI。使用新的全局变量 openLogTLI 来做到这一点。虽然有人可能认为这只是用一个全局变量换另一个,但新变量的用途要窄得多,仅在几个地方被引用。 - read_backup_label() 现在返回它通过解析 backup_label 文件获得的 TLI。此前,可以在 ThisTimeLineID 未被初始化的情况下调用 ReadRecord() 来解析检查点记录。现在,时间线被传递下去,我不想传递未初始化的变量;这个更改让我们避免了这种情况。旧的编码似乎没有我们需要担心的实际后果,但这样做更清洁。 - 在 BootstrapXLOG() 中,它只是一个常量。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4a92a1c3d1c361ffb031ed05bf65b801241d7cdd
移除 bd807be6935929bdefe74d1258ca08048f0aafa3 添加的测试。构建农场不满意。目前还不清楚它为什么不喜欢这些测试,但让我们先移除它们,直到我们弄清楚。 讨论: http://postgr.es/m/462618.1636171009@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ccf289745d3e50360653181dce6a277a1fc79730
Tomáš Vondra 推送了:
修复 BRIN minmax multi 中 NaN 值的处理。在计算 float4/float8 值之间的距离时,我们需要更加注意 NaN 值,以避免触发断言。我们认为 NaN 值相等(距离 0.0),并且与所有其他值的距离为无穷大。 在没有断言的构建上,此问题基本无害——范围可能以较低效率的顺序合并,但索引仍然正确。 根据 Andreas Seltenreich 的报告。回溯移植到 14,新 BRIN 操作符类引入的版本。 报告者:Andreas Seltenreich 讨论: https://postgr.es/m/87r1bw9ukm.fsf@credativ.de https://git.postgresql.org/pg/commitdiff/d91353f4b21f10417d142e6ac17a0490adae867c
将 mystreamer 变量标记为 PG_USED_FOR_ASSERTS_ONLY。消除在没有断言的情况下构建时关于未使用变量的警告。 https://git.postgresql.org/pg/commitdiff/dafcf887daa472b0a49bee7e07042372bc37cee4
向 btree_gist 添加 bool GiST 操作符类。向 btree_gist 扩展添加 bool 操作符类,允许在 bool 列上创建 GiST 索引。在单个 bool 列上的 GiST 索引似乎不是特别有用,但这允许定义涉及 bool 列的排除约束。 作者:Emre Hasegeli 审查者:Andrey Borodin 讨论: https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/57e3c5160b24e61758f817feb7aac152cd695c6f
修复 gist_bool_ops 以使用 gbtreekey2。提交 57e3c5160b 添加了一个新的 GiST bool 操作符类,但它使用 gbtreekey4 来存储数据,这留下了两个字节未定义,正如我们的 valgrind 机器 skink 所报告的。还有一些更多的混淆,因为操作符类在定义中也使用了 gbtreekey8。 修复方式是定义一个新的 gbtreekey2 结构,并在所有地方使用它。 讨论: https://postgr.es/m/CAE2gYzyDKJBZngssR84VGZEN=Ux=V9FV23QfPgo+7-yYnKKg4g@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e2fbb883720aa222f61eb9f3affad1c63bac7cbb
Alexander Korotkov 推送了:
Andres Freund 推送了: