mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
Even after reaching the minimum recovery point, if there are long-lived
write transactions with 64 subtransactions on the primary, the recovery
snapshot may not yet be ready for hot standby, delaying read-only
connections on the standby. Previously, when read-only connections were
not accepted due to this condition, the following error message was logged:
FATAL: the database system is not yet accepting connections
DETAIL: Consistent recovery state has not been yet reached.
This DETAIL message was misleading because the following message was
already logged in this case:
LOG: consistent recovery state reached
This contradiction, i.e., indicating that the recovery state was consistent
while also stating it wasn’t, caused confusion.
This commit improves the error message to better reflect the actual state:
FATAL: the database system is not yet accepting connections
DETAIL: Recovery snapshot is not yet ready for hot standby.
HINT: To enable hot standby, close write transactions with more than 64 subtransactions on the primary server.
To implement this, the commit introduces a new postmaster signal,
PMSIGNAL_RECOVERY_CONSISTENT. When the startup process reaches
a consistent recovery state, it sends this signal to the postmaster,
allowing it to correctly recognize that state.
Since this is not a clear bug, the change is applied only to the master
branch and is not back-patched.
Author: Atsushi Torikoshi <torikoshia@oss.nttdata.com>
Co-authored-by: Fujii Masao <masao.fujii@gmail.com>
Reviewed-by: Yugo Nagata <nagata@sraoss.co.jp>
Discussion: https://postgr.es/m/02db8cd8e1f527a8b999b94a4bee3165@oss.nttdata.com
123 lines
3.5 KiB
C
123 lines
3.5 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* backend_startup.h
|
|
* prototypes for backend_startup.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/tcop/backend_startup.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef BACKEND_STARTUP_H
|
|
#define BACKEND_STARTUP_H
|
|
|
|
#include "utils/timestamp.h"
|
|
|
|
/* GUCs */
|
|
extern PGDLLIMPORT bool Trace_connection_negotiation;
|
|
extern PGDLLIMPORT uint32 log_connections;
|
|
extern PGDLLIMPORT char *log_connections_string;
|
|
|
|
/* Other globals */
|
|
extern PGDLLIMPORT struct ConnectionTiming conn_timing;
|
|
|
|
/*
|
|
* CAC_state is passed from postmaster to the backend process, to indicate
|
|
* whether the connection should be accepted, or if the process should just
|
|
* send an error to the client and close the connection. Note that the
|
|
* connection can fail for various reasons even if postmaster passed CAC_OK.
|
|
*/
|
|
typedef enum CAC_state
|
|
{
|
|
CAC_OK,
|
|
CAC_STARTUP,
|
|
CAC_SHUTDOWN,
|
|
CAC_RECOVERY,
|
|
CAC_NOTHOTSTANDBY,
|
|
CAC_TOOMANY,
|
|
} CAC_state;
|
|
|
|
/* Information passed from postmaster to backend process in 'startup_data' */
|
|
typedef struct BackendStartupData
|
|
{
|
|
CAC_state canAcceptConnections;
|
|
|
|
/*
|
|
* Time at which the connection client socket is created. Only used for
|
|
* client and wal sender connections.
|
|
*/
|
|
TimestampTz socket_created;
|
|
|
|
/*
|
|
* Time at which the postmaster initiates process creation -- either
|
|
* through fork or otherwise. Only used for client and wal sender
|
|
* connections.
|
|
*/
|
|
TimestampTz fork_started;
|
|
} BackendStartupData;
|
|
|
|
/*
|
|
* Granular control over which messages to log for the log_connections GUC.
|
|
*
|
|
* RECEIPT, AUTHENTICATION, AUTHORIZATION, and SETUP_DURATIONS are different
|
|
* aspects of connection establishment and backend setup for which we may emit
|
|
* a log message.
|
|
*
|
|
* ALL is a convenience alias equivalent to all of the above aspects.
|
|
*
|
|
* ON is backwards compatibility alias for the connection aspects that were
|
|
* logged in Postgres versions < 18.
|
|
*/
|
|
typedef enum LogConnectionOption
|
|
{
|
|
LOG_CONNECTION_RECEIPT = (1 << 0),
|
|
LOG_CONNECTION_AUTHENTICATION = (1 << 1),
|
|
LOG_CONNECTION_AUTHORIZATION = (1 << 2),
|
|
LOG_CONNECTION_SETUP_DURATIONS = (1 << 3),
|
|
LOG_CONNECTION_ON =
|
|
LOG_CONNECTION_RECEIPT |
|
|
LOG_CONNECTION_AUTHENTICATION |
|
|
LOG_CONNECTION_AUTHORIZATION,
|
|
LOG_CONNECTION_ALL =
|
|
LOG_CONNECTION_RECEIPT |
|
|
LOG_CONNECTION_AUTHENTICATION |
|
|
LOG_CONNECTION_AUTHORIZATION |
|
|
LOG_CONNECTION_SETUP_DURATIONS,
|
|
} LogConnectionOption;
|
|
|
|
/*
|
|
* A collection of timings of various stages of connection establishment and
|
|
* setup for client backends and WAL senders.
|
|
*
|
|
* Used to emit the setup_durations log message for the log_connections GUC.
|
|
*/
|
|
typedef struct ConnectionTiming
|
|
{
|
|
/*
|
|
* The time at which the client socket is created and the time at which
|
|
* the connection is fully set up and first ready for query. Together
|
|
* these represent the total connection establishment and setup time.
|
|
*/
|
|
TimestampTz socket_create;
|
|
TimestampTz ready_for_use;
|
|
|
|
/* Time at which process creation was initiated */
|
|
TimestampTz fork_start;
|
|
|
|
/* Time at which process creation was completed */
|
|
TimestampTz fork_end;
|
|
|
|
/* Time at which authentication started */
|
|
TimestampTz auth_start;
|
|
|
|
/* Time at which authentication was finished */
|
|
TimestampTz auth_end;
|
|
} ConnectionTiming;
|
|
|
|
pg_noreturn extern void BackendMain(const void *startup_data, size_t startup_data_len);
|
|
|
|
#endif /* BACKEND_STARTUP_H */
|