From d9b0767becf5f41e4f001d8381e6a89941efa5b2 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Mon, 15 Feb 2021 07:28:02 +0530 Subject: [PATCH] Fix the warnings introduced in commit ce0fdbfe97. Author: Amit Kapila Reviewed-by: Tom Lane Discussion: https://postgr.es/m/1610789.1613170207@sss.pgh.pa.us --- src/backend/commands/subscriptioncmds.c | 15 +++++--- src/backend/replication/logical/tablesync.c | 40 ++++++++++----------- src/include/replication/slot.h | 2 +- src/include/replication/worker_internal.h | 3 +- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 5cf874e0b46..e5ae4534ae4 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -715,7 +715,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) * the origin might be already removed. For these reasons, * passing missing_ok = true. */ - ReplicationOriginNameForTablesync(sub->oid, relid, originname); + ReplicationOriginNameForTablesync(sub->oid, relid, originname, + sizeof(originname)); replorigin_drop_by_name(originname, true, false); } @@ -749,7 +750,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data) * dropped slots and fail. For these reasons, we allow * missing_ok = true for the drop. */ - ReplicationSlotNameForTablesync(sub->oid, sub_remove_rels[off].relid, syncslotname); + ReplicationSlotNameForTablesync(sub->oid, sub_remove_rels[off].relid, + syncslotname, sizeof(syncslotname)); ReplicationSlotDropAtPubNode(wrconn, syncslotname, true); } } @@ -1174,7 +1176,8 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) * worker so passing missing_ok = true. This can happen for the states * before SUBREL_STATE_FINISHEDCOPY. */ - ReplicationOriginNameForTablesync(subid, relid, originname); + ReplicationOriginNameForTablesync(subid, relid, originname, + sizeof(originname)); replorigin_drop_by_name(originname, true, false); } @@ -1254,7 +1257,8 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) { char syncslotname[NAMEDATALEN] = {0}; - ReplicationSlotNameForTablesync(subid, relid, syncslotname); + ReplicationSlotNameForTablesync(subid, relid, syncslotname, + sizeof(syncslotname)); ReplicationSlotDropAtPubNode(wrconn, syncslotname, true); } } @@ -1532,7 +1536,8 @@ ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, char *err) { char syncslotname[NAMEDATALEN] = {0}; - ReplicationSlotNameForTablesync(subid, relid, syncslotname); + ReplicationSlotNameForTablesync(subid, relid, syncslotname, + sizeof(syncslotname)); elog(WARNING, "could not drop tablesync replication slot \"%s\"", syncslotname); } diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 19cc8046786..24a6ce5d8ed 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -314,7 +314,8 @@ process_syncing_tables_for_sync(XLogRecPtr current_lsn) */ ReplicationSlotNameForTablesync(MyLogicalRepWorker->subid, MyLogicalRepWorker->relid, - syncslotname); + syncslotname, + sizeof(syncslotname)); /* * It is important to give an error if we are unable to drop the slot, @@ -462,7 +463,8 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) */ ReplicationOriginNameForTablesync(MyLogicalRepWorker->subid, rstate->relid, - originname); + originname, + sizeof(originname)); replorigin_drop_by_name(originname, true, false); /* @@ -871,27 +873,20 @@ copy_table(Relation rel) * pg_%u_sync_%u_UINT64_FORMAT (3 + 10 + 6 + 10 + 20 + '\0'), the maximum * length of slot_name will be 50. * - * The returned slot name is either: - * - stored in the supplied buffer (syncslotname), or - * - palloc'ed in current memory context (if syncslotname = NULL). + * The returned slot name is stored in the supplied buffer (syncslotname) with + * the given size. * * Note: We don't use the subscription slot name as part of tablesync slot name * because we are responsible for cleaning up these slots and it could become * impossible to recalculate what name to cleanup if the subscription slot name * had changed. */ -char * +void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, - char syncslotname[NAMEDATALEN]) + char *syncslotname, int szslot) { - if (syncslotname) - sprintf(syncslotname, "pg_%u_sync_%u_" UINT64_FORMAT, suboid, relid, - GetSystemIdentifier()); - else - syncslotname = psprintf("pg_%u_sync_%u_" UINT64_FORMAT, suboid, relid, - GetSystemIdentifier()); - - return syncslotname; + snprintf(syncslotname, szslot, "pg_%u_sync_%u_" UINT64_FORMAT, suboid, + relid, GetSystemIdentifier()); } /* @@ -901,9 +896,9 @@ ReplicationSlotNameForTablesync(Oid suboid, Oid relid, */ void ReplicationOriginNameForTablesync(Oid suboid, Oid relid, - char originname[NAMEDATALEN]) + char *originname, int szorgname) { - snprintf(originname, NAMEDATALEN, "pg_%u_%u", suboid, relid); + snprintf(originname, szorgname, "pg_%u_%u", suboid, relid); } /* @@ -951,9 +946,11 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) } /* Calculate the name of the tablesync slot. */ - slotname = ReplicationSlotNameForTablesync(MySubscription->oid, - MyLogicalRepWorker->relid, - NULL /* use palloc */ ); + slotname = (char *) palloc(NAMEDATALEN); + ReplicationSlotNameForTablesync(MySubscription->oid, + MyLogicalRepWorker->relid, + slotname, + NAMEDATALEN); /* * Here we use the slot name instead of the subscription name as the @@ -972,7 +969,8 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) /* Assign the origin tracking record name. */ ReplicationOriginNameForTablesync(MySubscription->oid, MyLogicalRepWorker->relid, - originname); + originname, + sizeof(originname)); if (MyLogicalRepWorker->relstate == SUBREL_STATE_DATASYNC) { diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h index 5f52335f15f..38a9a0b3fc4 100644 --- a/src/include/replication/slot.h +++ b/src/include/replication/slot.h @@ -212,7 +212,7 @@ extern bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive); extern void ReplicationSlotsDropDBSlots(Oid dboid); extern void InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno); extern ReplicationSlot *SearchNamedReplicationSlot(const char *name); -extern char *ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslotname); +extern void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslotname, int szslot); extern void ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missing_ok); extern void StartupReplicationSlots(void); diff --git a/src/include/replication/worker_internal.h b/src/include/replication/worker_internal.h index 4a5adc2fdac..1cac75e5a9b 100644 --- a/src/include/replication/worker_internal.h +++ b/src/include/replication/worker_internal.h @@ -82,7 +82,8 @@ extern void logicalrep_worker_wakeup_ptr(LogicalRepWorker *worker); extern int logicalrep_sync_worker_count(Oid subid); -extern void ReplicationOriginNameForTablesync(Oid suboid, Oid relid, char *originname); +extern void ReplicationOriginNameForTablesync(Oid suboid, Oid relid, + char *originname, int szorgname); extern char *LogicalRepSyncTableStart(XLogRecPtr *origin_startpos); void process_syncing_tables(XLogRecPtr current_lsn); -- 2.39.5