Clamp result of MultiXactMemberFreezeThreshold
authorHeikki Linnakangas <[email protected]>
Thu, 13 Jun 2024 16:01:30 +0000 (19:01 +0300)
committerHeikki Linnakangas <[email protected]>
Thu, 13 Jun 2024 16:03:00 +0000 (19:03 +0300)
The purpose of the function is to reduce the effective
autovacuum_multixact_freeze_max_age if the multixact members SLRU is
approaching wraparound, to make multixid freezing more aggressive.
The returned value should therefore never be greater than plain
autovacuum_multixact_freeze_max_age.

Reviewed-by: Robert Haas
Discussion: https://www.postgresql.org/message-id/85fb354c-f89f-4d47-b3a2-3cbd461c90a3@iki.fi
Backpatch-through: 12, all supported versions

src/backend/access/transam/multixact.c

index 0d7fd1640d36ca62f1711edf506e3e496025ed42..479bd932e938e6cfd6fdebc5dc883746fb43a680 100644 (file)
@@ -2826,6 +2826,7 @@ MultiXactMemberFreezeThreshold(void)
    uint32      multixacts;
    uint32      victim_multixacts;
    double      fraction;
+   int         result;
 
    /* If we can't determine member space utilization, assume the worst. */
    if (!ReadMultiXactCounts(&multixacts, &members))
@@ -2847,7 +2848,13 @@ MultiXactMemberFreezeThreshold(void)
    /* fraction could be > 1.0, but lowest possible freeze age is zero */
    if (victim_multixacts > multixacts)
        return 0;
-   return multixacts - victim_multixacts;
+   result = multixacts - victim_multixacts;
+
+   /*
+    * Clamp to autovacuum_multixact_freeze_max_age, so that we never make
+    * autovacuum less aggressive than it would otherwise be.
+    */
+   return Min(result, autovacuum_multixact_freeze_max_age);
 }
 
 typedef struct mxtruncinfo