aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2023-10-05 09:50:42 +0900
committerMichael Paquier <michael@paquier.xyz>2023-10-05 09:50:42 +0900
commitd61f2538a39f1dbeead01bc972fca597c769f518 (patch)
treeee576a27ee113919126403007bc69e183817bdb6
parent684d9bfdd5a6e6e368133707c678a2e2a984cc4e (diff)
downloadpostgresql-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.c23
-rw-r--r--doc/src/sgml/postgres-fdw.sgml38
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>