postgres_fdw: Replace WAIT_EVENT_EXTENSION with custom wait events
authorMichael Paquier
Thu, 5 Oct 2023 00:50:42 +0000 (09:50 +0900)
committerMichael Paquier
Thu, 5 Oct 2023 00:50:42 +0000 (09:50 +0900)
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

contrib/postgres_fdw/connection.c
doc/src/sgml/postgres-fdw.sgml

index 7e12b722ec9cb121b7571ec71dd7a6c5cb834c41..5800c6a9fb3d977edfb8f5e2fdb498211332d404 100644 (file)
@@ -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();
index c177fd41bcb1146b4d972245a9ddcfc03aa71bd6..33cc6e07b76890612c345132b7051867e6ee6a96 100644 (file)
@@ -1042,6 +1042,44 @@ postgres=# SELECT postgres_fdw_disconnect_all();
   
  
 
+  Wait Events
+
+  
+   postgres_fdw can report the following wait events
+   under the wait event type Extension:
+  
+
+  
+   
+    PostgresFdwCleanupResult
+    
+     
+      Waiting for transaction abort on remote server.
+     
+    
+   
+
+   
+    PostgresFdwConnect
+    
+     
+      Waiting to establish a connection to a remote server.
+     
+    
+   
+
+   
+    PostgresFdwGetResult
+    
+     
+      Waiting to receive the results of a query from a remote server.
+     
+    
+   
+  
+
  
   Configuration Parameters