8000 pg_basebackup: Generate valid temporary slot names under PQbackendPID() · postgres/postgres@dbd1a06 · GitHub
[go: up one dir, main page]

Skip to content

Commit dbd1a06

Browse files
committed
pg_basebackup: Generate valid temporary slot names under PQbackendPID()
pgbouncer can cause PQbackendPID() to return negative values due to it filling be_pid with random bytes (even these days pid_max can only be set up to 2^22 on 64b machines on Linux, for example, so this cannot happen with normal PID numbers). When this happens, pg_basebackup may generate a temporary slot name that may not be accepted by the parser, leading to spurious failures, like: pg_basebackup: error: could not send replication command ERROR: replication slot name "pg_basebackup_-1201966863" contains invalid character This commit fixes that problem by formatting the result from PQbackendPID() as an unsigned integer when creating the temporary replication slot name, so as the invalid character is gone and the command can be parsed. Author: Jelte Fennema Reviewed-by: Daniel Gustafsson, Nishant Sharma Discussion: https://postgr.es/m/CAGECzQQOGvYfp8ziF4fWQ_o8s2K7ppaoWBQnTmdakn3s-4Z=5g@mail.gmail.com Backpatch-through: 11
1 parent 69e22dd commit dbd1a06

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
612612
* Create replication slot if requested
613613
*/
614614
if (temp_replication_slot && !replication_slot)
615-
replication_slot = psprintf("pg_basebackup_%d", (int) PQbackendPID(param->bgconn));
615+
replication_slot = psprintf("pg_basebackup_%u",
616+
(unsigned int) PQbackendPID(param->bgconn));
616617
if (temp_replication_slot || create_slot)
617618
{
618619
if (!CreateReplicationSlot(param->bgconn, replication_slot, NULL,

0 commit comments

Comments
 (0)
0