diff options
author | Amit Kapila | 2023-11-10 03:15:01 +0000 |
---|---|---|
committer | Amit Kapila | 2023-11-10 03:15:01 +0000 |
commit | 8bfb231b43d7f6058041483f2b823dd52eac7bf8 (patch) | |
tree | 311e53b4233a5db636bc0170d237622dabb5e3d5 | |
parent | 5ba1ac99a8d8623604d3152be8fd9a201ba5240b (diff) |
Prohibit max_slot_wal_keep_size to value other than -1 during upgrade.
We don't want existing slots in the old cluster to get invalidated during
the upgrade. During an upgrade, we set this variable to -1 via the command
line in an attempt to prevent such invalidations, but users have ways to
override it. This patch ensures the value is not overridden by the user.
Author: Kyotaro Horiguchi
Reviewed-by: Peter Smith, Alvaro Herrera
Discussion: http://postgr.es/m/[email protected]
-rw-r--r-- | src/backend/access/transam/xlog.c | 19 | ||||
-rw-r--r-- | src/backend/replication/slot.c | 16 | ||||
-rw-r--r-- | src/backend/utils/misc/guc_tables.c | 2 | ||||
-rw-r--r-- | src/include/utils/guc_hooks.h | 2 |
4 files changed, 27 insertions, 12 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b541be8eec..1159dff1a6 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2064,6 +2064,25 @@ check_wal_segment_size(int *newval, void **extra, GucSource source) } /* + * GUC check_hook for max_slot_wal_keep_size + * + * We don't allow the value of max_slot_wal_keep_size other than -1 during the + * binary upgrade. See start_postmaster() in pg_upgrade for more details. + */ +bool +check_max_slot_wal_keep_size(int *newval, void **extra, GucSource source) +{ + if (IsBinaryUpgrade && *newval != -1) + { + GUC_check_errdetail("\"%s\" must be set to -1 during binary upgrade mode.", + "max_slot_wal_keep_size"); + return false; + } + + return true; +} + +/* * At a checkpoint, how many WAL segments to recycle as preallocated future * XLOG segments? Returns the highest segment that should be preallocated. */ diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 99823df3c7..781aa43cc4 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -1424,18 +1424,12 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, SpinLockRelease(&s->mutex); /* - * The logical replication slots shouldn't be invalidated as - * max_slot_wal_keep_size GUC is set to -1 during the upgrade. - * - * The following is just a sanity check. + * The logical replication slots shouldn't be invalidated as GUC + * max_slot_wal_keep_size is set to -1 during the binary upgrade. See + * check_old_cluster_for_valid_slots() where we ensure that no + * invalidated before the upgrade. */ - if (*invalidated && SlotIsLogical(s) && IsBinaryUpgrade) - { - ereport(ERROR, - errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("replication slots must not be invalidated during the upgrade"), - errhint("\"max_slot_wal_keep_size\" must be set to -1 during the upgrade")); - } + Assert(!(*invalidated && SlotIsLogical(s) && IsBinaryUpgrade)); if (active_pid != 0) { diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index beed72abbd..b764ef6998 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -2845,7 +2845,7 @@ struct config_int ConfigureNamesInt[] = }, &max_slot_wal_keep_size_mb, -1, -1, MAX_KILOBYTES, - NULL, NULL, NULL + check_max_slot_wal_keep_size, NULL, NULL }, { diff --git a/src/include/utils/guc_hooks.h b/src/include/utils/guc_hooks.h index 2a191830a8..3d74483f44 100644 --- a/src/include/utils/guc_hooks.h +++ b/src/include/utils/guc_hooks.h @@ -84,6 +84,8 @@ extern bool check_maintenance_io_concurrency(int *newval, void **extra, extern void assign_maintenance_io_concurrency(int newval, void *extra); extern bool check_max_connections(int *newval, void **extra, GucSource source); extern bool check_max_wal_senders(int *newval, void **extra, GucSource source); +extern bool check_max_slot_wal_keep_size(int *newval, void **extra, + GucSource source); extern void assign_max_wal_size(int newval, void *extra); extern bool check_max_worker_processes(int *newval, void **extra, GucSource source); |