From 56566835039ac5eed70f188518cef1a7ea0971b2 Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Fri, 25 Mar 2022 15:30:00 +0900 Subject: [PATCH] postgres_fdw: Minor cleanup for pgfdw_abort_cleanup(). Commit 85c696112 introduced this function to deduplicate code in the transaction callback functions, but the SQL command passed as an argument to it was useless when it returned before aborting a remote transaction using the command. Modify pgfdw_abort_cleanup() so that it constructs the command when/if necessary, as before, removing the argument from it. Also update comments in pgfdw_abort_cleanup() and one of the calling functions. Etsuro Fujita, reviewed by David Zhang. Discussion: https://postgr.es/m/CAPmGK158hrd%3DZfXmgkmNFHivgh18e4oE2Gz151C2Q4OBDjZ08A%40mail.gmail.com --- contrib/postgres_fdw/connection.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 74d3e73205..129ca79221 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -110,8 +110,7 @@ static bool pgfdw_exec_cleanup_query(PGconn *conn, const char *query, bool ignore_errors); static bool pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, bool *timed_out); -static void pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, - bool toplevel); +static void pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel); static void pgfdw_finish_pre_commit_cleanup(List *pending_entries); static void pgfdw_finish_pre_subcommit_cleanup(List *pending_entries, int curlevel); @@ -1015,8 +1014,8 @@ pgfdw_xact_callback(XactEvent event, void *arg) break; case XACT_EVENT_PARALLEL_ABORT: case XACT_EVENT_ABORT: - - pgfdw_abort_cleanup(entry, "ABORT TRANSACTION", true); + /* Rollback all remote transactions during abort */ + pgfdw_abort_cleanup(entry, true); break; } } @@ -1109,10 +1108,7 @@ pgfdw_subxact_callback(SubXactEvent event, SubTransactionId mySubid, else { /* Rollback all remote subtransactions during abort */ - snprintf(sql, sizeof(sql), - "ROLLBACK TO SAVEPOINT s%d; RELEASE SAVEPOINT s%d", - curlevel, curlevel); - pgfdw_abort_cleanup(entry, sql, false); + pgfdw_abort_cleanup(entry, false); } /* OK, we're outta that level of subtransaction */ @@ -1465,10 +1461,7 @@ exit: ; } /* - * Abort remote transaction. - * - * The statement specified in "sql" is sent to the remote server, - * in order to rollback the remote transaction. + * Abort remote transaction or subtransaction. * * "toplevel" should be set to true if toplevel (main) transaction is * rollbacked, false otherwise. @@ -1476,8 +1469,10 @@ exit: ; * Set entry->changing_xact_state to false on success, true on failure. */ static void -pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel) +pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel) { + char sql[100]; + /* * Don't try to clean up the connection if we're already in error * recursion trouble. @@ -1509,8 +1504,14 @@ pgfdw_abort_cleanup(ConnCacheEntry *entry, const char *sql, bool toplevel) !pgfdw_cancel_query(entry->conn)) return; /* Unable to cancel running query */ + if (toplevel) + snprintf(sql, sizeof(sql), "ABORT TRANSACTION"); + else + snprintf(sql, sizeof(sql), + "ROLLBACK TO SAVEPOINT s%d; RELEASE SAVEPOINT s%d", + entry->xact_depth, entry->xact_depth); if (!pgfdw_exec_cleanup_query(entry->conn, sql, false)) - return; /* Unable to abort remote transaction */ + return; /* Unable to abort remote (sub)transaction */ if (toplevel) {