postgresql/src/include/utils
Heikki Linnakangas b8bff07daa Make ResourceOwners more easily extensible.
Instead of having a separate array/hash for each resource kind, use a
single array and hash to hold all kinds of resources. This makes it
possible to introduce new resource "kinds" without having to modify
the ResourceOwnerData struct. In particular, this makes it possible
for extensions to register custom resource kinds.

The old approach was to have a small array of resources of each kind,
and if it fills up, switch to a hash table. The new approach also uses
an array and a hash, but now the array and the hash are used at the
same time. The array is used to hold the recently added resources, and
when it fills up, they are moved to the hash. This keeps the access to
recent entries fast, even when there are a lot of long-held resources.

All the resource-specific ResourceOwnerEnlarge*(),
ResourceOwnerRemember*(), and ResourceOwnerForget*() functions have
been replaced with three generic functions that take resource kind as
argument. For convenience, we still define resource-specific wrapper
macros around the generic functions with the old names, but they are
now defined in the source files that use those resource kinds.

The release callback no longer needs to call ResourceOwnerForget on
the resource being released. ResourceOwnerRelease unregisters the
resource from the owner before calling the callback. That needed some
changes in bufmgr.c and some other files, where releasing the
resources previously always called ResourceOwnerForget.

Each resource kind specifies a release priority, and
ResourceOwnerReleaseAll releases the resources in priority order. To
make that possible, we have to restrict what you can do between
phases. After calling ResourceOwnerRelease(), you are no longer
allowed to remember any more resources in it or to forget any
previously remembered resources by calling ResourceOwnerForget.  There
was one case where that was done previously. At subtransaction commit,
AtEOSubXact_Inval() would handle the invalidation messages and call
RelationFlushRelation(), which temporarily increased the reference
count on the relation being flushed. We now switch to the parent
subtransaction's resource owner before calling AtEOSubXact_Inval(), so
that there is a valid ResourceOwner to temporarily hold that relcache
reference.

Other end-of-xact routines make similar calls to AtEOXact_Inval()
between release phases, but I didn't see any regression test failures
from those, so I'm not sure if they could reach a codepath that needs
remembering extra resources.

There were two exceptions to how the resource leak WARNINGs on commit
were printed previously: llvmjit silently released the context without
printing the warning, and a leaked buffer io triggered a PANIC. Now
everything prints a WARNING, including those cases.

Add tests in src/test/modules/test_resowner.

Reviewed-by: Aleksander Alekseev, Michael Paquier, Julien Rouhaud
Reviewed-by: Kyotaro Horiguchi, Hayato Kuroda, Álvaro Herrera, Zhihong Yu
Reviewed-by: Peter Eisentraut, Andres Freund
Discussion: https://www.postgresql.org/message-id/cbfabeb0-cd3c-e951-a572-19b365ed314d%40iki.fi
2023-11-08 13:30:50 +02:00
..
.gitignore Generate automatically code and documentation related to wait events 2023-07-05 10:53:11 +09:00
acl.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
aclchk_internal.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
array.h Detect integer overflow while computing new array dimensions. 2023-11-06 10:56:43 -05:00
arrayaccess.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
ascii.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
attoptcache.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
backend_progress.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
backend_status.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
builtins.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
bytea.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
cash.h Convert *GetDatum() and DatumGet*() macros to inline functions 2022-09-27 20:50:21 +02:00
catcache.h Make ResourceOwners more easily extensible. 2023-11-08 13:30:50 +02:00
combocid.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
conffiles.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
date.h Add back SQLValueFunction for SQL keywords 2023-05-17 10:19:17 +09:00
datetime.h Refactor datetime functions' timezone lookup code to reduce duplication. 2023-03-17 17:47:19 -04:00
datum.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
dsa.h Avoid type cheats for invalid dsa_handles and dshash_table_handles. 2023-01-25 11:48:38 -05:00
dynahash.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
elog.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
evtcache.h Add support event triggers on authenticated login 2023-10-16 03:18:22 +03:00
expandeddatum.h New header varatt.h split off from postgres.h 2023-01-10 05:54:36 +01:00
expandedrecord.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
float.h Doc: improve commentary about providing our own definitions of M_PI. 2023-01-08 16:25:33 -05:00
fmgrtab.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
formatting.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
freepage.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
geo_decls.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
guc.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
guc_hooks.h Improve the naming in wal_sync_method code. 2023-10-13 15:16:45 -05:00
guc_tables.h Be more wary about NULL values for GUC string variables. 2023-11-02 11:47:33 -04:00
help_config.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
hsearch.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
index_selfuncs.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
inet.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
inval.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
json.h Add const to values and nulls arguments 2023-10-10 07:50:43 +02:00
jsonb.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
jsonfuncs.h Improve JsonLexContext's freeability 2023-10-05 10:59:08 +02:00
jsonpath.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
logtape.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
lsyscache.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
memdebug.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
memutils.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
memutils_internal.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
memutils_memorychunk.h Fix various typos 2023-04-18 13:23:23 +12:00
meson.build Add system view pg_wait_events 2023-08-20 15:35:02 +09:00
multirangetypes.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
numeric.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
palloc.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
partcache.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
pg_crc.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
pg_locale.h All supported systems have locale_t. 2023-07-09 11:55:18 +12:00
pg_lsn.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
pg_rusage.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
pgstat_internal.h Fix various typos and incorrect/outdated name references 2023-04-19 13:50:33 +12:00
pidfile.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
plancache.h Make ResourceOwners more easily extensible. 2023-11-08 13:30:50 +02:00
portal.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
ps_status.h Speedup and increase usability of set proc title functions 2023-02-20 16:18:27 +13:00
queryenvironment.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
rangetypes.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
regproc.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
rel.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
relcache.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
relfilenumbermap.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
relmapper.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
relptr.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
reltrigger.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
resowner.h Make ResourceOwners more easily extensible. 2023-11-08 13:30:50 +02:00
resowner_private.h bufmgr: Support multiple in-progress IOs by using resowner 2023-04-05 14:17:55 -07:00
rls.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
ruleutils.h pageinspect: Fix gist_page_items() with included columns 2023-05-19 12:37:58 +09:00
sampling.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
selfuncs.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
sharedtuplestore.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
snapmgr.h Remove the "snapshot too old" feature. 2023-09-05 19:53:43 +12:00
snapshot.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
sortsupport.h Fix various typos and incorrect/outdated name references 2023-04-19 13:50:33 +12:00
spccache.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
syscache.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
timeout.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
timestamp.h Add back SQLValueFunction for SQL keywords 2023-05-17 10:19:17 +09:00
tuplesort.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
tuplestore.h Add const to values and nulls arguments 2023-10-10 07:50:43 +02:00
typcache.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
tzparser.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
usercontext.h Perform logical replication actions as the table owner. 2023-04-04 11:25:23 -04:00
uuid.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
varbit.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
varlena.h Pre-beta mechanical code beautification. 2023-05-19 17:24:48 -04:00
wait_event.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00
xid8.h Update copyright for 2023 2023-01-02 15:00:37 -05:00
xml.h Add trailing commas to enum definitions 2023-10-26 09:20:54 +02:00