mirror of
https://github.com/postgres/postgres.git
synced 2026-03-03 13:51:00 -05:00
Background workers, including parallel workers, were generating the same sequence of numbers in random(). This showed up as DSM handle collisions when Parallel Hash created multiple segments, but any code that calls random() in background workers could be affected if it cares about different backends generating different numbers. Repair by making sure that all new processes initialize the seed at the same time as they set MyProcPid and MyStartTime in a new function InitProcessGlobals(), called by the postmaster, its children and also standalone processes. Also add a new high resolution MyStartTimestamp as a potentially useful by-product, and remove SessionStartTime from struct Port as it is now redundant. No back-patch for now, as the known consequences so far are just a bunch of harmless shm_open(O_EXCL) collisions. Author: Thomas Munro Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAEepm%3D2eJj_6%3DB%2B2tEpGu2nf1BjthCf9nXXUouYvJJ4C5WSwhg%40mail.gmail.com
78 lines
2.6 KiB
C
78 lines
2.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* postmaster.h
|
|
* Exports from postmaster/postmaster.c.
|
|
*
|
|
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/postmaster/postmaster.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef _POSTMASTER_H
|
|
#define _POSTMASTER_H
|
|
|
|
/* GUC options */
|
|
extern bool EnableSSL;
|
|
extern int ReservedBackends;
|
|
extern PGDLLIMPORT int PostPortNumber;
|
|
extern int Unix_socket_permissions;
|
|
extern char *Unix_socket_group;
|
|
extern char *Unix_socket_directories;
|
|
extern char *ListenAddresses;
|
|
extern bool ClientAuthInProgress;
|
|
extern int PreAuthDelay;
|
|
extern int AuthenticationTimeout;
|
|
extern bool Log_connections;
|
|
extern bool log_hostname;
|
|
extern bool enable_bonjour;
|
|
extern char *bonjour_name;
|
|
extern bool restart_after_crash;
|
|
|
|
#ifdef WIN32
|
|
extern HANDLE PostmasterHandle;
|
|
#else
|
|
extern int postmaster_alive_fds[2];
|
|
|
|
/*
|
|
* Constants that represent which of postmaster_alive_fds is held by
|
|
* postmaster, and which is used in children to check for postmaster death.
|
|
*/
|
|
#define POSTMASTER_FD_WATCH 0 /* used in children to check for
|
|
* postmaster death */
|
|
#define POSTMASTER_FD_OWN 1 /* kept open by postmaster only */
|
|
#endif
|
|
|
|
extern PGDLLIMPORT const char *progname;
|
|
|
|
extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();
|
|
extern void ClosePostmasterPorts(bool am_syslogger);
|
|
extern void InitProcessGlobals(void);
|
|
|
|
extern int MaxLivePostmasterChildren(void);
|
|
|
|
extern int GetNumShmemAttachedBgworkers(void);
|
|
extern bool PostmasterMarkPIDForWorkerNotify(int);
|
|
|
|
#ifdef EXEC_BACKEND
|
|
extern pid_t postmaster_forkexec(int argc, char *argv[]);
|
|
extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();
|
|
|
|
extern Size ShmemBackendArraySize(void);
|
|
extern void ShmemBackendArrayAllocation(void);
|
|
#endif
|
|
|
|
/*
|
|
* Note: MAX_BACKENDS is limited to 2^18-1 because that's the width reserved
|
|
* for buffer references in buf_internals.h. This limitation could be lifted
|
|
* by using a 64bit state; but it's unlikely to be worthwhile as 2^18-1
|
|
* backends exceed currently realistic configurations. Even if that limitation
|
|
* were removed, we still could not a) exceed 2^23-1 because inval.c stores
|
|
* the backend ID as a 3-byte signed integer, b) INT_MAX/4 because some places
|
|
* compute 4*MaxBackends without any overflow check. This is rechecked in the
|
|
* relevant GUC check hooks and in RegisterBackgroundWorker().
|
|
*/
|
|
#define MAX_BACKENDS 0x3FFFF
|
|
|
|
#endif /* _POSTMASTER_H */
|