mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Change unit of idle_replication_slot_timeout to seconds.
Previously, the idle_replication_slot_timeout parameter used minutes as its unit, based on the assumption that values would typically exceed one minute in production environments. However, this caused unexpected behavior: specifying a value below 30 seconds would round down to 0, effectively disabling the timeout. This could be surprising to users. To allow finer-grained control and avoid such confusion, this commit changes the unit of idle_replication_slot_timeout to seconds. Larger values can still be specified easily using standard time suffixes, for example, '24h' for 24 hours. Back-patch to v18 where idle_replication_slot_timeout was added. Reported-by: Gunnar Morling <gunnar.morling@googlemail.com> Author: Fujii Masao <masao.fujii@gmail.com> Reviewed-by: Laurenz Albe <laurenz.albe@cybertec.at> Reviewed-by: David G. Johnston <david.g.johnston@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/CADGJaX_0+FTguWpNSpgVWYQP_7MhoO0D8=cp4XozSQgaZ40Odw@mail.gmail.com Backpatch-through: 18
This commit is contained in:
@@ -154,7 +154,7 @@ int max_replication_slots = 10; /* the maximum number of replication
|
||||
* Invalidate replication slots that have remained idle longer than this
|
||||
* duration; '0' disables it.
|
||||
*/
|
||||
int idle_replication_slot_timeout_mins = 0;
|
||||
int idle_replication_slot_timeout_secs = 0;
|
||||
|
||||
/*
|
||||
* This GUC lists streaming replication standby server slot names that
|
||||
@@ -1612,13 +1612,10 @@ ReportSlotInvalidation(ReplicationSlotInvalidationCause cause,
|
||||
|
||||
case RS_INVAL_IDLE_TIMEOUT:
|
||||
{
|
||||
int minutes = slot_idle_seconds / SECS_PER_MINUTE;
|
||||
int secs = slot_idle_seconds % SECS_PER_MINUTE;
|
||||
|
||||
/* translator: %s is a GUC variable name */
|
||||
appendStringInfo(&err_detail, _("The slot's idle time of %dmin %02ds exceeds the configured \"%s\" duration of %dmin."),
|
||||
minutes, secs, "idle_replication_slot_timeout",
|
||||
idle_replication_slot_timeout_mins);
|
||||
appendStringInfo(&err_detail, _("The slot's idle time of %lds exceeds the configured \"%s\" duration of %ds."),
|
||||
slot_idle_seconds, "idle_replication_slot_timeout",
|
||||
idle_replication_slot_timeout_secs);
|
||||
/* translator: %s is a GUC variable name */
|
||||
appendStringInfo(&err_hint, _("You might need to increase \"%s\"."),
|
||||
"idle_replication_slot_timeout");
|
||||
@@ -1656,7 +1653,7 @@ ReportSlotInvalidation(ReplicationSlotInvalidationCause cause,
|
||||
static inline bool
|
||||
CanInvalidateIdleSlot(ReplicationSlot *s)
|
||||
{
|
||||
return (idle_replication_slot_timeout_mins != 0 &&
|
||||
return (idle_replication_slot_timeout_secs != 0 &&
|
||||
!XLogRecPtrIsInvalid(s->data.restart_lsn) &&
|
||||
s->inactive_since > 0 &&
|
||||
!(RecoveryInProgress() && s->data.synced));
|
||||
@@ -1717,9 +1714,9 @@ DetermineSlotInvalidationCause(uint32 possible_causes, ReplicationSlot *s,
|
||||
if (CanInvalidateIdleSlot(s))
|
||||
{
|
||||
/*
|
||||
* We simulate the invalidation due to idle_timeout as the minimum
|
||||
* time idle time is one minute which makes tests take a long
|
||||
* time.
|
||||
* Simulate the invalidation due to idle_timeout to test the
|
||||
* timeout behavior promptly, without waiting for it to trigger
|
||||
* naturally.
|
||||
*/
|
||||
#ifdef USE_INJECTION_POINTS
|
||||
if (IS_INJECTION_POINT_ATTACHED("slot-timeout-inval"))
|
||||
@@ -1734,7 +1731,7 @@ DetermineSlotInvalidationCause(uint32 possible_causes, ReplicationSlot *s,
|
||||
* idle_replication_slot_timeout GUC.
|
||||
*/
|
||||
if (TimestampDifferenceExceedsSeconds(s->inactive_since, now,
|
||||
idle_replication_slot_timeout_mins * SECS_PER_MINUTE))
|
||||
idle_replication_slot_timeout_secs))
|
||||
{
|
||||
*inactive_since = s->inactive_since;
|
||||
return RS_INVAL_IDLE_TIMEOUT;
|
||||
|
||||
Reference in New Issue
Block a user