From 4ae3b3ffaac74d6bd39227be2f69e6e805f5617c Mon Sep 17 00:00:00 2001 From: Vignesh C Date: Tue, 28 Jul 2026 15:52:30 +0530 Subject: [PATCH v1] Prevent concurrent ALTER SEQUENCE from racing with pg_dump pg_dump retrieves each sequence's current last_value and is_called via pg_get_sequence_data(), which opened the sequence with AccessShareLock. Since AccessShareLock does not conflict with ALTER SEQUENCE's ShareRowExclusiveLock, a concurrent ALTER SEQUENCE could rewrite the sequence after it had been opened but before its on-disk tuple was read, resulting in a "could not read blocks" failure. Acquire a RowExclusiveLock instead, so that ALTER SEQUENCE cannot rewrite the sequence until pg_get_sequence_data() has completed the read. --- src/backend/commands/sequence.c | 8 ++++++-- src/test/subscription/t/036_sequences.pl | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 551667650ba..0c7fc5e4260 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -1811,7 +1811,11 @@ pg_get_sequence_data(PG_FUNCTION_ARGS) TupleDescFinalize(resultTupleDesc); resultTupleDesc = BlessTupleDesc(resultTupleDesc); - seqrel = try_relation_open(relid, AccessShareLock); + /* + * Use RowExclusiveLock to prevent a concurrent ALTER SEQUENCE from + * rewriting the sequence before we read its on-disk tuple. + */ + seqrel = try_relation_open(relid, RowExclusiveLock); /* * Return all NULLs for missing sequences, sequences for which we lack @@ -1841,7 +1845,7 @@ pg_get_sequence_data(PG_FUNCTION_ARGS) memset(isnull, true, sizeof(isnull)); if (seqrel) - relation_close(seqrel, AccessShareLock); + relation_close(seqrel, RowExclusiveLock); resultHeapTuple = heap_form_tuple(resultTupleDesc, values, isnull); result = HeapTupleGetDatum(resultHeapTuple); diff --git a/src/test/subscription/t/036_sequences.pl b/src/test/subscription/t/036_sequences.pl index dd6fa515df3..8dbb4df42a1 100644 --- a/src/test/subscription/t/036_sequences.pl +++ b/src/test/subscription/t/036_sequences.pl @@ -267,7 +267,7 @@ $node_publisher->poll_query_until( SELECT EXISTS ( SELECT 1 FROM pg_locks WHERE relation = 'regress_s3'::regclass - AND mode = 'AccessShareLock' + AND mode = 'RowExclusiveLock' AND NOT granted); )) or die "timed out waiting for sequencesync worker to block on publisher"; -- 2.50.1 (Apple Git-155)