mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Allow logical decoding via the walsender interface.
In order for this to work, walsenders need the optional ability to connect to a database, so the "replication" keyword now allows true or false, for backward-compatibility, and the new value "database" (which causes the "dbname" parameter to be respected). walsender needs to loop not only when idle but also when sending decoded data to the user and when waiting for more xlog data to decode. This means that there are now three separate loops inside walsender.c; although some refactoring has been done here, this is still a bit ugly. Andres Freund, with contributions from Álvaro Herrera, and further review by me.
This commit is contained in:
@ -729,11 +729,7 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
|
||||
(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
|
||||
errmsg("remaining connection slots are reserved for non-replication superuser connections")));
|
||||
|
||||
/*
|
||||
* If walsender, we don't want to connect to any particular database. Just
|
||||
* finish the backend startup by processing any options from the startup
|
||||
* packet, and we're done.
|
||||
*/
|
||||
/* Check replication permissions needed for walsender processes. */
|
||||
if (am_walsender)
|
||||
{
|
||||
Assert(!bootstrap);
|
||||
@ -742,7 +738,16 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
|
||||
ereport(FATAL,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("must be superuser or replication role to start walsender")));
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is a plain walsender only supporting physical replication, we
|
||||
* don't want to connect to any particular database. Just finish the
|
||||
* backend startup by processing any options from the startup packet, and
|
||||
* we're done.
|
||||
*/
|
||||
if (am_walsender && !am_db_walsender)
|
||||
{
|
||||
/* process any options passed in the startup packet */
|
||||
if (MyProcPort != NULL)
|
||||
process_startup_options(MyProcPort, am_superuser);
|
||||
|
Reference in New Issue
Block a user