PostgreSQL Source Code git master
Loading...
Searching...
No Matches
postinit.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * postinit.c
4 * postgres initialization utilities
5 *
6 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/utils/init/postinit.c
12 *
13 *
14 *-------------------------------------------------------------------------
15 */
16#include "postgres.h"
17
18#include <ctype.h>
19#include <fcntl.h>
20#include <unistd.h>
21
22#include "access/genam.h"
23#include "access/heapam.h"
24#include "access/htup_details.h"
25#include "access/session.h"
26#include "access/tableam.h"
27#include "access/xact.h"
28#include "access/xlog.h"
29#include "access/xloginsert.h"
30#include "catalog/namespace.h"
31#include "catalog/pg_authid.h"
33#include "catalog/pg_database.h"
36#include "libpq/auth.h"
37#include "libpq/libpq-be.h"
38#include "mb/pg_wchar.h"
39#include "miscadmin.h"
40#include "pgstat.h"
41#include "port/pg_bitutils.h"
44#include "replication/slot.h"
47#include "storage/aio_subsys.h"
48#include "storage/bufmgr.h"
49#include "storage/fd.h"
50#include "storage/ipc.h"
51#include "storage/lmgr.h"
52#include "storage/proc.h"
53#include "storage/procarray.h"
54#include "storage/procnumber.h"
55#include "storage/procsignal.h"
56#include "storage/sinvaladt.h"
57#include "storage/smgr.h"
58#include "storage/sync.h"
60#include "tcop/tcopprot.h"
61#include "utils/acl.h"
62#include "utils/builtins.h"
63#include "utils/fmgroids.h"
64#include "utils/guc_hooks.h"
66#include "utils/memutils.h"
67#include "utils/pg_locale.h"
68#include "utils/portal.h"
69#include "utils/ps_status.h"
70#include "utils/snapmgr.h"
71#include "utils/syscache.h"
72#include "utils/timeout.h"
73
74/* has this backend called EmitConnectionWarnings()? */
76
77/* content of warnings to send via EmitConnectionWarnings() */
80
81static HeapTuple GetDatabaseTuple(const char *dbname);
83static void PerformAuthentication(Port *port);
84static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections);
85static void ShutdownPostgres(int code, Datum arg);
86static void StatementTimeoutHandler(void);
87static void LockTimeoutHandler(void);
89static void TransactionTimeoutHandler(void);
90static void IdleSessionTimeoutHandler(void);
91static void IdleStatsUpdateTimeoutHandler(void);
92static void ClientCheckTimeoutHandler(void);
93static bool ThereIsAtLeastOneRole(void);
95static void process_settings(Oid databaseid, Oid roleid);
96static void EmitConnectionWarnings(void);
97
98
99/*** InitPostgres support ***/
100
101
102/*
103 * GetDatabaseTuple -- fetch the pg_database row for a database
104 *
105 * This is used during backend startup when we don't yet have any access to
106 * system catalogs in general. In the worst case, we can seqscan pg_database
107 * using nothing but the hard-wired descriptor that relcache.c creates for
108 * pg_database. In more typical cases, relcache.c was able to load
109 * descriptors for both pg_database and its indexes from the shared relcache
110 * cache file, and so we can do an indexscan. criticalSharedRelcachesBuilt
111 * tells whether we got the cached descriptors.
112 */
113static HeapTuple
115{
116 HeapTuple tuple;
117 Relation relation;
118 SysScanDesc scan;
119 ScanKeyData key[1];
120
121 /*
122 * form a scan key
123 */
124 ScanKeyInit(&key[0],
128
129 /*
130 * Open pg_database and fetch a tuple. Force heap scan if we haven't yet
131 * built the critical shared relcache entries (i.e., we're starting up
132 * without a shared relcache cache file).
133 */
137 NULL,
138 1, key);
139
140 tuple = systable_getnext(scan);
141
142 /* Must copy tuple before releasing buffer */
143 if (HeapTupleIsValid(tuple))
144 tuple = heap_copytuple(tuple);
145
146 /* all done */
147 systable_endscan(scan);
148 table_close(relation, AccessShareLock);
149
150 return tuple;
151}
152
153/*
154 * GetDatabaseTupleByOid -- as above, but search by database OID
155 */
156static HeapTuple
158{
159 HeapTuple tuple;
160 Relation relation;
161 SysScanDesc scan;
162 ScanKeyData key[1];
163
164 /*
165 * form a scan key
166 */
167 ScanKeyInit(&key[0],
170 ObjectIdGetDatum(dboid));
171
172 /*
173 * Open pg_database and fetch a tuple. Force heap scan if we haven't yet
174 * built the critical shared relcache entries (i.e., we're starting up
175 * without a shared relcache cache file).
176 */
178 scan = systable_beginscan(relation, DatabaseOidIndexId,
180 NULL,
181 1, key);
182
183 tuple = systable_getnext(scan);
184
185 /* Must copy tuple before releasing buffer */
186 if (HeapTupleIsValid(tuple))
187 tuple = heap_copytuple(tuple);
188
189 /* all done */
190 systable_endscan(scan);
191 table_close(relation, AccessShareLock);
192
193 return tuple;
194}
195
196
197/*
198 * PerformAuthentication -- authenticate a remote client
199 *
200 * returns: nothing. Will not return at all if there's any failure.
201 */
202static void
204{
205 /* This should be set already, but let's make sure */
206 ClientAuthInProgress = true; /* limit visibility of log messages */
207
208 /*
209 * In EXEC_BACKEND case, we didn't inherit the contents of pg_hba.conf
210 * etcetera from the postmaster, and have to load them ourselves.
211 *
212 * FIXME: [fork/exec] Ugh. Is there a way around this overhead?
213 */
214#ifdef EXEC_BACKEND
215
216 /*
217 * load_hba() and load_ident() want to work within the PostmasterContext,
218 * so create that if it doesn't exist (which it won't). We'll delete it
219 * again later, in PostgresMain.
220 */
221 if (PostmasterContext == NULL)
223 "Postmaster",
225
226 if (!load_hba())
227 {
228 /*
229 * It makes no sense to continue if we fail to load the HBA file,
230 * since there is no way to connect to the database in this case.
231 */
233 /* translator: %s is a configuration file */
234 (errmsg("could not load %s", HbaFileName)));
235 }
236
237 if (!load_ident())
238 {
239 /*
240 * It is ok to continue if we fail to load the IDENT file, although it
241 * means that you cannot log in using any of the authentication
242 * methods that need a user name mapping. load_ident() already logged
243 * the details of error to the log.
244 */
245 }
246#endif
247
248 /* Capture authentication start time for logging */
250
251 /*
252 * Set up a timeout in case a buggy or malicious client fails to respond
253 * during authentication. Since we're inside a transaction and might do
254 * database access, we have to use the statement_timeout infrastructure.
255 */
257
258 /*
259 * Now perform authentication exchange.
260 */
261 set_ps_display("authentication");
262 ClientAuthentication(port); /* might not return, if failure */
263
264 /*
265 * Done with authentication. Disable the timeout, and log if needed.
266 */
268
269 /* Capture authentication end time for logging */
271
273 {
275
277 if (am_walsender)
278 appendStringInfo(&logmsg, _("replication connection authorized: user=%s"),
279 port->user_name);
280 else
281 appendStringInfo(&logmsg, _("connection authorized: user=%s"),
282 port->user_name);
283 if (!am_walsender)
284 appendStringInfo(&logmsg, _(" database=%s"), port->database_name);
285
286 if (port->application_name != NULL)
287 appendStringInfo(&logmsg, _(" application_name=%s"),
288 port->application_name);
289
290#ifdef USE_SSL
291 if (port->ssl_in_use)
292 appendStringInfo(&logmsg, _(" SSL enabled (protocol=%s, cipher=%s, bits=%d)"),
296#endif
297#ifdef ENABLE_GSS
298 if (port->gss)
299 {
300 const char *princ = be_gssapi_get_princ(port);
301
302 if (princ)
304 _(" GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)"),
305 be_gssapi_get_auth(port) ? _("yes") : _("no"),
306 be_gssapi_get_enc(port) ? _("yes") : _("no"),
307 be_gssapi_get_delegation(port) ? _("yes") : _("no"),
308 princ);
309 else
311 _(" GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)"),
312 be_gssapi_get_auth(port) ? _("yes") : _("no"),
313 be_gssapi_get_enc(port) ? _("yes") : _("no"),
314 be_gssapi_get_delegation(port) ? _("yes") : _("no"));
315 }
316#endif
317
318 ereport(LOG, errmsg_internal("%s", logmsg.data));
319 pfree(logmsg.data);
320 }
321
322 set_ps_display("startup");
323
324 ClientAuthInProgress = false; /* client_min_messages is active now */
325}
326
327
328/*
329 * CheckMyDatabase -- fetch information from the pg_database entry for our DB
330 */
331static void
333{
336 Datum datum;
337 bool isnull;
338 char *collate;
339 char *ctype;
340
341 /* Fetch our pg_database row normally, via syscache */
343 if (!HeapTupleIsValid(tup))
344 elog(ERROR, "cache lookup failed for database %u", MyDatabaseId);
346
347 /* This recheck is strictly paranoia */
348 if (strcmp(name, NameStr(dbform->datname)) != 0)
351 errmsg("database \"%s\" has disappeared from pg_database",
352 name),
353 errdetail("Database OID %u now seems to belong to \"%s\".",
354 MyDatabaseId, NameStr(dbform->datname))));
355
356 /*
357 * Check permissions to connect to the database.
358 *
359 * These checks are not enforced when in standalone mode, so that there is
360 * a way to recover from disabling all access to all databases, for
361 * example "UPDATE pg_database SET datallowconn = false;".
362 */
364 {
365 /*
366 * Check that the database is currently allowing connections.
367 * (Background processes can override this test and the next one by
368 * setting override_allow_connections.)
369 */
370 if (!dbform->datallowconn && !override_allow_connections)
373 errmsg("database \"%s\" is not currently accepting connections",
374 name)));
375
376 /*
377 * Check privilege to connect to the database. (The am_superuser test
378 * is redundant, but since we have the flag, might as well check it
379 * and save a few cycles.)
380 */
386 errmsg("permission denied for database \"%s\"", name),
387 errdetail("User does not have CONNECT privilege.")));
388
389 /*
390 * Check connection limit for this database. We enforce the limit
391 * only for regular backends, since other process types have their own
392 * PGPROC pools.
393 *
394 * There is a race condition here --- we create our PGPROC before
395 * checking for other PGPROCs. If two backends did this at about the
396 * same time, they might both think they were over the limit, while
397 * ideally one should succeed and one fail. Getting that to work
398 * exactly seems more trouble than it is worth, however; instead we
399 * just document that the connection limit is approximate.
400 */
401 if (dbform->datconnlimit >= 0 &&
403 !am_superuser &&
404 CountDBConnections(MyDatabaseId) > dbform->datconnlimit)
407 errmsg("too many connections for database \"%s\"",
408 name)));
409 }
410
411 /*
412 * OK, we're golden. Next to-do item is to save the encoding info out of
413 * the pg_database tuple.
414 */
415 SetDatabaseEncoding(dbform->encoding);
416 /* Record it as a GUC internal option, too */
417 SetConfigOption("server_encoding", GetDatabaseEncodingName(),
419 /* If we have no other source of client_encoding, use server encoding */
420 SetConfigOption("client_encoding", GetDatabaseEncodingName(),
422
423 /* assign locale variables */
425 collate = TextDatumGetCString(datum);
427 ctype = TextDatumGetCString(datum);
428
429 /*
430 * Historically, we set LC_COLLATE from datcollate, as well. That's no
431 * longer necessary because all collation behavior is handled through
432 * pg_locale_t.
433 */
434
435 if (pg_perm_setlocale(LC_CTYPE, ctype) == NULL)
437 (errmsg("database locale is incompatible with operating system"),
438 errdetail("The database was initialized with LC_CTYPE \"%s\", "
439 " which is not recognized by setlocale().", ctype),
440 errhint("Recreate the database with another locale or install the missing locale.")));
441
443
444 /*
445 * Check collation version. See similar code in
446 * pg_newlocale_from_collation(). Note that here we warn instead of error
447 * in any case, so that we don't prevent connecting.
448 */
450 &isnull);
451 if (!isnull)
452 {
453 char *actual_versionstr;
454 char *collversionstr;
455 char *locale;
456
458
459 if (dbform->datlocprovider == COLLPROVIDER_LIBC)
460 locale = collate;
461 else
462 {
464 locale = TextDatumGetCString(datum);
465 }
466
467 actual_versionstr = get_collation_actual_version(dbform->datlocprovider, locale);
469 /* should not happen */
471 "database \"%s\" has no actual collation version, but a version was recorded",
472 name);
475 (errmsg("database \"%s\" has a collation version mismatch",
476 name),
477 errdetail("The database was created using collation version %s, "
478 "but the operating system provides version %s.",
480 errhint("Rebuild all objects in this database that use the default collation and run "
481 "ALTER DATABASE %s REFRESH COLLATION VERSION, "
482 "or build PostgreSQL with the right library version.",
484 }
485
487}
488
489
490/*
491 * pg_split_opts -- split a string of options and append it to an argv array
492 *
493 * The caller is responsible for ensuring the argv array is large enough. The
494 * maximum possible number of arguments added by this routine is
495 * (strlen(optstr) + 1) / 2.
496 *
497 * Because some option values can contain spaces we allow escaping using
498 * backslashes, with \\ representing a literal backslash.
499 */
500void
501pg_split_opts(char **argv, int *argcp, const char *optstr)
502{
504
505 initStringInfo(&s);
506
507 while (*optstr)
508 {
509 bool last_was_escape = false;
510
511 resetStringInfo(&s);
512
513 /* skip over leading space */
514 while (isspace((unsigned char) *optstr))
515 optstr++;
516
517 if (*optstr == '\0')
518 break;
519
520 /*
521 * Parse a single option, stopping at the first space, unless it's
522 * escaped.
523 */
524 while (*optstr)
525 {
526 if (isspace((unsigned char) *optstr) && !last_was_escape)
527 break;
528
529 if (!last_was_escape && *optstr == '\\')
530 last_was_escape = true;
531 else
532 {
533 last_was_escape = false;
535 }
536
537 optstr++;
538 }
539
540 /* now store the option in the next argv[] position */
541 argv[(*argcp)++] = pstrdup(s.data);
542 }
543
544 pfree(s.data);
545}
546
547/*
548 * Initialize MaxBackends value from config options.
549 *
550 * This must be called after modules have had the chance to alter GUCs in
551 * shared_preload_libraries and before shared memory size is determined.
552 *
553 * Note that in EXEC_BACKEND environment, the value is passed down from
554 * postmaster to subprocesses via BackendParameters in SubPostmasterMain; only
555 * postmaster itself and processes not under postmaster control should call
556 * this.
557 */
558void
560{
561 Assert(MaxBackends == 0);
562
563 /* Note that this does not include "auxiliary" processes */
566
570 errmsg("too many server processes configured"),
571 errdetail("\"max_connections\" (%d) plus \"autovacuum_worker_slots\" (%d) plus \"max_worker_processes\" (%d) plus \"max_wal_senders\" (%d) must be less than %d.",
575}
576
577/*
578 * Initialize the number of fast-path lock slots in PGPROC.
579 *
580 * This must be called after modules have had the chance to alter GUCs in
581 * shared_preload_libraries and before shared memory size is determined.
582 */
583void
585{
586 /* Should be initialized only once. */
588
589 /*
590 * Based on the max_locks_per_transaction GUC, as that's a good indicator
591 * of the expected number of locks, figure out the value for
592 * FastPathLockGroupsPerBackend. This must be a power-of-two. We cap the
593 * value at FP_LOCK_GROUPS_PER_BACKEND_MAX and insist the value is at
594 * least 1.
595 *
596 * The default max_locks_per_transaction = 128 means 8 groups by default.
597 */
601
602 /* Validate we did get a power-of-two */
605}
606
607/*
608 * Early initialization of a backend (either standalone or under postmaster).
609 * This happens even before InitPostgres.
610 *
611 * This is separate from InitPostgres because it is also called by auxiliary
612 * processes, such as the background writer process, which may not call
613 * InitPostgres at all.
614 */
615void
617{
618 Assert(MyProc != NULL);
619
620 /*
621 * Initialize our input/output/debugging file descriptors.
622 */
624
625 /*
626 * Initialize file access. Done early so other subsystems can access
627 * files.
628 */
630
631 /*
632 * Initialize statistics reporting. This needs to happen early to ensure
633 * that pgstat's shutdown callback runs after the shutdown callbacks of
634 * all subsystems that can produce stats (like e.g. transaction commits
635 * can).
636 */
638
639 /*
640 * Initialize AIO before infrastructure that might need to actually
641 * execute AIO.
642 */
644
645 /* Do local initialization of storage and buffer managers */
646 InitSync();
647 smgrinit();
649
650 /*
651 * Initialize temporary file access after pgstat, so that the temporary
652 * file shutdown hook can report temporary file statistics.
653 */
655
656 /*
657 * Initialize local buffers for WAL record construction, in case we ever
658 * try to insert XLOG.
659 */
661
662 /* Initialize lock manager's local structs */
664
665 /* Initialize logical info WAL logging state */
667
668 /*
669 * Initialize replication slots after pgstat. The exit hook might need to
670 * drop ephemeral slots, which in turn triggers stats reporting.
671 */
673}
674
675
676/* --------------------------------
677 * InitPostgres
678 * Initialize POSTGRES.
679 *
680 * Parameters:
681 * in_dbname, dboid: specify database to connect to, as described below
682 * username, useroid: specify role to connect as, as described below
683 * flags:
684 * - INIT_PG_LOAD_SESSION_LIBS to honor [session|local]_preload_libraries.
685 * - INIT_PG_OVERRIDE_ALLOW_CONNS to connect despite !datallowconn.
686 * - INIT_PG_OVERRIDE_ROLE_LOGIN to connect despite !rolcanlogin.
687 * out_dbname: optional output parameter, see below; pass NULL if not used
688 *
689 * The database can be specified by name, using the in_dbname parameter, or by
690 * OID, using the dboid parameter. Specify NULL or InvalidOid respectively
691 * for the unused parameter. If dboid is provided, the actual database
692 * name can be returned to the caller in out_dbname. If out_dbname isn't
693 * NULL, it must point to a buffer of size NAMEDATALEN.
694 *
695 * Similarly, the role can be passed by name, using the username parameter,
696 * or by OID using the useroid parameter.
697 *
698 * In bootstrap mode the database and username parameters are NULL/InvalidOid.
699 * The autovacuum launcher process doesn't specify these parameters either,
700 * because it only goes far enough to be able to read pg_database; it doesn't
701 * connect to any particular database. An autovacuum worker specifies a
702 * database but not a username; conversely, a physical walsender specifies
703 * username but not database.
704 *
705 * By convention, INIT_PG_LOAD_SESSION_LIBS should be passed in "flags" in
706 * "interactive" sessions (including standalone backends), but not in
707 * background processes such as autovacuum. Note in particular that it
708 * shouldn't be true in parallel worker processes; those have another
709 * mechanism for replicating their leader's set of loaded libraries.
710 *
711 * We expect that InitProcess() was already called, so we already have a
712 * PGPROC struct ... but it's not completely filled in yet.
713 *
714 * Note:
715 * Be very careful with the order of calls in the InitPostgres function.
716 * --------------------------------
717 */
718void
719InitPostgres(const char *in_dbname, Oid dboid,
720 const char *username, Oid useroid,
721 uint32 flags,
722 char *out_dbname)
723{
725 bool am_superuser;
726 char *fullpath;
727 char dbname[NAMEDATALEN];
728 int nfree = 0;
729
730 elog(DEBUG3, "InitPostgres");
731
732 /*
733 * Add my PGPROC struct to the ProcArray.
734 *
735 * Once I have done this, I am visible to other backends!
736 */
738
739 /* Initialize status reporting */
741
742 /*
743 * And initialize an entry in the PgBackendStatus array. That way, if
744 * LWLocks or third-party authentication should happen to hang, it is
745 * possible to retrieve some information about what is going on.
746 */
747 if (!bootstrap)
748 {
750 INJECTION_POINT("init-pre-auth", NULL);
751 }
752
753 /*
754 * Initialize my entry in the shared-invalidation manager's array of
755 * per-backend data.
756 */
758
759 /*
760 * Prevent consuming interrupts between setting ProcSignalInit and setting
761 * the initial local data checksum value. If a barrier is emitted, and
762 * absorbed, before local cached state is initialized the state transition
763 * can be invalid.
764 */
766
768
769 /*
770 * Initialize a local cache of the data_checksum_version, to be updated by
771 * the procsignal-based barriers.
772 *
773 * This intentionally happens after initializing the procsignal, otherwise
774 * we might miss a state change. This means we can get a barrier for the
775 * state we've just initialized.
776 *
777 * The postmaster (which is what gets forked into the new child process)
778 * does not handle barriers, therefore it may not have the current value
779 * of LocalDataChecksumVersion value (it'll have the value read from the
780 * control file, which may be arbitrarily old).
781 *
782 * NB: Even if the postmaster handled barriers, the value might still be
783 * stale, as it might have changed after this process forked.
784 */
786
788
789 /*
790 * Also set up timeout handlers needed for backend operation. We need
791 * these in every case except bootstrap.
792 */
793 if (!bootstrap)
794 {
805 }
806
807 /*
808 * If this is either a bootstrap process or a standalone backend, start up
809 * the XLOG machinery, and register to have it closed down at exit. In
810 * other cases, the startup process is responsible for starting up the
811 * XLOG machinery, and the checkpointer for closing it down.
812 */
814 {
815 /*
816 * We don't yet have an aux-process resource owner, but StartupXLOG
817 * and ShutdownXLOG will need one. Hence, create said resource owner
818 * (and register a callback to clean it up after ShutdownXLOG runs).
819 */
821
822 StartupXLOG();
823 /* Release (and warn about) any buffer pins leaked in StartupXLOG */
825 /* Reset CurrentResourceOwner to nothing for the moment */
827
828 /*
829 * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM
830 * segments etc to work (which in turn is required for pgstats).
831 */
834 }
835
836 /*
837 * Initialize the relation cache and the system catalog caches. Note that
838 * no catalog access happens here; we only set up the hashtable structure.
839 * We must do this before starting a transaction because transaction abort
840 * would try to touch these hashtables.
841 */
845
846 /* Initialize portal manager */
848
849 /*
850 * Load relcache entries for the shared system catalogs. This must create
851 * at least entries for pg_database and catalogs used for authentication.
852 */
854
855 /*
856 * Set up process-exit callback to do pre-shutdown cleanup. This is one
857 * of the first before_shmem_exit callbacks we register; thus, this will
858 * be one of the last things we do before low-level modules like the
859 * buffer manager begin to close down. We need to have this in place
860 * before we begin our first transaction --- if we fail during the
861 * initialization transaction, as is entirely possible, we need the
862 * AbortTransaction call to clean up.
863 */
865
866 /* The autovacuum launcher is done here */
868 {
869 /* fill in the remainder of this entry in the PgBackendStatus array */
871
872 return;
873 }
874
875 /*
876 * Start a new transaction here before first access to db.
877 */
878 if (!bootstrap)
879 {
880 /* statement_timestamp must be set for timeouts to work correctly */
883
884 /*
885 * transaction_isolation will have been set to the default by the
886 * above. If the default is "serializable", and we are in hot
887 * standby, we will fail if we don't change it to something lower.
888 * Fortunately, "read committed" is plenty good enough.
889 */
891 }
892
893 /*
894 * Perform client authentication if necessary, then figure out our
895 * postgres user ID, and see if we are a superuser.
896 *
897 * In standalone mode, autovacuum worker processes and slot sync worker
898 * process, we use a fixed ID, otherwise we figure it out from the
899 * authenticated user name.
900 */
902 {
904 am_superuser = true;
905 }
906 else if (!IsUnderPostmaster)
907 {
909 am_superuser = true;
913 errmsg("no roles are defined in this database system"),
914 errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
915 username != NULL ? username : "postgres")));
916 }
918 {
919 if (username == NULL && !OidIsValid(useroid))
920 {
922 am_superuser = true;
923 }
924 else
925 {
927 (flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0);
929 }
930 }
931 else
932 {
933 /* normal multiuser case */
937 /* ensure that auth_method is actually valid, aka authn_id is not NULL */
942 }
943
944 /* Report any SSL/GSS details for the session. */
945 if (MyProcPort != NULL)
946 {
948
950 }
951
952 /*
953 * Binary upgrades only allowed super-user connections
954 */
956 {
959 errmsg("must be superuser to connect in binary upgrade mode")));
960 }
961
962 /*
963 * The last few regular connection slots are reserved for superusers and
964 * roles with privileges of pg_use_reserved_connections. We do not apply
965 * these limits to background processes, since they all have their own
966 * pools of PGPROC slots.
967 *
968 * Note: At this point, the new backend has already claimed a proc struct,
969 * so we must check whether the number of free slots is strictly less than
970 * the reserved connection limits.
971 */
975 {
979 errmsg("remaining connection slots are reserved for roles with the %s attribute",
980 "SUPERUSER")));
981
985 errmsg("remaining connection slots are reserved for roles with privileges of the \"%s\" role",
986 "pg_use_reserved_connections")));
987 }
988
989 /* Check replication permissions needed for walsender processes. */
990 if (am_walsender)
991 {
993
997 errmsg("permission denied to start WAL sender"),
998 errdetail("Only roles with the %s attribute may start a WAL sender process.",
999 "REPLICATION")));
1000 }
1001
1002 /*
1003 * If this is a plain walsender only supporting physical replication, we
1004 * don't want to connect to any particular database. Just finish the
1005 * backend startup by processing any options from the startup packet, and
1006 * we're done.
1007 */
1009 {
1010 /* process any options passed in the startup packet */
1011 if (MyProcPort != NULL)
1013
1014 /* Apply PostAuthDelay as soon as we've read all options */
1015 if (PostAuthDelay > 0)
1016 pg_usleep(PostAuthDelay * 1000000L);
1017
1018 /* initialize client encoding */
1020
1021 /* fill in the remainder of this entry in the PgBackendStatus array */
1023
1024 /* close the transaction we started above */
1026
1027 /* send any WARNINGs we've accumulated during initialization */
1029
1030 return;
1031 }
1032
1033 /*
1034 * Set up the global variables holding database id and default tablespace.
1035 * But note we won't actually try to touch the database just yet.
1036 *
1037 * We take a shortcut in the bootstrap case, otherwise we have to look up
1038 * the db's entry in pg_database.
1039 */
1040 if (bootstrap)
1041 {
1042 dboid = Template1DbOid;
1044 }
1045 else if (in_dbname != NULL)
1046 {
1047 HeapTuple tuple;
1049
1050 tuple = GetDatabaseTuple(in_dbname);
1051 if (!HeapTupleIsValid(tuple))
1052 ereport(FATAL,
1054 errmsg("database \"%s\" does not exist", in_dbname)));
1056 dboid = dbform->oid;
1057 }
1058 else if (!OidIsValid(dboid))
1059 {
1060 /*
1061 * If this is a background worker not bound to any particular
1062 * database, we're done now. Everything that follows only makes sense
1063 * if we are bound to a specific database. We do need to close the
1064 * transaction we started before returning.
1065 */
1066 if (!bootstrap)
1067 {
1070 }
1071 return;
1072 }
1073
1074 /*
1075 * Now, take a writer's lock on the database we are trying to connect to.
1076 * If there is a concurrently running DROP DATABASE on that database, this
1077 * will block us until it finishes (and has committed its update of
1078 * pg_database).
1079 *
1080 * Note that the lock is not held long, only until the end of this startup
1081 * transaction. This is OK since we will advertise our use of the
1082 * database in the ProcArray before dropping the lock (in fact, that's the
1083 * next thing to do). Anyone trying a DROP DATABASE after this point will
1084 * see us in the array once they have the lock. Ordering is important for
1085 * this because we don't want to advertise ourselves as being in this
1086 * database until we have the lock; otherwise we create what amounts to a
1087 * deadlock with CountOtherDBBackends().
1088 *
1089 * Note: use of RowExclusiveLock here is reasonable because we envision
1090 * our session as being a concurrent writer of the database. If we had a
1091 * way of declaring a session as being guaranteed-read-only, we could use
1092 * AccessShareLock for such sessions and thereby not conflict against
1093 * CREATE DATABASE.
1094 */
1095 if (!bootstrap)
1097
1098 /*
1099 * Recheck pg_database to make sure the target database hasn't gone away.
1100 * If there was a concurrent DROP DATABASE, this ensures we will die
1101 * cleanly without creating a mess.
1102 */
1103 if (!bootstrap)
1104 {
1105 HeapTuple tuple;
1107
1108 tuple = GetDatabaseTupleByOid(dboid);
1109 if (HeapTupleIsValid(tuple))
1111
1112 if (!HeapTupleIsValid(tuple) ||
1113 (in_dbname && namestrcmp(&datform->datname, in_dbname)))
1114 {
1115 if (in_dbname)
1116 ereport(FATAL,
1118 errmsg("database \"%s\" does not exist", in_dbname),
1119 errdetail("It seems to have just been dropped or renamed.")));
1120 else
1121 ereport(FATAL,
1123 errmsg("database %u does not exist", dboid)));
1124 }
1125
1126 strlcpy(dbname, NameStr(datform->datname), sizeof(dbname));
1127
1129 {
1130 ereport(FATAL,
1132 errmsg("cannot connect to invalid database \"%s\"", dbname),
1133 errhint("Use DROP DATABASE to drop invalid databases."));
1134 }
1135
1136 MyDatabaseTableSpace = datform->dattablespace;
1137 MyDatabaseHasLoginEventTriggers = datform->dathasloginevt;
1138 /* pass the database name back to the caller */
1139 if (out_dbname)
1141 }
1142
1143 /*
1144 * Now that we rechecked, we are certain to be connected to a database and
1145 * thus can set MyDatabaseId.
1146 *
1147 * It is important that MyDatabaseId only be set once we are sure that the
1148 * target database can no longer be concurrently dropped or renamed. For
1149 * example, without this guarantee, pgstat_update_dbstats() could create
1150 * entries for databases that were just dropped in the pgstat shutdown
1151 * callback, which could confuse other code paths like the autovacuum
1152 * scheduler.
1153 */
1154 MyDatabaseId = dboid;
1155
1156 /*
1157 * Now we can mark our PGPROC entry with the database ID.
1158 *
1159 * We assume this is an atomic store so no lock is needed; though actually
1160 * things would work fine even if it weren't atomic. Anyone searching the
1161 * ProcArray for this database's ID should hold the database lock, so they
1162 * would not be executing concurrently with this store. A process looking
1163 * for another database's ID could in theory see a chance match if it read
1164 * a partially-updated databaseId value; but as long as all such searches
1165 * wait and retry, as in CountOtherDBBackends(), they will certainly see
1166 * the correct value on their next try.
1167 */
1169
1170 /*
1171 * We established a catalog snapshot while reading pg_authid and/or
1172 * pg_database; but until we have set up MyDatabaseId, we won't react to
1173 * incoming sinval messages for unshared catalogs, so we won't realize it
1174 * if the snapshot has been invalidated. Assume it's no good anymore.
1175 */
1177
1178 /*
1179 * Now we should be able to access the database directory safely. Verify
1180 * it's there and looks reasonable.
1181 */
1183
1184 if (!bootstrap)
1185 {
1186 if (access(fullpath, F_OK) == -1)
1187 {
1188 if (errno == ENOENT)
1189 ereport(FATAL,
1191 errmsg("database \"%s\" does not exist",
1192 dbname),
1193 errdetail("The database subdirectory \"%s\" is missing.",
1194 fullpath)));
1195 else
1196 ereport(FATAL,
1198 errmsg("could not access directory \"%s\": %m",
1199 fullpath)));
1200 }
1201
1202 ValidatePgVersion(fullpath);
1203 }
1204
1205 SetDatabasePath(fullpath);
1206 pfree(fullpath);
1207
1208 /*
1209 * It's now possible to do real access to the system catalogs.
1210 *
1211 * Load relcache entries for the system catalogs. This must create at
1212 * least the minimum set of "nailed-in" cache entries.
1213 */
1215
1216 /* set up ACL framework (so CheckMyDatabase can check permissions) */
1218
1219 /*
1220 * Re-read the pg_database row for our database, check permissions and set
1221 * up database-specific GUC settings. We can't do this until all the
1222 * database-access infrastructure is up. (Also, it wants to know if the
1223 * user is a superuser, so the above stuff has to happen first.)
1224 */
1225 if (!bootstrap)
1227 (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0);
1228
1229 /*
1230 * Now process any command-line switches and any additional GUC variable
1231 * settings passed in the startup packet. We couldn't do this before
1232 * because we didn't know if client is a superuser.
1233 */
1234 if (MyProcPort != NULL)
1236
1237 /* Process pg_db_role_setting options */
1239
1240 /* Apply PostAuthDelay as soon as we've read all options */
1241 if (PostAuthDelay > 0)
1242 pg_usleep(PostAuthDelay * 1000000L);
1243
1244 /*
1245 * Initialize various default states that can't be set up until we've
1246 * selected the active user and gotten the right GUC settings.
1247 */
1248
1249 /* set default namespace search path */
1251
1252 /* initialize client encoding */
1254
1255 /* Initialize this backend's session state. */
1257
1258 /*
1259 * If this is an interactive session, load any libraries that should be
1260 * preloaded at backend start. Since those are determined by GUCs, this
1261 * can't happen until GUC settings are complete, but we want it to happen
1262 * during the initial transaction in case anything that requires database
1263 * access needs to be done.
1264 */
1265 if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0)
1267
1268 /* fill in the remainder of this entry in the PgBackendStatus array */
1269 if (!bootstrap)
1271
1272 /* close the transaction we started above */
1273 if (!bootstrap)
1275
1276 /* send any WARNINGs we've accumulated during initialization */
1278}
1279
1280/*
1281 * Process any command-line switches and any additional GUC variable
1282 * settings passed in the startup packet.
1283 */
1284static void
1286{
1289
1291
1292 /*
1293 * First process any command-line switches that were included in the
1294 * startup packet, if we are in a regular backend.
1295 */
1296 if (port->cmdline_options != NULL)
1297 {
1298 /*
1299 * The maximum possible number of commandline arguments that could
1300 * come from port->cmdline_options is (strlen + 1) / 2; see
1301 * pg_split_opts().
1302 */
1303 char **av;
1304 int maxac;
1305 int ac;
1306
1307 maxac = 2 + (strlen(port->cmdline_options) + 1) / 2;
1308
1309 av = palloc_array(char *, maxac);
1310 ac = 0;
1311
1312 av[ac++] = "postgres";
1313
1314 pg_split_opts(av, &ac, port->cmdline_options);
1315
1316 av[ac] = NULL;
1317
1318 Assert(ac < maxac);
1319
1321 }
1322
1323 /*
1324 * Process any additional GUC variable settings passed in startup packet.
1325 * These are handled exactly like command-line variables.
1326 */
1327 gucopts = list_head(port->guc_options);
1328 while (gucopts)
1329 {
1330 char *name;
1331 char *value;
1332
1333 name = lfirst(gucopts);
1334 gucopts = lnext(port->guc_options, gucopts);
1335
1336 value = lfirst(gucopts);
1337 gucopts = lnext(port->guc_options, gucopts);
1338
1340 }
1341}
1342
1343/*
1344 * Load GUC settings from pg_db_role_setting.
1345 *
1346 * We try specific settings for the database/role combination, as well as
1347 * general for this database and for this user.
1348 */
1349static void
1351{
1353 Snapshot snapshot;
1354
1355 if (!IsUnderPostmaster)
1356 return;
1357
1359
1360 /* read all the settings under the same snapshot for efficiency */
1362
1363 /* Later settings are ignored if set earlier. */
1365 ApplySetting(snapshot, InvalidOid, roleid, relsetting, PGC_S_USER);
1368
1369 UnregisterSnapshot(snapshot);
1371}
1372
1373/*
1374 * Backend-shutdown callback. Do cleanup that we want to be sure happens
1375 * before all the supporting modules begin to nail their doors shut via
1376 * their own callbacks.
1377 *
1378 * User-level cleanup, such as temp-relation removal and UNLISTEN, happens
1379 * via separate callbacks that execute before this one. We don't combine the
1380 * callbacks because we still want this one to happen if the user-level
1381 * cleanup fails.
1382 */
1383static void
1385{
1386 /* Make sure we've killed any active transaction */
1388
1389 /*
1390 * User locks are not released by transaction end, so be sure to release
1391 * them explicitly.
1392 */
1394}
1395
1396
1397/*
1398 * STATEMENT_TIMEOUT handler: trigger a query-cancel interrupt.
1399 */
1400static void
1402{
1403 int sig = SIGINT;
1404
1405 /*
1406 * During authentication the timeout is used to deal with
1407 * authentication_timeout - we want to quit in response to such timeouts.
1408 */
1410 sig = SIGTERM;
1411
1412#ifdef HAVE_SETSID
1413 /* try to signal whole process group */
1414 kill(-MyProcPid, sig);
1415#endif
1416 kill(MyProcPid, sig);
1417}
1418
1419/*
1420 * LOCK_TIMEOUT handler: trigger a query-cancel interrupt.
1421 */
1422static void
1424{
1425#ifdef HAVE_SETSID
1426 /* try to signal whole process group */
1428#endif
1430}
1431
1432static void
1439
1440static void
1447
1448static void
1455
1456static void
1463
1464static void
1471
1472/*
1473 * Returns true if at least one role is defined in this database cluster.
1474 */
1475static bool
1492
1493/*
1494 * Stores a warning message to be sent later via EmitConnectionWarnings().
1495 * Both msg and detail must be non-NULL.
1496 *
1497 * NB: Caller should ensure the strings are allocated in a long-lived context
1498 * like TopMemoryContext.
1499 */
1500void
1501StoreConnectionWarning(char *msg, char *detail)
1502{
1503 MemoryContext oldcontext;
1504
1505 Assert(msg);
1506 Assert(detail);
1507
1509 elog(ERROR, "StoreConnectionWarning() called after EmitConnectionWarnings()");
1510
1512
1515
1516 MemoryContextSwitchTo(oldcontext);
1517}
1518
1519/*
1520 * Sends the warning messages saved via StoreConnectionWarning() and frees the
1521 * strings and lists.
1522 *
1523 * NB: This can only be called once per backend.
1524 */
1525static void
1527{
1530
1532 elog(ERROR, "EmitConnectionWarnings() called more than once");
1533 else
1535
1538 {
1540 (errmsg("%s", (char *) lfirst(lc_msg)),
1541 errdetail("%s", (char *) lfirst(lc_detail))));
1542 }
1543
1546}
void initialize_acl(void)
Definition acl.c:5069
bool has_privs_of_role(Oid member, Oid role)
Definition acl.c:5314
@ ACLCHECK_OK
Definition acl.h:184
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
Definition aclchk.c:3879
void pgaio_init_backend(void)
Definition aio_init.c:238
void ClientAuthentication(Port *port)
Definition auth.c:374
int autovacuum_worker_slots
Definition autovacuum.c:124
TimestampTz GetCurrentTimestamp(void)
Definition timestamp.c:1639
uint32 log_connections
ConnectionTiming conn_timing
@ LOG_CONNECTION_AUTHORIZATION
void pgstat_bestart_security(void)
void pgstat_bestart_initial(void)
void pgstat_beinit(void)
void pgstat_bestart_final(void)
bool be_gssapi_get_auth(Port *port)
bool be_gssapi_get_enc(Port *port)
const char * be_gssapi_get_princ(Port *port)
bool be_gssapi_get_delegation(Port *port)
const char * be_tls_get_version(Port *port)
int be_tls_get_cipher_bits(Port *port)
const char * be_tls_get_cipher(Port *port)
void InitBufferManagerAccess(void)
Definition bufmgr.c:4216
#define TextDatumGetCString(d)
Definition builtins.h:99
#define NameStr(name)
Definition c.h:835
#define Min(x, y)
Definition c.h:1091
#define Max(x, y)
Definition c.h:1085
#define Assert(condition)
Definition c.h:943
uint32_t uint32
Definition c.h:624
#define OidIsValid(objectId)
Definition c.h:858
uint32 result
bool database_is_invalid_form(Form_pg_database datform)
Datum arg
Definition elog.c:1323
void DebugFileOpen(void)
Definition elog.c:2307
int errcode_for_file_access(void)
Definition elog.c:898
int errcode(int sqlerrcode)
Definition elog.c:875
#define _(x)
Definition elog.c:96
#define LOG
Definition elog.h:32
int errhint(const char *fmt,...) pg_attribute_printf(1
#define DEBUG3
Definition elog.h:29
int errdetail(const char *fmt,...) pg_attribute_printf(1
#define FATAL
Definition elog.h:42
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
#define WARNING
Definition elog.h:37
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
#define ereport(elevel,...)
Definition elog.h:152
void InitFileAccess(void)
Definition fd.c:904
void InitTemporaryFileAccess(void)
Definition fd.c:934
#define palloc_array(type, count)
Definition fe_memutils.h:76
void systable_endscan(SysScanDesc sysscan)
Definition genam.c:612
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition genam.c:523
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition genam.c:388
volatile sig_atomic_t IdleStatsUpdateTimeoutPending
Definition globals.c:42
bool MyDatabaseHasLoginEventTriggers
Definition globals.c:100
volatile sig_atomic_t InterruptPending
Definition globals.c:32
int MyCancelKeyLength
Definition globals.c:55
volatile sig_atomic_t IdleSessionTimeoutPending
Definition globals.c:39
bool IsBinaryUpgrade
Definition globals.c:123
volatile sig_atomic_t IdleInTransactionSessionTimeoutPending
Definition globals.c:37
volatile sig_atomic_t TransactionTimeoutPending
Definition globals.c:38
int MyProcPid
Definition globals.c:49
bool IsUnderPostmaster
Definition globals.c:122
int MaxConnections
Definition globals.c:145
Oid MyDatabaseTableSpace
Definition globals.c:98
int MaxBackends
Definition globals.c:149
uint8 MyCancelKey[MAX_CANCEL_KEY_LENGTH]
Definition globals.c:54
struct Port * MyProcPort
Definition globals.c:53
struct Latch * MyLatch
Definition globals.c:65
volatile sig_atomic_t CheckClientConnectionPending
Definition globals.c:35
int max_worker_processes
Definition globals.c:146
Oid MyDatabaseId
Definition globals.c:96
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition guc.c:4234
@ PGC_S_DYNAMIC_DEFAULT
Definition guc.h:114
@ PGC_S_GLOBAL
Definition guc.h:118
@ PGC_S_DATABASE
Definition guc.h:119
@ PGC_S_CLIENT
Definition guc.h:122
@ PGC_S_DATABASE_USER
Definition guc.h:121
@ PGC_S_USER
Definition guc.h:120
GucContext
Definition guc.h:72
@ PGC_INTERNAL
Definition guc.h:73
@ PGC_SU_BACKEND
Definition guc.h:76
@ PGC_BACKEND
Definition guc.h:77
char * HbaFileName
Definition guc_tables.c:584
bool load_ident(void)
Definition hba.c:2846
bool load_hba(void)
Definition hba.c:2452
const char * hba_authname(UserAuth auth_method)
Definition hba.c:2948
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
Definition heapam.c:1435
HeapTuple heap_copytuple(HeapTuple tuple)
Definition heaptuple.c:686
#define HeapTupleIsValid(tuple)
Definition htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
static struct @177 value
static char * username
Definition initdb.c:153
#define INJECTION_POINT(name, arg)
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:344
void SetLatch(Latch *latch)
Definition latch.c:290
List * lappend(List *list, void *datum)
Definition list.c:339
void list_free_deep(List *list)
Definition list.c:1560
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition lmgr.c:1088
void InitLockManagerAccess(void)
Definition lock.c:502
void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
Definition lock.c:2315
int max_locks_per_xact
Definition lock.c:56
int FastPathLockGroupsPerBackend
Definition lock.c:205
#define AccessShareLock
Definition lockdefs.h:36
#define RowExclusiveLock
Definition lockdefs.h:38
#define USER_LOCKMETHOD
Definition locktag.h:26
void InitializeProcessXLogLogicalInfo(void)
Definition logicalctl.c:174
void InitializeClientEncoding(void)
Definition mbutils.c:290
const char * GetDatabaseEncodingName(void)
Definition mbutils.c:1394
void SetDatabaseEncoding(int encoding)
Definition mbutils.c:1289
char * pstrdup(const char *in)
Definition mcxt.c:1781
void pfree(void *pointer)
Definition mcxt.c:1616
MemoryContext TopMemoryContext
Definition mcxt.c:166
MemoryContext PostmasterContext
Definition mcxt.c:168
#define AllocSetContextCreate
Definition memutils.h:129
#define ALLOCSET_DEFAULT_SIZES
Definition memutils.h:160
#define RESUME_INTERRUPTS()
Definition miscadmin.h:138
#define IsBootstrapProcessingMode()
Definition miscadmin.h:495
#define INIT_PG_LOAD_SESSION_LIBS
Definition miscadmin.h:517
#define AmAutoVacuumWorkerProcess()
Definition miscadmin.h:398
#define AmBackgroundWorkerProcess()
Definition miscadmin.h:399
#define AmLogicalSlotSyncWorkerProcess()
Definition miscadmin.h:401
#define HOLD_INTERRUPTS()
Definition miscadmin.h:136
#define AmAutoVacuumLauncherProcess()
Definition miscadmin.h:397
#define AmRegularBackendProcess()
Definition miscadmin.h:396
#define INIT_PG_OVERRIDE_ROLE_LOGIN
Definition miscadmin.h:519
#define AmDataChecksumsWorkerProcess()
Definition miscadmin.h:410
#define INIT_PG_OVERRIDE_ALLOW_CONNS
Definition miscadmin.h:518
void InitializeSessionUserId(const char *rolename, Oid roleid, bool bypass_login_check)
Definition miscinit.c:711
void InitializeSystemUser(const char *authn_id, const char *auth_method)
Definition miscinit.c:876
void InitializeSessionUserIdStandalone(void)
Definition miscinit.c:841
void process_session_preload_libraries(void)
Definition miscinit.c:1867
Oid GetUserId(void)
Definition miscinit.c:470
Oid GetSessionUserId(void)
Definition miscinit.c:509
void SetDatabasePath(const char *path)
Definition miscinit.c:284
ClientConnectionInfo MyClientConnectionInfo
Definition miscinit.c:1020
bool has_rolreplication(Oid roleid)
Definition miscinit.c:689
void ValidatePgVersion(const char *path)
Definition miscinit.c:1720
int namestrcmp(Name name, const char *str)
Definition name.c:247
void InitializeSearchPath(void)
Definition namespace.c:4808
static char * errmsg
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
#define ACL_CONNECT
Definition parsenodes.h:87
static uint32 pg_nextpower2_32(uint32 num)
#define NAMEDATALEN
static int sig
Definition pg_ctl.c:81
END_CATALOG_STRUCT typedef FormData_pg_database * Form_pg_database
void ApplySetting(Snapshot snapshot, Oid databaseid, Oid roleid, Relation relsetting, GucSource source)
#define lfirst(lc)
Definition pg_list.h:172
#define forboth(cell1, list1, cell2, list2)
Definition pg_list.h:550
static ListCell * list_head(const List *l)
Definition pg_list.h:128
static ListCell * lnext(const List *l, const ListCell *c)
Definition pg_list.h:375
char * get_collation_actual_version(char collprovider, const char *collcollate)
Definition pg_locale.c:1247
char * pg_perm_setlocale(int category, const char *locale)
Definition pg_locale.c:172
void init_database_collation(void)
Definition pg_locale.c:1131
static int port
Definition pg_regress.c:117
void pgstat_initialize(void)
Definition pgstat.c:669
void pgstat_before_server_shutdown(int code, Datum arg)
Definition pgstat.c:590
void InitPlanCache(void)
Definition plancache.c:148
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition strlcpy.c:45
void EnablePortalManager(void)
Definition portalmem.c:106
void process_postgres_switches(int argc, char *argv[], GucContext ctx, const char **dbname)
Definition postgres.c:3874
int PostAuthDelay
Definition postgres.c:105
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
uint64_t Datum
Definition postgres.h:70
static Datum CStringGetDatum(const char *X)
Definition postgres.h:383
#define InvalidOid
unsigned int Oid
static void ShutdownPostgres(int code, Datum arg)
Definition postinit.c:1384
static void IdleInTransactionSessionTimeoutHandler(void)
Definition postinit.c:1441
static void LockTimeoutHandler(void)
Definition postinit.c:1423
void InitializeMaxBackends(void)
Definition postinit.c:559
void pg_split_opts(char **argv, int *argcp, const char *optstr)
Definition postinit.c:501
static void IdleStatsUpdateTimeoutHandler(void)
Definition postinit.c:1457
static void process_settings(Oid databaseid, Oid roleid)
Definition postinit.c:1350
void BaseInit(void)
Definition postinit.c:616
void StoreConnectionWarning(char *msg, char *detail)
Definition postinit.c:1501
static void IdleSessionTimeoutHandler(void)
Definition postinit.c:1449
static void process_startup_options(Port *port, bool am_superuser)
Definition postinit.c:1285
static void StatementTimeoutHandler(void)
Definition postinit.c:1401
static void EmitConnectionWarnings(void)
Definition postinit.c:1526
static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections)
Definition postinit.c:332
static bool ThereIsAtLeastOneRole(void)
Definition postinit.c:1476
static void PerformAuthentication(Port *port)
Definition postinit.c:203
void InitializeFastPathLocks(void)
Definition postinit.c:584
static void ClientCheckTimeoutHandler(void)
Definition postinit.c:1465
static HeapTuple GetDatabaseTuple(const char *dbname)
Definition postinit.c:114
static HeapTuple GetDatabaseTupleByOid(Oid dboid)
Definition postinit.c:157
static List * ConnectionWarningDetails
Definition postinit.c:79
void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, uint32 flags, char *out_dbname)
Definition postinit.c:719
static bool ConnectionWarningsEmitted
Definition postinit.c:75
static void TransactionTimeoutHandler(void)
Definition postinit.c:1433
static List * ConnectionWarningMessages
Definition postinit.c:78
int ReservedConnections
Definition postmaster.c:231
bool ClientAuthInProgress
Definition postmaster.c:374
int AuthenticationTimeout
Definition postmaster.c:242
int SuperuserReservedConnections
Definition postmaster.c:230
static int fb(int x)
short access
#define FP_LOCK_GROUPS_PER_BACKEND_MAX
Definition proc.h:95
#define FP_LOCK_SLOTS_PER_GROUP
Definition proc.h:96
#define NUM_SPECIAL_WORKER_PROCS
Definition proc.h:514
int CountDBConnections(Oid databaseid)
Definition procarray.c:3671
#define MAX_BACKENDS
Definition procnumber.h:39
void ProcSignalInit(const uint8 *cancel_key, int cancel_key_len)
Definition procsignal.c:170
static void set_ps_display(const char *activity)
Definition ps_status.h:40
bool criticalSharedRelcachesBuilt
Definition relcache.c:148
void RelationCacheInitializePhase3(void)
Definition relcache.c:4099
void RelationCacheInitialize(void)
Definition relcache.c:3994
void RelationCacheInitializePhase2(void)
Definition relcache.c:4040
char * GetDatabasePath(Oid dbOid, Oid spcOid)
Definition relpath.c:110
void ReleaseAuxProcessResources(bool isCommit)
Definition resowner.c:1016
ResourceOwner CurrentResourceOwner
Definition resowner.c:173
void CreateAuxProcessResourceOwner(void)
Definition resowner.c:996
const char * quote_identifier(const char *ident)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition scankey.c:76
@ ForwardScanDirection
Definition sdir.h:28
struct @10::@11 av[32]
void InitializeSession(void)
Definition session.c:54
void pg_usleep(long microsec)
Definition signal.c:53
void SharedInvalBackendInit(bool sendOnly)
Definition sinvaladt.c:274
void ReplicationSlotInitialize(void)
Definition slot.c:240
void smgrinit(void)
Definition smgr.c:188
Snapshot GetCatalogSnapshot(Oid relid)
Definition snapmgr.c:385
void UnregisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:866
Snapshot RegisterSnapshot(Snapshot snapshot)
Definition snapmgr.c:824
void InvalidateCatalogSnapshot(void)
Definition snapmgr.c:455
PGPROC * MyProc
Definition proc.c:71
bool HaveNFreeProcs(int n, int *nfree)
Definition proc.c:787
void CheckDeadLockAlert(void)
Definition proc.c:1914
void InitProcessPhase2(void)
Definition proc.c:583
#define BTEqualStrategyNumber
Definition stratnum.h:31
char * dbname
Definition streamutil.c:49
void resetStringInfo(StringInfo str)
Definition stringinfo.c:126
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition stringinfo.c:145
void appendStringInfoChar(StringInfo str, char ch)
Definition stringinfo.c:242
void initStringInfo(StringInfo str)
Definition stringinfo.c:97
const char * authn_id
Definition libpq-be.h:99
TimestampTz auth_start
Definition pg_list.h:54
Oid databaseId
Definition proc.h:201
bool superuser(void)
Definition superuser.c:47
void InitSync(void)
Definition sync.c:125
void InitCatalogCache(void)
Definition syscache.c:111
void ReleaseSysCache(HeapTuple tuple)
Definition syscache.c:265
Datum SysCacheGetAttrNotNull(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber)
Definition syscache.c:626
HeapTuple SearchSysCache1(SysCacheIdentifier cacheId, Datum key1)
Definition syscache.c:221
Datum SysCacheGetAttr(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition syscache.c:596
void table_close(Relation relation, LOCKMODE lockmode)
Definition table.c:126
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition table.c:40
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
Definition tableam.c:113
static void table_endscan(TableScanDesc scan)
Definition tableam.h:1061
void enable_timeout_after(TimeoutId id, int delay_ms)
Definition timeout.c:560
void disable_timeout(TimeoutId id, bool keep_indicator)
Definition timeout.c:685
TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler)
Definition timeout.c:505
@ IDLE_SESSION_TIMEOUT
Definition timeout.h:35
@ IDLE_IN_TRANSACTION_SESSION_TIMEOUT
Definition timeout.h:33
@ LOCK_TIMEOUT
Definition timeout.h:28
@ STATEMENT_TIMEOUT
Definition timeout.h:29
@ DEADLOCK_TIMEOUT
Definition timeout.h:27
@ TRANSACTION_TIMEOUT
Definition timeout.h:34
@ IDLE_STATS_UPDATE_TIMEOUT
Definition timeout.h:36
@ CLIENT_CONNECTION_CHECK_TIMEOUT
Definition timeout.h:37
const char * name
bool am_walsender
Definition walsender.c:135
bool am_db_walsender
Definition walsender.c:138
int max_wal_senders
Definition walsender.c:141
#define kill(pid, sig)
Definition win32_port.h:490
void StartTransactionCommand(void)
Definition xact.c:3109
int XactIsoLevel
Definition xact.c:81
void SetCurrentStatementStartTimestamp(void)
Definition xact.c:916
void CommitTransactionCommand(void)
Definition xact.c:3207
void AbortOutOfAnyTransaction(void)
Definition xact.c:4913
#define XACT_READ_COMMITTED
Definition xact.h:37
void StartupXLOG(void)
Definition xlog.c:5851
void ShutdownXLOG(int code, Datum arg)
Definition xlog.c:7104
void InitLocalDataChecksumState(void)
Definition xlog.c:4966
void InitXLogInsert(void)