1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-30 11:03:19 +03:00

Support custom wait events for wait event type "Extension"

Two backend routines are added to allow extension to allocate and define
custom wait events, all of these being allocated in the type
"Extension":
* WaitEventExtensionNew(), that allocates a wait event ID computed from
a counter in shared memory.
* WaitEventExtensionRegisterName(), to associate a custom string to the
wait event ID allocated.

Note that this includes an example of how to use this new facility in
worker_spi with tests in TAP for various scenarios, and some
documentation about how to use them.

Any code in the tree that currently uses WAIT_EVENT_EXTENSION could
switch to this new facility to define custom wait events.  This is left
as work for future patches.

Author: Masahiro Ikeda
Reviewed-by: Andres Freund, Michael Paquier, Tristan Partin, Bharath
Rupireddy
Discussion: https://postgr.es/m/b9f5411acda0cf15c8fbb767702ff43e@oss.nttdata.com
This commit is contained in:
Michael Paquier
2023-07-31 17:09:24 +09:00
parent 39055cb4cc
commit c9af054653
11 changed files with 393 additions and 23 deletions

View File

@ -1117,11 +1117,14 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
<note>
<para>
Extensions can add <literal>LWLock</literal> types to the list shown in
<xref linkend="wait-event-lwlock-table"/>. In some cases, the name
Extensions can add <literal>Extension</literal> and
<literal>LWLock</literal> types
to the list shown in <xref linkend="wait-event-extension-table"/> and
<xref linkend="wait-event-lwlock-table"/>. In some cases, the name
assigned by an extension will not be available in all server processes;
so an <literal>LWLock</literal> wait event might be reported as
just <quote><literal>extension</literal></quote> rather than the
so an <literal>Extension</literal> or <literal>LWLock</literal> wait
event might be reported as just
<quote><literal>extension</literal></quote> rather than the
extension-assigned name.
</para>
</note>

View File

@ -3453,6 +3453,51 @@ if (!ptr)
</para>
</sect2>
<sect2 id="xfunc-addin-wait-events">
<title>Shared Memory and Custom Wait Events</title>
<para>
Add-ins can define custom wait events under the wait event type
<literal>Extension</literal>. The add-in's shared library must be
preloaded by specifying it in <literal>shared_preload_libraries</literal>,
and register a <literal>shmem_request_hook</literal> and a
<literal>shmem_startup_hook</literal> in its
<function>_PG_init</function> function.
<literal>shmem_request_hook</literal> can request a shared memory size
to be later used at startup by calling:
<programlisting>
void RequestAddinShmemSpace(int size)
</programlisting>
</para>
<para>
<literal>shmem_startup_hook</literal> can allocate in shared memory
custom wait events by calling while holding the LWLock
<function>AddinShmemInitLock</function> to avoid any race conditions:
<programlisting>
uint32 WaitEventExtensionNew(void)
</programlisting>
Next, each process needs to associate the wait event allocated previously
to a user-facing custom string, which is something done by calling:
<programlisting>
void WaitEventExtensionRegisterName(uint32 wait_event_info, const char *wait_event_name)
</programlisting>
An example can be found in <filename>src/test/modules/worker_spi</filename>
in the PostgreSQL source tree.
</para>
<para>
Custom wait events can be viewed in
<link linkend="monitoring-pg-stat-activity-view"><structname>pg_stat_activity</structname></link>:
<screen>
=# SELECT wait_event_type, wait_event FROM pg_stat_activity
WHERE backend_type ~ 'worker_spi';
wait_event_type | wait_event
-----------------+-----------------
Extension | worker_spi_main
(1 row)
</screen>
</para>
</sect2>
<sect2 id="extend-cpp">
<title>Using C++ for Extensibility</title>