public inbox for [email protected]
help / color / mirror / Atom feedFrom: Jeff Davis <[email protected]>
To: [email protected]
Cc: Andrey Borodin <[email protected]>
Cc: Mark Dilger <[email protected]>
Subject: GUC parameter ACLs and physical walsender
Date: Wed, 22 Apr 2026 12:18:48 -0700
Message-ID: <[email protected]> (raw)
Moving discussion from:
https://www.postgresql.org/message-id/[email protected]
because this is a separate issue. If you specify a SUSET GUC setting
when connecting as non-superuser for physical replication:
PGOPTIONS="-c wal_compression=on" \
pg_receivewal -D archive -U repl
you get:
FATAL: cannot read pg_class without having selected a database
but only if you connect immediately after the server starts. If you do
something else first, like an ordinary connection and "SELECT 1", and
then start the replication connection, you get (after commit
dbf217c1c7):
FATAL: permission denied to set parameter "wal_compression"
as expected. The problem goes back to a0ffa885e47.
It seems to be because pg_parameter_acl is not nailed in cache. I
attached a quick patch to do so (which turns it into the "expected
permission denied" error). But I'm not sure if that's the right fix, or
if it would be a complete fix. I also don't think that would be
backportable, but perhaps?
Regards,
Jeff Davis
Attachments:
[text/x-patch] v1-0001-Nail-pg_parameter_acl-in-relcache.patch (4.4K, 2-v1-0001-Nail-pg_parameter_acl-in-relcache.patch)
download | inline diff:
From 5cf20081de5172ec9a1d768b0584d40bfbf9cb12 Mon Sep 17 00:00:00 2001
From: Jeff Davis <[email protected]>
Date: Wed, 22 Apr 2026 11:50:12 -0700
Subject: [PATCH v1] Nail pg_parameter_acl in relcache.
Previously, a parameter specified in the startup packet for a physical
replication connection could encounter an error trying to perform an
ACL check for the setting.
---
src/backend/utils/cache/catcache.c | 2 ++
src/backend/utils/cache/relcache.c | 19 ++++++++++++++-----
src/include/catalog/pg_parameter_acl.h | 2 +-
3 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index a8e7bf649d2..6fb35dedf95 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -1335,6 +1335,8 @@ IndexScanOK(CatCache *cache)
case AUTHOID:
case AUTHMEMMEMROLE:
case DATABASEOID:
+ case PARAMETERACLNAME:
+ case PARAMETERACLOID:
/*
* Protect authentication lookups occurring before relcache has
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index e19f0d3e51c..10d481518eb 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -56,6 +56,7 @@
#include "catalog/pg_proc.h"
#include "catalog/pg_publication.h"
#include "catalog/pg_rewrite.h"
+#include "catalog/pg_parameter_acl.h"
#include "catalog/pg_shseclabel.h"
#include "catalog/pg_statistic_ext.h"
#include "catalog/pg_subscription.h"
@@ -120,6 +121,7 @@ static const FormData_pg_attribute Desc_pg_auth_members[Natts_pg_auth_members] =
static const FormData_pg_attribute Desc_pg_index[Natts_pg_index] = {Schema_pg_index};
static const FormData_pg_attribute Desc_pg_shseclabel[Natts_pg_shseclabel] = {Schema_pg_shseclabel};
static const FormData_pg_attribute Desc_pg_subscription[Natts_pg_subscription] = {Schema_pg_subscription};
+static const FormData_pg_attribute Desc_pg_parameter_acl[Natts_pg_parameter_acl] = {Schema_pg_parameter_acl};
/*
* Hash tables that index the relation cache
@@ -4074,8 +4076,10 @@ RelationCacheInitializePhase2(void)
Natts_pg_shseclabel, Desc_pg_shseclabel);
formrdesc("pg_subscription", SubscriptionRelation_Rowtype_Id, true,
Natts_pg_subscription, Desc_pg_subscription);
+ formrdesc("pg_parameter_acl", ParameterAclRelation_Rowtype_Id, true,
+ Natts_pg_parameter_acl, Desc_pg_parameter_acl);
-#define NUM_CRITICAL_SHARED_RELS 5 /* fix if you change list above */
+#define NUM_CRITICAL_SHARED_RELS 6 /* fix if you change list above */
}
MemoryContextSwitchTo(oldcxt);
@@ -4196,9 +4200,10 @@ RelationCacheInitializePhase3(void)
* non-shared catalogs at all. Autovacuum calls InitPostgres with a
* database OID, so it instead depends on DatabaseOidIndexId. We also
* need to nail up some indexes on pg_authid and pg_auth_members for use
- * during client authentication. SharedSecLabelObjectIndexId isn't
- * critical for the core system, but authentication hooks might be
- * interested in it.
+ * during client authentication. We need indexes on pg_parameter_acl for
+ * ACL checks on settings specified in the startup packet for a physical
+ * replication connection. SharedSecLabelObjectIndexId isn't critical for
+ * the core system, but authentication hooks might be interested in it.
*/
if (!criticalSharedRelcachesBuilt)
{
@@ -4214,8 +4219,12 @@ RelationCacheInitializePhase3(void)
AuthMemRelationId);
load_critical_index(SharedSecLabelObjectIndexId,
SharedSecLabelRelationId);
+ load_critical_index(ParameterAclParnameIndexId,
+ ParameterAclRelationId);
+ load_critical_index(ParameterAclOidIndexId,
+ ParameterAclRelationId);
-#define NUM_CRITICAL_SHARED_INDEXES 6 /* fix if you change list above */
+#define NUM_CRITICAL_SHARED_INDEXES 8 /* fix if you change list above */
criticalSharedRelcachesBuilt = true;
}
diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h
index a26b05a9bf2..902e2666069 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -29,7 +29,7 @@
*/
BEGIN_CATALOG_STRUCT
-CATALOG(pg_parameter_acl,6243,ParameterAclRelationId) BKI_SHARED_RELATION
+CATALOG(pg_parameter_acl,6243,ParameterAclRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2173,ParameterAclRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
Oid oid; /* oid */
--
2.43.0
view thread (6+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: GUC parameter ACLs and physical walsender
In-Reply-To: <[email protected]>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox