From ecb1290dbf12cd53f5c88b5165356aa7730267a7 Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sun, 2 Apr 2023 19:02:13 +0200 Subject: [PATCH 5/7] Support LOCK for sequences, instead of function --- src/backend/commands/lockcmds.c | 4 ++-- src/backend/commands/sequence.c | 19 ------------------- src/backend/replication/logical/tablesync.c | 11 +++++------ src/include/catalog/pg_proc.dat | 4 ---- 4 files changed, 7 insertions(+), 31 deletions(-) diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index 43c7d7f4bb..38b4a66693 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -85,9 +85,9 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid, return; /* woops, concurrently dropped; no permissions * check */ - /* Currently, we only allow plain tables or views to be locked */ + /* Currently, we only allow plain tables, views or sequences to be locked */ if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE && - relkind != RELKIND_VIEW) + relkind != RELKIND_VIEW && relkind != RELKIND_SEQUENCE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot lock relation \"%s\"", diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 3b36c346e0..3311ad034f 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -2029,25 +2029,6 @@ pg_sequence_last_value(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } -Datum -pg_sequence_lock_for_sync(PG_FUNCTION_ARGS) -{ - Oid relid = PG_GETARG_OID(0); - Relation seqrel; - - seqrel = relation_open(relid, RowExclusiveLock); - - if (seqrel->rd_rel->relkind != RELKIND_SEQUENCE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a sequence", - RelationGetRelationName(seqrel)))); - - /* close the relation, but keep the lock */ - relation_close(seqrel, NoLock); - - PG_RETURN_VOID(); -} void seq_redo(XLogReaderState *record) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 85ae8f5a32..89c0c94159 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -1527,7 +1527,6 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) if (get_rel_relkind(RelationGetRelid(rel)) == RELKIND_SEQUENCE) { StringInfoData cmd; - Oid lockRow[] = {VOIDOID}; initStringInfo(&cmd); @@ -1535,13 +1534,13 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) * XXX maybe this should do fetch_remote_table_info and use the relation * and namespace names from the result? */ - appendStringInfo(&cmd, "SELECT pg_catalog.pg_sequence_lock_for_sync('%s')", + appendStringInfo(&cmd, "LOCK %s IN ROW EXCLUSIVE MODE", quote_qualified_identifier(get_namespace_name(RelationGetNamespace(rel)), RelationGetRelationName(rel))); - elog(LOG, "locking: %s", cmd.data); - res = walrcv_exec(LogRepWorkerWalRcvConn, - cmd.data, 1, lockRow); - if (res->status != WALRCV_OK_TUPLES) + + res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 0, NULL); + + if (res->status != WALRCV_OK_COMMAND) ereport(ERROR, (errcode(ERRCODE_CONNECTION_FAILURE), errmsg("sequence copy failed to lock on publisher: %s", diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 7957c02848..49251b0b7b 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -12058,8 +12058,4 @@ proname => 'any_value_transfn', prorettype => 'anyelement', proargtypes => 'anyelement anyelement', prosrc => 'any_value_transfn' }, -{ oid => '8003', descr => 'lock sequence for logical replication sync', - proname => 'pg_sequence_lock_for_sync', prorettype => 'void', - proargtypes => 'regclass', prosrc => 'pg_sequence_lock_for_sync' }, - ] -- 2.39.2