PG Build 2021 將於 2021 年 11 月 30 日和 12 月 1 日格林威治標準時間 09:00-17:00 在線上舉行。詳細資訊。
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) 行為。 在重播在主要伺服器上持有許多獨佔鎖定的交易時,待命伺服器的啟動程序會在操作鎖定清單上花費 O(N^2) 的精力。 這段程式碼在編寫時很好,但 commit 1cff1b95a 使重複的 list_delete_first() 呼叫效率低下,如其 commit 訊息中所述。 只需正常迭代清單,並在完成後釋放儲存體即可解決此問題。 (如果我們需要從部分發生的錯誤中恢復,這將是不夠的;但我們不需要。) 回溯修補到 1cff1b95a 進入的 v13。 Nathan Bossart 討論:https://postgr.es/m/CD2F0E7F-9822-45EC-A411-AE56F14DEA9F@amazon.com https://git.postgresql.org/pg/commitdiff/6301c3adabd947394682e37c933b0f3f83353b28
Doc:改善與 TAP 測試關聯的 README 檔案。 重新安排 src/test/perl/README,使第一部分更清楚地說明「如何執行這些測試」,其餘部分說明「如何編寫新測試」。 在那裡新增一些關於除錯測試失敗的基本資訊。 然後,從其他描述如何執行 TAP 測試的 README 新增對該 READNE 的交叉引用。 根據 Kevin Burke 的建議,雖然這不是他的原始補丁。 討論:https://postgr.es/m/CAKcy5eiSbwiQnmCfnOnDCVC7B8fYyev3E=6pvvECP9pLE-Fcuw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/b21415595cace7f3a45cfeb3023359b4b4d56b85
不要嘗試在一次呼叫中讀取一個數 GB 的 pg_stat_statements 檔案。 Windows 無法處理讀取超過 INT_MAX 位元組的要求,並且可能其他平台也可能存在類似的問題。 讓我們調整此程式碼,使每次呼叫最多讀取 1GB。 (人們不會認為該檔案會變得那麼大,但現在我們收到了一份關於問題的欄位報告,因此它可以。 我們可能應該添加一些機制來限制查詢文本檔案的大小,與雜湊表的大小分開。 但這不是此補丁。) 根據 Yusuke Egashira 的錯誤 #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) 行為。 與 commit 6301c3ada 和 e9d9ba2a4 一樣,避免執行重複的 list_delete_first() 操作,因為當有許多檔案等待取消連結時,這將非常昂貴。 這是比這些情況稍大的變更。 我們必須保持清單狀態對於呼叫 AbsorbSyncRequests() 有效,因此有必要發明一個「已取消」欄位,而不是立即刪除 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
Doc:更準確地描述關係名稱之間的衝突。 在所有這些物件類型的參考頁面中使用諸如「表格的名稱必須與同一結構描述中的任何其他關係(表格、序列、索引、檢視、具體化檢視或外部表格)的名稱不同」的措辭。 這裡的主要變更是明確提及具體化檢視; 雖然其中一些頁面根本沒有說明有關名稱衝突的任何內容。 根據 Daniel Westermann 的建議。 討論:https://postgr.es/m/ZR0P278MB0920D0946509233459AF0DEFD2889@ZR0P278MB0920.CHEP278.PROD.OUTLOOK.COM https://git.postgresql.org/pg/commitdiff/af8c580e5cf32bb85dde70083a260c93a1f783eb
Doc:清理一些提到 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
確保 datetime 和 float8 值的邏輯複製一致性。在 walreceiver 中,將發布者的相關 GUC(datestyle、intervalstyle、extra_float_digits)設定為與 pg_dump 使用的相同值,原因也相同:我們需要以相同的方式讀取輸出,而不管接收者的設定如何。如果沒有這個,訂閱者可能會錯誤地解釋傳輸的值。雖然這顯然是一個錯誤修復,但並非沒有缺點:將值儲存到其他資料類型(例如 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 建置中斷。Commit 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 取消衝突的巨集來防止與該標頭發生衝突。顯然,be-secure-openssl.c 在 OpenSSL 標頭之後 #includes 的某些其他系統標頭正在拉入 <wincrypt.h>。目前尚不清楚這發生在哪裡以及為什麼我們沒有在其他 Windows 建置伺服器動物上看到它。但是,將 OpenSSL #includes 移到列表的末尾應該可以解決問題。為了將來能適用,也在 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() 建立空的 lexeme。tsvector 資料類型一直禁止 lexeme 為空。但是,array_to_tsvector() 沒有收到該備忘錄,並且允許空字串陣列元素成為空的 lexeme。這可能會導致稍後的 dump/restore 失敗,更不用說原始禁止背後可能存在的任何語意問題。但是,其他將純文字輸入直接作為 lexeme 值輸入的函數不需要類似的限制,因為它們只會將字串與現有的 tsvector 條目進行比對。特別是,讓 ts_delete() 拒絕空字串是一個壞主意,因為這是清理可能透過此錯誤進入 tsvector 欄位的任何錯誤資料的最方便方法。反思這一點,我們也來移除 tsvector_delete_arr 和 tsvector_setweight_by_filter 中對 NULL 陣列元素的禁止。忽略它們似乎更一致,因為空字串元素將被忽略。回溯修補這個案例是合理的,因為這顯然是一個錯誤修復。但總的來說,這似乎不是在次要版本中要變更的內容。Jean-Christophe Arnu 討論:https://postgr.es/m/CAHZmTm1YVndPgUVRoag2WL0w900XcoiivDDj-gTTYBsG25c65A@mail.gmail.com https://git.postgresql.org/pg/commitdiff/cbe25dcff73a297adbada9dc1d6cad3df18014e9
盲目嘗試修復 MSVC pgcrypto 建置。Commit db7d1a7b0 取消了 Mkvcbuild.pm 對建置 contrib/pgcrypto 的自訂支援,但忽略了通知它該模組現在可以正常建置。或者至少我猜它現在可以正常建置。但這絕對會導致 bowerbird 失敗,因為它試圖測試一個它沒有建置的模組。 https://git.postgresql.org/pg/commitdiff/3c2c391dc9f82fae181508ebcc2f7621ffefd024
Doc: 添加一些關於 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>。相反,讓我們在所有 #includes 之後 #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 中保留 opclass 參數。舊索引的 opclass 參數 Datums 是以與 predicates 和 expressions 相同的方式從系統目錄直接抓取來取得的。 然後將它們複製到將用於建立新副本的 IndexInfo 中。 這導致使用預設參數而不是使用者預定義的參數來重建新索引。 取得具有正確 opclass 參數的新索引的唯一方法是從頭開始重新建立一個新索引。 此問題是由 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 的壓縮選項。自 cada1af 以來,pg_receivewal 包含了 `--compress` 選項,允許使用 gzip 壓縮 WAL 區段,其值 0 (預設值) 表示不使用壓縮。本次提交引入了一個新的選項,名為 `--compression-method`,其值可以是 "none" (預設值) 和 "gzip",以增加擴充性。`--compress=0` 的情況在這個選項層級下變得模糊,因此我們選擇讓 pg_receivewal 在使用 "none" 且壓縮等級不為零時返回錯誤,這意味著 `--compress` 的授權值現在是 [1,9] 而不是 [0,9]。如果將壓縮方法設定為 "gzip" 但未指定 `--compress`,pg_receivewal 將使用 zlib 的預設壓縮等級 (Z_DEFAULT_COMPRESSION)。掃描現有封存檔以尋找串流起始 LSN 的程式碼已被重構並更具擴充性。同時,將 walmethods.c 中的 "compression" 重新命名為 "compression_level",以減少與壓縮方法引入後的混淆,即使 pg_basebackup 使用的 tar 方法並非基於壓縮方法 (至少目前是這樣),而是僅基於壓縮等級 (實際上,這個區域可以進一步改進)。這是為即將到來的修補程式添加 LZ4 對 pg_receivewal 的支援做準備。作者:Georgios Kokolatos 審閱人:Michael Paquier, Jian Guo, Magnus Hagander, Dilip Kumar 討論:https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/d62bcc8b07f921bad105c7a826702c117ea7be58
修正 pg_receivewal `--compression-method` 的一些錯誤。選項名稱在其中一個錯誤訊息中不正確,並且簡短選項 'I' 在程式碼中使用,但我們並非有意這樣做。同時,修正文件以引用 "method",而不是 "level"。commit 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 不同,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
Pipeline 模式不允許使用多命令字串。... 因此,在 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 的物件來抑制崩潰。大部分相關程式碼位置已經對此保持警惕;我們只是錯過了一些。這是一個舊錯誤,所以回溯修補到所有版本。報告者: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 標誌替換為更區域化的標誌。Commit 0bead9af484c 引入了 XLOG_INCLUDE_XID 標誌,以指示 WAL 記錄包含 subXID 到 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() 移出 critical section。我們不會在此函數中修改任何共享狀態,這可能會對任何併發會話造成問題。這將使其看起來與同一結構(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 期間忽略索引。 Commit b4af70cb 簡化了 VACUUM 管理的狀態,並在過程中重構了並行 VACUUM。由於對領導程序負責的任務的確切細節感到困惑,導致程式碼使得並行 VACUUM 可能完全錯過表的部分索引。具體來說,低於 min_parallel_index_scan_size 大小臨界值的索引被錯過了。這些索引應該由領導者 (以及任何並行不安全的索引) 進行 vacuum,但根本沒有進行 vacuum。一旦堆積 TIDs 被回收用於新的堆積元組,受影響的索引很容易最終出現重複的堆積 TIDs。這具有通用症狀,可能在幾乎任何涉及索引及其表格之間結構不一致的索引損壞中看到。為了修正,請確保並行 VACUUM 領導程序對恰好低於大小臨界值的索引執行任何所需的索引 vacuum。同時記錄並行 VACUUM 的設計,包含這些低於大小臨界值的索引。目前尚不清楚有多少使用者可能受到此錯誤的影響。必須在表格上至少有三個索引才能觸發該錯誤:一個較小的索引,加上至少兩個超出大小臨界值的附加索引。只有一個附加索引的情況不會遇到麻煩,因為並行 VACUUM 代價模型要求表格上有兩個大於臨界值的索引才能應用任何並行處理。另請注意,自動 vacuum 不受影響,因為它從不使用並行處理。測試案例基於 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 錯誤:#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 安全性錯誤。 Commit b4af70cb 反轉了函數 parallel_processing_is_safe() 的回傳值,但遺漏了 amvacuumcleanup 測試。完全不支援並行清理的索引 AM 受到影響。此錯誤的實際後果不是很嚴重。Hash 索引受到影響,但由於它們僅在 hashvacuumcleanup 期間回傳區塊數量,因此可能沒有太大影響。作者:Masahiko Sawada sawada.mshk@gmail.com 討論:https://postgr.es/m/CAD21AoA-Em+aeVPmBbL_s1V-ghsJQSxYL-i3JP8nTfPiD1wjKw@mail.gmail.com 回溯修補:14-,其中出現了 commit b4af70cb。 https://git.postgresql.org/pg/commitdiff/c59278a1aa5ef2ee8a6d5d83bd987a7ce5c89e84
將另一個舊的 commit 新增到 git-blame-ignore-revs。新增另一個歷史 pgindent commit,該 commit 被 commit 8e638845 中的初始工作所遺漏。 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 不應該指向這些項目。我們試圖捕捉的這種損壞特別難以檢測,因為它通常涉及「額外的」(已損壞的)索引元組,而不是索引中缺少必需的索引元組。例如,索引頁面中的堆積 TID,如果指向堆積頁面中 LP_UNUSED 的項目,很有可能會被新的檢查捕捉到。如果 Postgres 14 具備該特定檢查,則最近修復的平行 VACUUM 錯誤(請參閱 commit 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 元組。至少自 commit 8523492d 以來一直是這種情況,該提交確立了 vacuumlazy.c 不必直接處理仍然具有元組儲存體的 DEAD 元組的原則,除非是簡單地重試修剪(以處理涉及並行交易中止的罕見邊緣情況)。順便一提,更新一些快照可擴展性工作錯過的舊符號名稱的引用(特別是 commit dc7420c2c9)。 https://git.postgresql.org/pg/commitdiff/f214960adde6028a39ba3014b1ab2b224faeefed
更新 vacuumlazy.c 中過時的參考。 commit 7ab96cf6 中的疏忽。 https://git.postgresql.org/pg/commitdiff/02f9fd129432cab565b2a3cb9f3b3a5000dfe540
Peter Eisentraut 推送
修正不正確的格式佔位符。 https://git.postgresql.org/pg/commitdiff/ef6f047d2c87b91318364341c058dd6b715951b2
pgcrypto:移除非 OpenSSL 支援。 pgcrypto 具有一些加密演算法的內部實作,作為呼叫 OpenSSL 的替代方案。這些很少被使用,因為大多數生產環境都是使用 OpenSSL 建置的。此外,維護並行的程式碼路徑會使程式碼更加複雜且難以維護。此修補程式移除了這些內部實作。現在,只有在配置 OpenSSL 支援時才會建置 pgcrypto。審閱者:Daniel Gustafsson daniel@yesql.se 討論:https://postgres.tw/message-id/flat/0b42f1df-8cba-6a30-77d7-acc241cc88c1%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/db7d1a7b0530e8cbd045744e1c75b0e63fb6916f
Heikki Linnakangas 推送
修正 lo_export 失敗時的快照參考洩漏。 如果 lo_export() 無法開啟目標檔案或寫入檔案,則會洩漏頂層交易上下文和資源擁有者中已建立的 LargeObjectDesc 及其快照。 這是相當無害的,畢竟只是一個小小的洩漏,但它會給使用者一個「快照參考洩漏」警告。 透過使用短暫的記憶體上下文和無資源擁有者,用於在一個函數呼叫中開啟和關閉的暫時性 LargeObjectDescs 來修正此問題。 最容易使用 lo_export() 在不存在的目錄上重現此洩漏,但原則上其他 lo_*
函數也可能失敗。 回溯修補到所有支援的版本。 報告者:Andrew B 審閱者:Alvaro Herrera 討論:https://postgres.tw/message-id/32bf767a-2d65-71c4-f170-122f416bab7e@iki.fi https://git.postgresql.org/pg/commitdiff/6b1b405ebfdce9da47f59d8d4144b1168709fbce
更新替代的預期輸出檔案。先前的提交新增了一個測試到 'largeobject',但忽略了替代的預期輸出檔案 'largeobject_1.source'。每個版本在建置農場動物 'hamerkop' 上失敗。 討論:https://postgres.tw/message-id/DBA08346-9962-4706-92D1-230EE5201C10@yesql.se https://git.postgresql.org/pg/commitdiff/d5ab0681bf1bbf6c0c2cba9a2d55fe8e080597b6
Robert Haas 推送
amcheck:新增額外的 TOAST 指標檢查。 擴充對 toasted 屬性的檢查,如果 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。區塊也可以根據它們是封存檔中檔案的 payload 資料的一部分還是封存檔元資料的一部分進行 "標記"。因此,例如,如果我們想取得一個 tar 檔案,修改它包含的 postgresql.auto.conf 檔案,然後 gzip 結果並寫出,我們可以使用 bbstreamer_tar_parser 來解析從伺服器收到的 tar 檔案,使用 bbstreamer_recovery_injector 來修改 postgresql.auto.conf 的內容,使用 bbstreamer_tar_archiver 來將前一步修改的檔案的 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() 需要確定應將 slot 進展到的 LSN,但這不需要我們更新 ThisTimeLineID,因為從這裡呼叫的任何程式碼都不依賴它。如果 replication slot 是 logical,pg_logical_replication_slot_advance 將呼叫 read_local_xlog_page,它會使用 ThisTimeLineID,但也會注意確保它是最新的。如果 replication slot 是 physical,則時間軸根本不會用於任何事情。在 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。以前,可以呼叫 ReadRecord() 來解析檢查點記錄,而無需初始化 ThisTimeLineID。現在,時間軸被傳遞下來,而且我不想傳遞未初始化的變數;這個變更讓我們避免了這種情況。舊的編碼似乎沒有任何我們需要擔心的實際後果,但這樣更乾淨。 - 在 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 新增的測試。buildfarm 不高興。目前還不清楚它為什麼不喜歡這些測試,但讓我們移除它們,直到我們弄清楚為止。討論: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 值,以避免觸發 assert。我們認為 NaN 值相等 (距離 0.0) 並且與所有其他值的距離無限遠。在沒有 assert 的版本中,此問題基本上是無害的 - 範圍可能會以效率較低的順序合併,但索引仍然是正確的。根據 Andreas Seltenreich 的報告。回溯到 14,在那裡引入了這個新的 BRIN opclass。報告者:Andreas Seltenreich 討論:https://postgr.es/m/87r1bw9ukm.fsf@credativ.de https://git.postgresql.org/pg/commitdiff/d91353f4b21f10417d142e6ac17a0490adae867c
將 mystreamer 變數標記為 PG_USED_FOR_ASSERTS_ONLY。 在沒有 assert 情況下建置時,會消除未使用變數的警告。 https://git.postgresql.org/pg/commitdiff/dafcf887daa472b0a49bee7e07042372bc37cee4
將 bool GiST 運算子類別新增至 btree_gist。 將 bool 運算子類別新增至 btree_gist 擴充套件,以允許在 bool 欄位上建立 GiST 索引。 單一 bool 欄位上的 GiST 索引似乎沒有特別用處,但這允許定義包含 bool 欄位的排除約束 (exclusion constraints),例如。 作者: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。 Commit 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 推送了