From 5dba897c3ad3c598a5c06cf5d11778bfc7fc7ba1 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Wed, 28 May 2025 16:35:27 +0300 Subject: [PATCH 1/4] Do not panic in WalProposerMain is safekeeper list is empty --- pgxn/neon/walproposer_pg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pgxn/neon/walproposer_pg.c b/pgxn/neon/walproposer_pg.c index 265a5561ad..5474c4d339 100644 --- a/pgxn/neon/walproposer_pg.c +++ b/pgxn/neon/walproposer_pg.c @@ -163,7 +163,8 @@ WalProposerMain(Datum main_arg) if (*wal_acceptors_list == '\0') { - elog(PANIC, "Safekeepers list is empty"); + wpg_log(WARNING, "Safekeepers list is empty"); + return; } init_walprop_config(false); From 9406cf7b20b1281c751112bbade887bbcedbd465 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 29 May 2025 10:08:14 +0300 Subject: [PATCH 2/4] Move replica_promote flag to WalproposerShmemState --- libs/walproposer/src/api_bindings.rs | 1 + libs/walproposer/src/walproposer.rs | 1 - pgxn/neon/walproposer.c | 2 +- pgxn/neon/walproposer.h | 6 +----- pgxn/neon/walproposer_pg.c | 10 +++------- 5 files changed, 6 insertions(+), 14 deletions(-) diff --git a/libs/walproposer/src/api_bindings.rs b/libs/walproposer/src/api_bindings.rs index d660602149..4d6cbae9a9 100644 --- a/libs/walproposer/src/api_bindings.rs +++ b/libs/walproposer/src/api_bindings.rs @@ -439,6 +439,7 @@ pub fn empty_shmem() -> crate::bindings::WalproposerShmemState { currentClusterSize: crate::bindings::pg_atomic_uint64 { value: 0 }, shard_ps_feedback: [empty_feedback; 128], num_shards: 0, + replica_promote: false, min_ps_feedback: empty_feedback, } } diff --git a/libs/walproposer/src/walproposer.rs b/libs/walproposer/src/walproposer.rs index c77e28e01a..4e50c21fca 100644 --- a/libs/walproposer/src/walproposer.rs +++ b/libs/walproposer/src/walproposer.rs @@ -213,7 +213,6 @@ impl Wrapper { safekeeper_connection_timeout: config.safekeeper_connection_timeout, wal_segment_size: WAL_SEGMENT_SIZE as i32, // default 16MB syncSafekeepers: config.sync_safekeepers, - replicaPromote: false, systemId: 0, pgTimeline: 1, proto_version: 3, diff --git a/pgxn/neon/walproposer.c b/pgxn/neon/walproposer.c index db63b6352f..9b2390efa0 100644 --- a/pgxn/neon/walproposer.c +++ b/pgxn/neon/walproposer.c @@ -1379,7 +1379,7 @@ ProcessPropStartPos(WalProposer *wp) * we must bail out, as clog and other non rel data is inconsistent. */ walprop_shared = wp->api.get_shmem_state(wp); - if (!wp->config->syncSafekeepers && !wp->config->replicaPromote) + if (!wp->config->syncSafekeepers && !walprop_shared->replica_promote) { /* * Basebackup LSN always points to the beginning of the record (not diff --git a/pgxn/neon/walproposer.h b/pgxn/neon/walproposer.h index 69ff5c409f..09972a2b20 100644 --- a/pgxn/neon/walproposer.h +++ b/pgxn/neon/walproposer.h @@ -391,6 +391,7 @@ typedef struct WalproposerShmemState /* last feedback from each shard */ PageserverFeedback shard_ps_feedback[MAX_SHARDS]; int num_shards; + bool replica_promote; /* aggregated feedback with min LSNs across shards */ PageserverFeedback min_ps_feedback; @@ -739,11 +740,6 @@ typedef struct WalProposerConfig */ bool syncSafekeepers; - /* - * Replica is promoted to primary - */ - bool replicaPromote; - /* Will be passed to safekeepers in greet request. */ uint64 systemId; diff --git a/pgxn/neon/walproposer_pg.c b/pgxn/neon/walproposer_pg.c index 5474c4d339..75f33515ba 100644 --- a/pgxn/neon/walproposer_pg.c +++ b/pgxn/neon/walproposer_pg.c @@ -73,7 +73,6 @@ static XLogRecPtr sentPtr = InvalidXLogRecPtr; static const walproposer_api walprop_pg; static volatile sig_atomic_t got_SIGUSR2 = false; static bool reported_sigusr2 = false; -static bool start_as_replica = false; static XLogRecPtr standby_flush_lsn = InvalidXLogRecPtr; static XLogRecPtr standby_apply_lsn = InvalidXLogRecPtr; @@ -124,7 +123,6 @@ init_walprop_config(bool syncSafekeepers) walprop_config.safekeeper_connection_timeout = wal_acceptor_connection_timeout; walprop_config.wal_segment_size = wal_segment_size; walprop_config.syncSafekeepers = syncSafekeepers; - walprop_config.replicaPromote = start_as_replica; if (!syncSafekeepers) walprop_config.systemId = GetSystemIdentifier(); else @@ -151,8 +149,6 @@ WalProposerSync(int argc, char *argv[]) WalProposerStart(wp); } -#define GUC_POLL_DELAY 100000L // 0.1 sec - /* * WAL proposer bgworker entry point. */ @@ -310,8 +306,8 @@ assign_neon_safekeepers(const char *newval, void *extra) char *newval_copy; char *oldval; - if (newval && *newval == '\0') - start_as_replica = true; + if (newval && *newval != '\0' && walprop_shared && RecoveryInProgress()) + walprop_shared->replica_promote = true; if (!am_walproposer) return; @@ -519,6 +515,7 @@ walprop_register_bgworker(void) bgw.bgw_restart_time = 1; bgw.bgw_notify_pid = 0; bgw.bgw_main_arg = (Datum) 0; + RegisterBackgroundWorker(&bgw); } @@ -2013,7 +2010,6 @@ walprop_pg_get_redo_start_lsn(WalProposer *wp) return GetRedoStartLsn(); } - static bool walprop_pg_strong_random(WalProposer *wp, void *buf, size_t len) { From 6ed73517abf321e621ae4e2df24fa747204be155 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 29 May 2025 16:22:01 +0300 Subject: [PATCH 3/4] Add check that shared mmeory was not detached --- pgxn/neon/walproposer_pg.c | 3 ++- vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 8 ++++---- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pgxn/neon/walproposer_pg.c b/pgxn/neon/walproposer_pg.c index 75f33515ba..b3910aa9e7 100644 --- a/pgxn/neon/walproposer_pg.c +++ b/pgxn/neon/walproposer_pg.c @@ -35,6 +35,7 @@ #include "storage/proc.h" #include "storage/ipc.h" #include "storage/lwlock.h" +#include "storage/pg_shmem.h" #include "storage/shmem.h" #include "storage/spin.h" #include "tcop/tcopprot.h" @@ -306,7 +307,7 @@ assign_neon_safekeepers(const char *newval, void *extra) char *newval_copy; char *oldval; - if (newval && *newval != '\0' && walprop_shared && RecoveryInProgress()) + if (newval && *newval != '\0' && UsedShmemSegAddr && walprop_shared && RecoveryInProgress()) walprop_shared->replica_promote = true; if (!am_walproposer) diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 78c1568afb..9392ac02ce 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 78c1568afbbacc1604ac5e5cc2ebc9b7ed0cfde9 +Subproject commit 9392ac02ce8b96a4a4eb766552c8aa85efc40939 diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index f2cd317375..46398092e0 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit f2cd31737536218c39c66f920ff62f72c51d0d61 +Subproject commit 46398092e0817fbb1d846714103ca2c6c0264158 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 3d6896afaa..3da009ed1a 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 3d6896afaa89c05b693e9a29275001b801b8b479 +Subproject commit 3da009ed1a80fe57c5feb521e41a5d017affeb78 diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 28b88cfedf..69613e831a 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 28b88cfedf9a6028cf7ea32a80ea15a9bf971803 +Subproject commit 69613e831a6cf8b2d9e547ce39a583fa1b272994 diff --git a/vendor/revisions.json b/vendor/revisions.json index 6ad518db0a..43223ecd27 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,18 +1,18 @@ { "v17": [ "17.5", - "28b88cfedf9a6028cf7ea32a80ea15a9bf971803" + "69613e831a6cf8b2d9e547ce39a583fa1b272994" ], "v16": [ "16.9", - "3d6896afaa89c05b693e9a29275001b801b8b479" + "3da009ed1a80fe57c5feb521e41a5d017affeb78" ], "v15": [ "15.13", - "f2cd31737536218c39c66f920ff62f72c51d0d61" + "46398092e0817fbb1d846714103ca2c6c0264158" ], "v14": [ "14.18", - "78c1568afbbacc1604ac5e5cc2ebc9b7ed0cfde9" + "9392ac02ce8b96a4a4eb766552c8aa85efc40939" ] } From d0dce0c995eb18fffd0bf4f89723d9d1ae8c0fce Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 29 May 2025 18:17:48 +0300 Subject: [PATCH 4/4] Bump Postgre version --- vendor/postgres-v14 | 2 +- vendor/postgres-v15 | 2 +- vendor/postgres-v16 | 2 +- vendor/postgres-v17 | 2 +- vendor/revisions.json | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vendor/postgres-v14 b/vendor/postgres-v14 index 9392ac02ce..b6eece3f52 160000 --- a/vendor/postgres-v14 +++ b/vendor/postgres-v14 @@ -1 +1 @@ -Subproject commit 9392ac02ce8b96a4a4eb766552c8aa85efc40939 +Subproject commit b6eece3f528fdc380e6e2c13381434470606787f diff --git a/vendor/postgres-v15 b/vendor/postgres-v15 index 46398092e0..20f8491225 160000 --- a/vendor/postgres-v15 +++ b/vendor/postgres-v15 @@ -1 +1 @@ -Subproject commit 46398092e0817fbb1d846714103ca2c6c0264158 +Subproject commit 20f8491225f86bdedbc986e9a69ebafb1c94aa99 diff --git a/vendor/postgres-v16 b/vendor/postgres-v16 index 3da009ed1a..77c63bfebf 160000 --- a/vendor/postgres-v16 +++ b/vendor/postgres-v16 @@ -1 +1 @@ -Subproject commit 3da009ed1a80fe57c5feb521e41a5d017affeb78 +Subproject commit 77c63bfebff5c833682cc2654e2191fec4d5b24e diff --git a/vendor/postgres-v17 b/vendor/postgres-v17 index 69613e831a..32d704d965 160000 --- a/vendor/postgres-v17 +++ b/vendor/postgres-v17 @@ -1 +1 @@ -Subproject commit 69613e831a6cf8b2d9e547ce39a583fa1b272994 +Subproject commit 32d704d965d8ad632c0ddef64b45a5ba95536442 diff --git a/vendor/revisions.json b/vendor/revisions.json index 43223ecd27..6410aab877 100644 --- a/vendor/revisions.json +++ b/vendor/revisions.json @@ -1,18 +1,18 @@ { "v17": [ "17.5", - "69613e831a6cf8b2d9e547ce39a583fa1b272994" + "32d704d965d8ad632c0ddef64b45a5ba95536442" ], "v16": [ "16.9", - "3da009ed1a80fe57c5feb521e41a5d017affeb78" + "77c63bfebff5c833682cc2654e2191fec4d5b24e" ], "v15": [ "15.13", - "46398092e0817fbb1d846714103ca2c6c0264158" + "20f8491225f86bdedbc986e9a69ebafb1c94aa99" ], "v14": [ "14.18", - "9392ac02ce8b96a4a4eb766552c8aa85efc40939" + "b6eece3f528fdc380e6e2c13381434470606787f" ] }