diff options
author | Michael Paquier <michael@paquier.xyz> | 2024-02-22 08:40:40 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2024-02-22 08:40:40 +0900 |
commit | 943f7ae1c8693cf3ea59d103aaf9590ea062fb9c (patch) | |
tree | bfcb1e6e45ec5516a915bb87dcceb0b805723fb1 /src/backend | |
parent | 28f3915b73f75bd1b50ba070f56b34241fe53fd1 (diff) |
Add lookup table for replication slot conflict reasons
This commit switches the handling of the conflict cause strings for
replication slots to use a table rather than being explicitly listed,
using a C99-designated initializer syntax for the array elements. This
makes the whole more readable while easing future maintenance with less
areas to update when adding a new conflict reason.
This is similar to 74a730631065, but the scale of the change is smaller
as there are less conflict causes than LWLock builtin tranche names.
Author: Bharath Rupireddy
Reviewed-by: Jelte Fennema-Nio
Discussion: https://postgr.es/m/CALj2ACUxSLA91QGFrJsWNKs58KXb1C03mbuwKmzqqmoAKLwJaw@mail.gmail.com
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/replication/slot.c | 45 | ||||
-rw-r--r-- | src/backend/replication/slotfuncs.c | 24 |
2 files changed, 38 insertions, 31 deletions
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index a142855bd32..233652b4799 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -77,6 +77,22 @@ typedef struct ReplicationSlotOnDisk ReplicationSlotPersistentData slotdata; } ReplicationSlotOnDisk; +/* + * Lookup table for slot invalidation causes. + */ +const char *const SlotInvalidationCauses[] = { + [RS_INVAL_NONE] = "none", + [RS_INVAL_WAL_REMOVED] = "wal_removed", + [RS_INVAL_HORIZON] = "rows_removed", + [RS_INVAL_WAL_LEVEL] = "wal_level_insufficient", +}; + +/* Maximum number of invalidation causes */ +#define RS_INVAL_MAX_CAUSES RS_INVAL_WAL_LEVEL + +StaticAssertDecl(lengthof(SlotInvalidationCauses) == (RS_INVAL_MAX_CAUSES + 1), + "array length mismatch"); + /* size of version independent data */ #define ReplicationSlotOnDiskConstantSize \ offsetof(ReplicationSlotOnDisk, slotdata) @@ -2290,23 +2306,26 @@ RestoreSlotFromDisk(const char *name) } /* - * Maps the pg_replication_slots.conflict_reason text value to - * ReplicationSlotInvalidationCause enum value + * Maps a conflict reason for a replication slot to + * ReplicationSlotInvalidationCause. */ ReplicationSlotInvalidationCause -GetSlotInvalidationCause(char *conflict_reason) +GetSlotInvalidationCause(const char *conflict_reason) { + ReplicationSlotInvalidationCause cause; + bool found PG_USED_FOR_ASSERTS_ONLY = false; + Assert(conflict_reason); - if (strcmp(conflict_reason, SLOT_INVAL_WAL_REMOVED_TEXT) == 0) - return RS_INVAL_WAL_REMOVED; - else if (strcmp(conflict_reason, SLOT_INVAL_HORIZON_TEXT) == 0) - return RS_INVAL_HORIZON; - else if (strcmp(conflict_reason, SLOT_INVAL_WAL_LEVEL_TEXT) == 0) - return RS_INVAL_WAL_LEVEL; - else - Assert(0); + for (cause = RS_INVAL_NONE; cause <= RS_INVAL_MAX_CAUSES; cause++) + { + if (strcmp(SlotInvalidationCauses[cause], conflict_reason) == 0) + { + found = true; + break; + } + } - /* Keep compiler quiet */ - return RS_INVAL_NONE; + Assert(found); + return cause; } diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index d2fa5e669a3..c108bf9608f 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -413,24 +413,12 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) nulls[i++] = true; else { - switch (slot_contents.data.invalidated) - { - case RS_INVAL_NONE: - nulls[i++] = true; - break; - - case RS_INVAL_WAL_REMOVED: - values[i++] = CStringGetTextDatum(SLOT_INVAL_WAL_REMOVED_TEXT); - break; - - case RS_INVAL_HORIZON: - values[i++] = CStringGetTextDatum(SLOT_INVAL_HORIZON_TEXT); - break; - - case RS_INVAL_WAL_LEVEL: - values[i++] = CStringGetTextDatum(SLOT_INVAL_WAL_LEVEL_TEXT); - break; - } + ReplicationSlotInvalidationCause cause = slot_contents.data.invalidated; + + if (cause == RS_INVAL_NONE) + nulls[i++] = true; + else + values[i++] = CStringGetTextDatum(SlotInvalidationCauses[cause]); } values[i++] = BoolGetDatum(slot_contents.data.failover); |