From b00a0096bfbfa5bbd72da3a20ff6eb9841d8ef20 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Tue, 22 Jul 2025 20:50:26 +0300 Subject: [PATCH] Reintialize page in allocNewBuffer only when buffer is returned (#12399) ## Problem See https://github.com/neondatabase/neon/issues/12387 `allocNewBuffer` initialise page with zeros but not always return it because of parity checks. In case of wrong parity the page is rejected and as a result we have dirty page with zero LSN, which cause assertion failure on neon_write when page is evicted from shared buffers. ## Summary of changes Perform, page initialisation in `allocNewBuffer` only when buffer is returned (parity check is passed). Postgres PRs: https://github.com/neondatabase/postgres/pull/661 https://github.com/neondatabase/postgres/pull/662 https://github.com/neondatabase/postgres/pull/663 https://github.com/neondatabase/postgres/pull/664 --------- Co-authored-by: Konstantin Knizhnik Co-authored-by: Kosntantin Knizhnik --- test_runner/sql_regress/expected/neon-spgist.out | 9 +++++++++ test_runner/sql_regress/parallel_schedule | 3 ++- test_runner/sql_regress/sql/neon-spgist.sql | 10 ++++++++++ vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 8 ++++---- 8 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 test_runner/sql_regress/expected/neon-spgist.out create mode 100644 test_runner/sql_regress/sql/neon-spgist.sql diff --git a/test_runner/sql_regress/expected/neon-spgist.out b/test_runner/sql_regress/expected/neon-spgist.out new file mode 100644 index 0000000000..5982084109 --- /dev/null +++ b/test_runner/sql_regress/expected/neon-spgist.out @@ -0,0 +1,9 @@ +-- Test unlogged build of SPGIST index (no "Page evicted with zero LSN" error) +create table spgist_point_tbl(id int4, p point); +create index spgist_point_idx on spgist_point_tbl using spgist(p) with (fillfactor = 25); +insert into spgist_point_tbl (id, p) select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; +vacuum spgist_point_tbl; +insert into spgist_point_tbl (id, p) select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; +checkpoint; diff --git a/test_runner/sql_regress/parallel_schedule b/test_runner/sql_regress/parallel_schedule index 0ce9f0e28f..d724c750ff 100644 --- a/test_runner/sql_regress/parallel_schedule +++ b/test_runner/sql_regress/parallel_schedule @@ -9,5 +9,6 @@ test: neon-rel-truncate test: neon-clog test: neon-test-utils test: neon-vacuum-full -test: neon-event-triggers test: neon-subxacts +test: neon-spgist +test: neon-event-triggers diff --git a/test_runner/sql_regress/sql/neon-spgist.sql b/test_runner/sql_regress/sql/neon-spgist.sql new file mode 100644 index 0000000000..b26b692ff7 --- /dev/null +++ b/test_runner/sql_regress/sql/neon-spgist.sql @@ -0,0 +1,10 @@ +-- Test unlogged build of SPGIST index (no "Page evicted with zero LSN" error) +create table spgist_point_tbl(id int4, p point); +create index spgist_point_idx on spgist_point_tbl using spgist(p) with (fillfactor = 25); +insert into spgist_point_tbl (id, p) select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) select g, point(g*10, g*10) from generate_series(1, 10000) g; +insert into spgist_point_tbl (id, p) select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; + +vacuum spgist_point_tbl; +insert into spgist_point_tbl (id, p) select g+100000, point(g*10+1, g*10+1) from generate_series(1, 10000) g; +checkpoint; diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 4cacada8bd..c9f9fdd011 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 4cacada8bde7f6424751a0727a657783c6a1d20b +Subproject commit c9f9fdd0113b52c0bd535afdb09d3a543aeee25f diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index e5ee23d998..aaaeff2550 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit e5ee23d99874ea9f5b62f8acc7d076162ae95d6c +Subproject commit aaaeff2550d5deba58847f112af9b98fa3a58b00 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index ad2b69b582..9b9cb4b3e3 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit ad2b69b58230290fc44c08fbe0c97981c64f6c7d +Subproject commit 9b9cb4b3e33347aea8f61e606bb6569979516de5 diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index ba750903a9..fa1788475e 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit ba750903a90dded8098f2f56d0b2a9012e6166af +Subproject commit fa1788475e3146cc9c7c6a1b74f48fd296898fcd diff --git a/vendor/revisions.json b/vendor/revisions.json index d62f8e5736..7212c9f7c7 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,18 +1,18 @@ { "v17": [ "17.5", - "ba750903a90dded8098f2f56d0b2a9012e6166af" + "fa1788475e3146cc9c7c6a1b74f48fd296898fcd" ], "v16": [ "16.9", - "ad2b69b58230290fc44c08fbe0c97981c64f6c7d" + "9b9cb4b3e33347aea8f61e606bb6569979516de5" ], "v15": [ "15.13", - "e5ee23d99874ea9f5b62f8acc7d076162ae95d6c" + "aaaeff2550d5deba58847f112af9b98fa3a58b00" ], "v14": [ "14.18", - "4cacada8bde7f6424751a0727a657783c6a1d20b" + "c9f9fdd0113b52c0bd535afdb09d3a543aeee25f" ] }