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
760
761 /*
762 * Initialize a local cache of the data_checksum_version, to be updated by
763 * the procsignal-based barriers.
764 *
765 * This intentionally happens after initializing the procsignal, otherwise
766 * we might miss a state change. This means we can get a barrier for the
767 * state we've just initialized.
768 *
769 * The postmaster (which is what gets forked into the new child process)
770 * does not handle barriers, therefore it may not have the current value
771 * of LocalDataChecksumVersion value (it'll have the value read from the
772 * control file, which may be arbitrarily old).
773 *
774 * NB: Even if the postmaster handled barriers, the value might still be
775 * stale, as it might have changed after this process forked.
776 */
778
779 /*
780 * Also set up timeout handlers needed for backend operation. We need
781 * these in every case except bootstrap.
782 */
783 if (!bootstrap)
784 {
795 }
796
797 /*
798 * If this is either a bootstrap process or a standalone backend, start up
799 * the XLOG machinery, and register to have it closed down at exit. In
800 * other cases, the startup process is responsible for starting up the
801 * XLOG machinery, and the checkpointer for closing it down.
802 */
804 {
805 /*
806 * We don't yet have an aux-process resource owner, but StartupXLOG
807 * and ShutdownXLOG will need one. Hence, create said resource owner
808 * (and register a callback to clean it up after ShutdownXLOG runs).
809 */
811
812 StartupXLOG();
813 /* Release (and warn about) any buffer pins leaked in StartupXLOG */
815 /* Reset CurrentResourceOwner to nothing for the moment */
817
818 /*
819 * Use before_shmem_exit() so that ShutdownXLOG() can rely on DSM
820 * segments etc to work (which in turn is required for pgstats).
821 */
824 }
825
826 /*
827 * Initialize the relation cache and the system catalog caches. Note that
828 * no catalog access happens here; we only set up the hashtable structure.
829 * We must do this before starting a transaction because transaction abort
830 * would try to touch these hashtables.
831 */
835
836 /* Initialize portal manager */
838
839 /*
840 * Load relcache entries for the shared system catalogs. This must create
841 * at least entries for pg_database and catalogs used for authentication.
842 */
844
845 /*
846 * Set up process-exit callback to do pre-shutdown cleanup. This is one
847 * of the first before_shmem_exit callbacks we register; thus, this will
848 * be one of the last things we do before low-level modules like the
849 * buffer manager begin to close down. We need to have this in place
850 * before we begin our first transaction --- if we fail during the
851 * initialization transaction, as is entirely possible, we need the
852 * AbortTransaction call to clean up.
853 */
855
856 /* The autovacuum launcher is done here */
858 {
859 /* fill in the remainder of this entry in the PgBackendStatus array */
861
862 return;
863 }
864
865 /*
866 * Start a new transaction here before first access to db.
867 */
868 if (!bootstrap)
869 {
870 /* statement_timestamp must be set for timeouts to work correctly */
873
874 /*
875 * transaction_isolation will have been set to the default by the
876 * above. If the default is "serializable", and we are in hot
877 * standby, we will fail if we don't change it to something lower.
878 * Fortunately, "read committed" is plenty good enough.
879 */
881 }
882
883 /*
884 * Perform client authentication if necessary, then figure out our
885 * postgres user ID, and see if we are a superuser.
886 *
887 * In standalone mode, autovacuum worker processes and slot sync worker
888 * process, we use a fixed ID, otherwise we figure it out from the
889 * authenticated user name.
890 */
892 {
894 am_superuser = true;
895 }
896 else if (!IsUnderPostmaster)
897 {
899 am_superuser = true;
903 errmsg("no roles are defined in this database system"),
904 errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.",
905 username != NULL ? username : "postgres")));
906 }
908 {
909 if (username == NULL && !OidIsValid(useroid))
910 {
912 am_superuser = true;
913 }
914 else
915 {
917 (flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0);
919 }
920 }
921 else
922 {
923 /* normal multiuser case */
927 /* ensure that auth_method is actually valid, aka authn_id is not NULL */
932 }
933
934 /* Report any SSL/GSS details for the session. */
935 if (MyProcPort != NULL)
936 {
938
940 }
941
942 /*
943 * Binary upgrades only allowed super-user connections
944 */
946 {
949 errmsg("must be superuser to connect in binary upgrade mode")));
950 }
951
952 /*
953 * The last few regular connection slots are reserved for superusers and
954 * roles with privileges of pg_use_reserved_connections. We do not apply
955 * these limits to background processes, since they all have their own
956 * pools of PGPROC slots.
957 *
958 * Note: At this point, the new backend has already claimed a proc struct,
959 * so we must check whether the number of free slots is strictly less than
960 * the reserved connection limits.
961 */
965 {
969 errmsg("remaining connection slots are reserved for roles with the %s attribute",
970 "SUPERUSER")));
971
975 errmsg("remaining connection slots are reserved for roles with privileges of the \"%s\" role",
976 "pg_use_reserved_connections")));
977 }
978
979 /* Check replication permissions needed for walsender processes. */
980 if (am_walsender)
981 {
983
987 errmsg("permission denied to start WAL sender"),
988 errdetail("Only roles with the %s attribute may start a WAL sender process.",
989 "REPLICATION")));
990 }
991
992 /*
993 * If this is a plain walsender only supporting physical replication, we
994 * don't want to connect to any particular database. Just finish the
995 * backend startup by processing any options from the startup packet, and
996 * we're done.
997 */
999 {
1000 /* process any options passed in the startup packet */
1001 if (MyProcPort != NULL)
1003
1004 /* Apply PostAuthDelay as soon as we've read all options */
1005 if (PostAuthDelay > 0)
1006 pg_usleep(PostAuthDelay * 1000000L);
1007
1008 /* initialize client encoding */
1010
1011 /* fill in the remainder of this entry in the PgBackendStatus array */
1013
1014 /* close the transaction we started above */
1016
1017 /* send any WARNINGs we've accumulated during initialization */
1019
1020 return;
1021 }
1022
1023 /*
1024 * Set up the global variables holding database id and default tablespace.
1025 * But note we won't actually try to touch the database just yet.
1026 *
1027 * We take a shortcut in the bootstrap case, otherwise we have to look up
1028 * the db's entry in pg_database.
1029 */
1030 if (bootstrap)
1031 {
1032 dboid = Template1DbOid;
1034 }
1035 else if (in_dbname != NULL)
1036 {
1037 HeapTuple tuple;
1039
1040 tuple = GetDatabaseTuple(in_dbname);
1041 if (!HeapTupleIsValid(tuple))
1042 ereport(FATAL,
1044 errmsg("database \"%s\" does not exist", in_dbname)));
1046 dboid = dbform->oid;
1047 }
1048 else if (!OidIsValid(dboid))
1049 {
1050 /*
1051 * If this is a background worker not bound to any particular
1052 * database, we're done now. Everything that follows only makes sense
1053 * if we are bound to a specific database. We do need to close the
1054 * transaction we started before returning.
1055 */
1056 if (!bootstrap)
1057 {
1060 }
1061 return;
1062 }
1063
1064 /*
1065 * Now, take a writer's lock on the database we are trying to connect to.
1066 * If there is a concurrently running DROP DATABASE on that database, this
1067 * will block us until it finishes (and has committed its update of
1068 * pg_database).
1069 *
1070 * Note that the lock is not held long, only until the end of this startup
1071 * transaction. This is OK since we will advertise our use of the
1072 * database in the ProcArray before dropping the lock (in fact, that's the
1073 * next thing to do). Anyone trying a DROP DATABASE after this point will
1074 * see us in the array once they have the lock. Ordering is important for
1075 * this because we don't want to advertise ourselves as being in this
1076 * database until we have the lock; otherwise we create what amounts to a
1077 * deadlock with CountOtherDBBackends().
1078 *
1079 * Note: use of RowExclusiveLock here is reasonable because we envision
1080 * our session as being a concurrent writer of the database. If we had a
1081 * way of declaring a session as being guaranteed-read-only, we could use
1082 * AccessShareLock for such sessions and thereby not conflict against
1083 * CREATE DATABASE.
1084 */
1085 if (!bootstrap)
1087
1088 /*
1089 * Recheck pg_database to make sure the target database hasn't gone away.
1090 * If there was a concurrent DROP DATABASE, this ensures we will die
1091 * cleanly without creating a mess.
1092 */
1093 if (!bootstrap)
1094 {
1095 HeapTuple tuple;
1097
1098 tuple = GetDatabaseTupleByOid(dboid);
1099 if (HeapTupleIsValid(tuple))
1101
1102 if (!HeapTupleIsValid(tuple) ||
1103 (in_dbname && namestrcmp(&datform->datname, in_dbname)))
1104 {
1105 if (in_dbname)
1106 ereport(FATAL,
1108 errmsg("database \"%s\" does not exist", in_dbname),
1109 errdetail("It seems to have just been dropped or renamed.")));
1110 else
1111 ereport(FATAL,
1113 errmsg("database %u does not exist", dboid)));
1114 }
1115
1116 strlcpy(dbname, NameStr(datform->datname), sizeof(dbname));
1117
1119 {
1120 ereport(FATAL,
1122 errmsg("cannot connect to invalid database \"%s\"", dbname),
1123 errhint("Use DROP DATABASE to drop invalid databases."));
1124 }
1125
1126 MyDatabaseTableSpace = datform->dattablespace;
1127 MyDatabaseHasLoginEventTriggers = datform->dathasloginevt;
1128 /* pass the database name back to the caller */
1129 if (out_dbname)
1131 }
1132
1133 /*
1134 * Now that we rechecked, we are certain to be connected to a database and
1135 * thus can set MyDatabaseId.
1136 *
1137 * It is important that MyDatabaseId only be set once we are sure that the
1138 * target database can no longer be concurrently dropped or renamed. For
1139 * example, without this guarantee, pgstat_update_dbstats() could create
1140 * entries for databases that were just dropped in the pgstat shutdown
1141 * callback, which could confuse other code paths like the autovacuum
1142 * scheduler.
1143 */
1144 MyDatabaseId = dboid;
1145
1146 /*
1147 * Now we can mark our PGPROC entry with the database ID.
1148 *
1149 * We assume this is an atomic store so no lock is needed; though actually
1150 * things would work fine even if it weren't atomic. Anyone searching the
1151 * ProcArray for this database's ID should hold the database lock, so they
1152 * would not be executing concurrently with this store. A process looking
1153 * for another database's ID could in theory see a chance match if it read
1154 * a partially-updated databaseId value; but as long as all such searches
1155 * wait and retry, as in CountOtherDBBackends(), they will certainly see
1156 * the correct value on their next try.
1157 */
1159
1160 /*
1161 * We established a catalog snapshot while reading pg_authid and/or
1162 * pg_database; but until we have set up MyDatabaseId, we won't react to
1163 * incoming sinval messages for unshared catalogs, so we won't realize it
1164 * if the snapshot has been invalidated. Assume it's no good anymore.
1165 */
1167
1168 /*
1169 * Now we should be able to access the database directory safely. Verify
1170 * it's there and looks reasonable.
1171 */
1173
1174 if (!bootstrap)
1175 {
1176 if (access(fullpath, F_OK) == -1)
1177 {
1178 if (errno == ENOENT)
1179 ereport(FATAL,
1181 errmsg("database \"%s\" does not exist",
1182 dbname),
1183 errdetail("The database subdirectory \"%s\" is missing.",
1184 fullpath)));
1185 else
1186 ereport(FATAL,
1188 errmsg("could not access directory \"%s\": %m",
1189 fullpath)));
1190 }
1191
1192 ValidatePgVersion(fullpath);
1193 }
1194
1195 SetDatabasePath(fullpath);
1196 pfree(fullpath);
1197
1198 /*
1199 * It's now possible to do real access to the system catalogs.
1200 *
1201 * Load relcache entries for the system catalogs. This must create at
1202 * least the minimum set of "nailed-in" cache entries.
1203 */
1205
1206 /* set up ACL framework (so CheckMyDatabase can check permissions) */
1208
1209 /*
1210 * Re-read the pg_database row for our database, check permissions and set
1211 * up database-specific GUC settings. We can't do this until all the
1212 * database-access infrastructure is up. (Also, it wants to know if the
1213 * user is a superuser, so the above stuff has to happen first.)
1214 */
1215 if (!bootstrap)
1217 (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0);
1218
1219 /*
1220 * Now process any command-line switches and any additional GUC variable
1221 * settings passed in the startup packet. We couldn't do this before
1222 * because we didn't know if client is a superuser.
1223 */
1224 if (MyProcPort != NULL)
1226
1227 /* Process pg_db_role_setting options */
1229
1230 /* Apply PostAuthDelay as soon as we've read all options */
1231 if (PostAuthDelay > 0)
1232 pg_usleep(PostAuthDelay * 1000000L);
1233
1234 /*
1235 * Initialize various default states that can't be set up until we've
1236 * selected the active user and gotten the right GUC settings.
1237 */
1238
1239 /* set default namespace search path */
1241
1242 /* initialize client encoding */
1244
1245 /* Initialize this backend's session state. */
1247
1248 /*
1249 * If this is an interactive session, load any libraries that should be
1250 * preloaded at backend start. Since those are determined by GUCs, this
1251 * can't happen until GUC settings are complete, but we want it to happen
1252 * during the initial transaction in case anything that requires database
1253 * access needs to be done.
1254 */
1255 if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0)
1257
1258 /* fill in the remainder of this entry in the PgBackendStatus array */
1259 if (!bootstrap)
1261
1262 /* close the transaction we started above */
1263 if (!bootstrap)
1265
1266 /* send any WARNINGs we've accumulated during initialization */
1268}
1269
1270/*
1271 * Process any command-line switches and any additional GUC variable
1272 * settings passed in the startup packet.
1273 */
1274static void
1276{
1279
1281
1282 /*
1283 * First process any command-line switches that were included in the
1284 * startup packet, if we are in a regular backend.
1285 */
1286 if (port->cmdline_options != NULL)
1287 {
1288 /*
1289 * The maximum possible number of commandline arguments that could
1290 * come from port->cmdline_options is (strlen + 1) / 2; see
1291 * pg_split_opts().
1292 */
1293 char **av;
1294 int maxac;
1295 int ac;
1296
1297 maxac = 2 + (strlen(port->cmdline_options) + 1) / 2;
1298
1299 av = palloc_array(char *, maxac);
1300 ac = 0;
1301
1302 av[ac++] = "postgres";
1303
1304 pg_split_opts(av, &ac, port->cmdline_options);
1305
1306 av[ac] = NULL;
1307
1308 Assert(ac < maxac);
1309
1311 }
1312
1313 /*
1314 * Process any additional GUC variable settings passed in startup packet.
1315 * These are handled exactly like command-line variables.
1316 */
1317 gucopts = list_head(port->guc_options);
1318 while (gucopts)
1319 {
1320 char *name;
1321 char *value;
1322
1323 name = lfirst(gucopts);
1324 gucopts = lnext(port->guc_options, gucopts);
1325
1326 value = lfirst(gucopts);
1327 gucopts = lnext(port->guc_options, gucopts);
1328
1330 }
1331}
1332
1333/*
1334 * Load GUC settings from pg_db_role_setting.
1335 *
1336 * We try specific settings for the database/role combination, as well as
1337 * general for this database and for this user.
1338 */
1339static void
1341{
1343 Snapshot snapshot;
1344
1345 if (!IsUnderPostmaster)
1346 return;
1347
1349
1350 /* read all the settings under the same snapshot for efficiency */
1352
1353 /* Later settings are ignored if set earlier. */
1355 ApplySetting(snapshot, InvalidOid, roleid, relsetting, PGC_S_USER);
1358
1359 UnregisterSnapshot(snapshot);
1361}
1362
1363/*
1364 * Backend-shutdown callback. Do cleanup that we want to be sure happens
1365 * before all the supporting modules begin to nail their doors shut via
1366 * their own callbacks.
1367 *
1368 * User-level cleanup, such as temp-relation removal and UNLISTEN, happens
1369 * via separate callbacks that execute before this one. We don't combine the
1370 * callbacks because we still want this one to happen if the user-level
1371 * cleanup fails.
1372 */
1373static void
1375{
1376 /* Make sure we've killed any active transaction */
1378
1379 /*
1380 * User locks are not released by transaction end, so be sure to release
1381 * them explicitly.
1382 */
1384}
1385
1386
1387/*
1388 * STATEMENT_TIMEOUT handler: trigger a query-cancel interrupt.
1389 */
1390static void
1392{
1393 int sig = SIGINT;
1394
1395 /*
1396 * During authentication the timeout is used to deal with
1397 * authentication_timeout - we want to quit in response to such timeouts.
1398 */
1400 sig = SIGTERM;
1401
1402#ifdef HAVE_SETSID
1403 /* try to signal whole process group */
1404 kill(-MyProcPid, sig);
1405#endif
1406 kill(MyProcPid, sig);
1407}
1408
1409/*
1410 * LOCK_TIMEOUT handler: trigger a query-cancel interrupt.
1411 */
1412static void
1414{
1415#ifdef HAVE_SETSID
1416 /* try to signal whole process group */
1418#endif
1420}
1421
1422static void
1429
1430static void
1437
1438static void
1445
1446static void
1453
1454static void
1461
1462/*
1463 * Returns true if at least one role is defined in this database cluster.
1464 */
1465static bool
1482
1483/*
1484 * Stores a warning message to be sent later via EmitConnectionWarnings().
1485 * Both msg and detail must be non-NULL.
1486 *
1487 * NB: Caller should ensure the strings are allocated in a long-lived context
1488 * like TopMemoryContext.
1489 */
1490void
1491StoreConnectionWarning(char *msg, char *detail)
1492{
1493 MemoryContext oldcontext;
1494
1495 Assert(msg);
1496 Assert(detail);
1497
1499 elog(ERROR, "StoreConnectionWarning() called after EmitConnectionWarnings()");
1500
1502
1505
1506 MemoryContextSwitchTo(oldcontext);
1507}
1508
1509/*
1510 * Sends the warning messages saved via StoreConnectionWarning() and frees the
1511 * strings and lists.
1512 *
1513 * NB: This can only be called once per backend.
1514 */
1515static void
1517{
1520
1522 elog(ERROR, "EmitConnectionWarnings() called more than once");
1523 else
1525
1528 {
1530 (errmsg("%s", (char *) lfirst(lc_msg)),
1531 errdetail("%s", (char *) lfirst(lc_detail))));
1532 }
1533
1536}
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:1322
void DebugFileOpen(void)
Definition elog.c:2306
int errcode_for_file_access(void)
Definition elog.c:897
int errcode(int sqlerrcode)
Definition elog.c:874
#define _(x)
Definition elog.c:95
#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:503
void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
Definition lock.c:2316
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 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 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:3863
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:370
#define InvalidOid
unsigned int Oid
static void ShutdownPostgres(int code, Datum arg)
Definition postinit.c:1374
static void IdleInTransactionSessionTimeoutHandler(void)
Definition postinit.c:1431
static void LockTimeoutHandler(void)
Definition postinit.c:1413
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:1447
static void process_settings(Oid databaseid, Oid roleid)
Definition postinit.c:1340
void BaseInit(void)
Definition postinit.c:616
void StoreConnectionWarning(char *msg, char *detail)
Definition postinit.c:1491
static void IdleSessionTimeoutHandler(void)
Definition postinit.c:1439
static void process_startup_options(Port *port, bool am_superuser)
Definition postinit.c:1275
static void StatementTimeoutHandler(void)
Definition postinit.c:1391
static void EmitConnectionWarnings(void)
Definition postinit.c:1516
static void CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connections)
Definition postinit.c:332
static bool ThereIsAtLeastOneRole(void)
Definition postinit.c:1466
static void PerformAuthentication(Port *port)
Definition postinit.c:203
void InitializeFastPathLocks(void)
Definition postinit.c:584
static void ClientCheckTimeoutHandler(void)
Definition postinit.c:1455
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:1423
static List * ConnectionWarningMessages
Definition postinit.c:78
int ReservedConnections
Definition postmaster.c:231
bool ClientAuthInProgress
Definition postmaster.c:373
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:5846
void ShutdownXLOG(int code, Datum arg)
Definition xlog.c:7098
void InitLocalDataChecksumState(void)
Definition xlog.c:4961
void InitXLogInsert(void)