mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	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/20231027.115759.2206827438943188717.horikyota.ntt@gmail.com
This commit is contained in:
		@@ -2063,6 +2063,25 @@ check_wal_segment_size(int *newval, void **extra, GucSource source)
 | 
				
			|||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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
 | 
					 * At a checkpoint, how many WAL segments to recycle as preallocated future
 | 
				
			||||||
 * XLOG segments? Returns the highest segment that should be preallocated.
 | 
					 * XLOG segments? Returns the highest segment that should be preallocated.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1424,18 +1424,12 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause,
 | 
				
			|||||||
		SpinLockRelease(&s->mutex);
 | 
							SpinLockRelease(&s->mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * The logical replication slots shouldn't be invalidated as
 | 
							 * The logical replication slots shouldn't be invalidated as GUC
 | 
				
			||||||
		 * max_slot_wal_keep_size GUC is set to -1 during the upgrade.
 | 
							 * 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
 | 
				
			||||||
		 * The following is just a sanity check.
 | 
							 * invalidated before the upgrade.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (*invalidated && SlotIsLogical(s) && IsBinaryUpgrade)
 | 
							Assert(!(*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"));
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (active_pid != 0)
 | 
							if (active_pid != 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2845,7 +2845,7 @@ struct config_int ConfigureNamesInt[] =
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		&max_slot_wal_keep_size_mb,
 | 
							&max_slot_wal_keep_size_mb,
 | 
				
			||||||
		-1, -1, MAX_KILOBYTES,
 | 
							-1, -1, MAX_KILOBYTES,
 | 
				
			||||||
		NULL, NULL, NULL
 | 
							check_max_slot_wal_keep_size, NULL, NULL
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 void assign_maintenance_io_concurrency(int newval, void *extra);
 | 
				
			||||||
extern bool check_max_connections(int *newval, void **extra, GucSource source);
 | 
					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_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 void assign_max_wal_size(int newval, void *extra);
 | 
				
			||||||
extern bool check_max_worker_processes(int *newval, void **extra,
 | 
					extern bool check_max_worker_processes(int *newval, void **extra,
 | 
				
			||||||
									   GucSource source);
 | 
														   GucSource source);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user