Hi all, Since 2dedf4d, recovery.conf is dead and all recovery parameters are now GUCs. While looking at a patch to switch primary_conninfo and primary_slot_name to be reloadable, Sergei Kornilov had a very good point that the WAL receiver uses a connection string and a physical slot name based on what the startup process wants the WAL receiver to use: https://www.postgresql.org/message-id/20181212043208.gi17...@paquier.xyz
It seems to me that doing so is now strange as the WAL receiver knows about the GUC context, and actually it knows the parameters it should use, so there is no point to pass down the values when requesting the WAL receiver to start. What do you think about the attached to simplify the logic? Even if primary_conninfo and primary_slot_name are not switched to SIGHUP this cleanup looks like a good thing to me. Thoughts? -- Michael
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index c80b14ed97..9d664559e8 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -11848,8 +11848,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess, tli, curFileTLI); } curFileTLI = tli; - RequestXLogStreaming(tli, ptr, PrimaryConnInfo, - PrimarySlotName); + RequestXLogStreaming(tli, ptr); receivedUpto = 0; } diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 9643c2ed7b..3e4449583e 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -188,9 +188,7 @@ DisableWalRcvImmediateExit(void) void WalReceiverMain(void) { - char conninfo[MAXCONNINFO]; char *tmp_conninfo; - char slotname[NAMEDATALEN]; XLogRecPtr startpoint; TimeLineID startpointTLI; TimeLineID primaryTLI; @@ -250,8 +248,6 @@ WalReceiverMain(void) /* Fetch information required to start streaming */ walrcv->ready_to_display = false; - strlcpy(conninfo, (char *) walrcv->conninfo, MAXCONNINFO); - strlcpy(slotname, (char *) walrcv->slotname, NAMEDATALEN); startpoint = walrcv->receiveStart; startpointTLI = walrcv->receiveStartTLI; @@ -291,9 +287,14 @@ WalReceiverMain(void) /* Unblock signals (they were blocked when the postmaster forked us) */ PG_SETMASK(&UnBlockSig); + if (PrimaryConnInfo == NULL || PrimaryConnInfo[0] == '\0') + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot connect to the primary server as \"primary_conninfo\" is not defined"))); + /* Establish the connection to the primary for XLOG streaming */ EnableWalRcvImmediateExit(); - wrconn = walrcv_connect(conninfo, false, "walreceiver", &err); + wrconn = walrcv_connect(PrimaryConnInfo, false, "walreceiver", &err); if (!wrconn) ereport(ERROR, (errmsg("could not connect to the primary server: %s", err))); @@ -311,6 +312,10 @@ WalReceiverMain(void) if (tmp_conninfo) strlcpy((char *) walrcv->conninfo, tmp_conninfo, MAXCONNINFO); + memset(walrcv->slotname, 0, NAMEDATALEN); + if (PrimarySlotName) + strlcpy((char *) walrcv->slotname, PrimarySlotName, NAMEDATALEN); + memset(walrcv->sender_host, 0, NI_MAXHOST); if (sender_host) strlcpy((char *) walrcv->sender_host, sender_host, NI_MAXHOST); @@ -387,7 +392,8 @@ WalReceiverMain(void) */ options.logical = false; options.startpoint = startpoint; - options.slotname = slotname[0] != '\0' ? slotname : NULL; + options.slotname = (PrimarySlotName && PrimarySlotName[0] != '\0') ? + PrimarySlotName : NULL; options.proto.physical.startpointTLI = startpointTLI; ThisTimeLineID = startpointTLI; if (walrcv_startstreaming(wrconn, &options)) diff --git a/src/backend/replication/walreceiverfuncs.c b/src/backend/replication/walreceiverfuncs.c index 67b1a074cc..82dc128d10 100644 --- a/src/backend/replication/walreceiverfuncs.c +++ b/src/backend/replication/walreceiverfuncs.c @@ -220,8 +220,7 @@ ShutdownWalRcv(void) * of a replication slot to acquire. */ void -RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo, - const char *slotname) +RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr) { WalRcvData *walrcv = WalRcv; bool launch = false; @@ -243,15 +242,8 @@ RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo, Assert(walrcv->walRcvState == WALRCV_STOPPED || walrcv->walRcvState == WALRCV_WAITING); - if (conninfo != NULL) - strlcpy((char *) walrcv->conninfo, conninfo, MAXCONNINFO); - else - walrcv->conninfo[0] = '\0'; - - if (slotname != NULL) - strlcpy((char *) walrcv->slotname, slotname, NAMEDATALEN); - else - walrcv->slotname[0] = '\0'; + walrcv->conninfo[0] = '\0'; + walrcv->slotname[0] = '\0'; if (walrcv->walRcvState == WALRCV_STOPPED) { diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index 5913b580c2..ba18b1f93f 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -306,8 +306,7 @@ extern void WalRcvShmemInit(void); extern void ShutdownWalRcv(void); extern bool WalRcvStreaming(void); extern bool WalRcvRunning(void); -extern void RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, - const char *conninfo, const char *slotname); +extern void RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr); extern XLogRecPtr GetWalRcvWriteRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI); extern int GetReplicationApplyDelay(void); extern int GetReplicationTransferLatency(void);
signature.asc
Description: PGP signature