diff options
author | Michael Paquier <michael@paquier.xyz> | 2023-10-05 09:50:42 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2023-10-05 09:50:42 +0900 |
commit | d61f2538a39f1dbeead01bc972fca597c769f518 (patch) | |
tree | ee576a27ee113919126403007bc69e183817bdb6 | |
parent | 684d9bfdd5a6e6e368133707c678a2e2a984cc4e (diff) | |
download | postgresql-d61f2538a39f1dbeead01bc972fca597c769f518.tar.gz postgresql-d61f2538a39f1dbeead01bc972fca597c769f518.zip |
postgres_fdw: Replace WAIT_EVENT_EXTENSION with custom wait events
Three custom wait events are added here:
- "PostgresFdwCleanupResult", waiting while cleaning up PQgetResult() on
transaction abort.
- "PostgresFdwConnect", waiting to establish a connection to a remote
server.
- "PostgresFdwGetResult", waiting to receive a result from a remote
server.
Author: Masahiro Ikeda
Discussion: https://postgr.es/m/197bce267fa691a0ac62c86c4ab904c4@oss.nttdata.com
-rw-r--r-- | contrib/postgres_fdw/connection.c | 23 | ||||
-rw-r--r-- | doc/src/sgml/postgres-fdw.sgml | 38 |
2 files changed, 58 insertions, 3 deletions
diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 7e12b722ec9..5800c6a9fb3 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -83,6 +83,11 @@ static unsigned int prep_stmt_number = 0; /* tracks whether any work is needed in callback functions */ static bool xact_got_connection = false; +/* custom wait event values, retrieved from shared memory */ +static uint32 pgfdw_we_cleanup_result = 0; +static uint32 pgfdw_we_connect = 0; +static uint32 pgfdw_we_get_result = 0; + /* * Milliseconds to wait to cancel an in-progress query or execute a cleanup * query; if it takes longer than 30 seconds to do these, we assume the @@ -527,10 +532,14 @@ connect_pg_server(ForeignServer *server, UserMapping *user) /* verify the set of connection parameters */ check_conn_params(keywords, values, user); + /* first time, allocate or get the custom wait event */ + if (pgfdw_we_connect == 0) + pgfdw_we_connect = WaitEventExtensionNew("PostgresFdwConnect"); + /* OK to make connection */ conn = libpqsrv_connect_params(keywords, values, false, /* expand_dbname */ - WAIT_EVENT_EXTENSION); + pgfdw_we_connect); if (!conn || PQstatus(conn) != CONNECTION_OK) ereport(ERROR, @@ -858,12 +867,16 @@ pgfdw_get_result(PGconn *conn, const char *query) { int wc; + /* first time, allocate or get the custom wait event */ + if (pgfdw_we_get_result == 0) + pgfdw_we_get_result = WaitEventExtensionNew("PostgresFdwGetResult"); + /* Sleep until there's something to do */ wc = WaitLatchOrSocket(MyLatch, WL_LATCH_SET | WL_SOCKET_READABLE | WL_EXIT_ON_PM_DEATH, PQsocket(conn), - -1L, WAIT_EVENT_EXTENSION); + -1L, pgfdw_we_get_result); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); @@ -1562,12 +1575,16 @@ pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, goto exit; } + /* first time, allocate or get the custom wait event */ + if (pgfdw_we_cleanup_result == 0) + pgfdw_we_cleanup_result = WaitEventExtensionNew("PostgresFdwCleanupResult"); + /* Sleep until there's something to do */ wc = WaitLatchOrSocket(MyLatch, WL_LATCH_SET | WL_SOCKET_READABLE | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, PQsocket(conn), - cur_timeout, WAIT_EVENT_EXTENSION); + cur_timeout, pgfdw_we_cleanup_result); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index c177fd41bcb..33cc6e07b76 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -1042,6 +1042,44 @@ postgres=# SELECT postgres_fdw_disconnect_all(); </para> </sect2> + <sect2 id="postgres-fdw-wait-events"> + <title>Wait Events</title> + + <para> + <filename>postgres_fdw</filename> can report the following wait events + under the wait event type <literal>Extension</literal>: + </para> + + <variablelist> + <varlistentry> + <term><literal>PostgresFdwCleanupResult</literal></term> + <listitem> + <para> + Waiting for transaction abort on remote server. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>PostgresFdwConnect</literal></term> + <listitem> + <para> + Waiting to establish a connection to a remote server. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>PostgresFdwGetResult</literal></term> + <listitem> + <para> + Waiting to receive the results of a query from a remote server. + </para> + </listitem> + </varlistentry> + </variablelist> + </sect2> + <sect2 id="postgres-fdw-configuration-parameters"> <title>Configuration Parameters</title> |