On Tue, 27 Aug 2019 at 08:36, Michael Paquier <mich...@paquier.xyz> wrote:
> I'd rather be on the safe side and as we are looking at this at this > area.. Who knows if this logic is going to change in the future and > how it will change. Agree. > Oops, I misread this part. What about a simple wrapper > run_simple_command which checks after PGRES_COMMAND_OK, and frees the > result then? This could be used for the temporary table creation and > when setting synchronous_commit. Done, please see the next version attached. Regards, -- Alexander Kukushkin
diff --git a/src/bin/pg_rewind/libpq_fetch.c b/src/bin/pg_rewind/libpq_fetch.c index 37eccc3126..e2dbc9fdf6 100644 --- a/src/bin/pg_rewind/libpq_fetch.c +++ b/src/bin/pg_rewind/libpq_fetch.c @@ -39,6 +39,7 @@ static PGconn *conn = NULL; static void receiveFileChunks(const char *sql); static void execute_pagemap(datapagemap_t *pagemap, const char *path); static char *run_simple_query(const char *sql); +static void run_simple_command(const char *sql); void libpqConnect(const char *connstr) @@ -54,6 +55,11 @@ libpqConnect(const char *connstr) if (showprogress) pg_log_info("connected to server"); + /* We don't want our queries canceled */ + run_simple_command("SET statement_timeout = 0"); + run_simple_command("SET lock_timeout = 0"); + run_simple_command("SET idle_in_transaction_session_timeout = 0"); + res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL); if (PQresultStatus(res) != PGRES_TUPLES_OK) pg_fatal("could not clear search_path: %s", @@ -88,11 +94,7 @@ libpqConnect(const char *connstr) * replication, and replication isn't working for some reason, we don't * want to get stuck, waiting for it to start working again. */ - res = PQexec(conn, "SET synchronous_commit = off"); - if (PQresultStatus(res) != PGRES_COMMAND_OK) - pg_fatal("could not set up connection context: %s", - PQresultErrorMessage(res)); - PQclear(res); + run_simple_command("SET synchronous_commit = off"); } /* @@ -122,6 +124,25 @@ run_simple_query(const char *sql) return result; } +/* + * Runs a command. + * In case of failure pg_fatal exits with code=1. + */ +static void +run_simple_command(const char *sql) +{ + PGresult *res; + char *result; + + res = PQexec(conn, sql); + + if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("error running command (%s) in source server: %s", + sql, PQresultErrorMessage(res)); + + PQclear(res); +} + /* * Calls pg_current_wal_insert_lsn() function */ @@ -427,12 +448,7 @@ libpq_executeFileMap(filemap_t *map) * need to fetch. */ sql = "CREATE TEMPORARY TABLE fetchchunks(path text, begin int8, len int4);"; - res = PQexec(conn, sql); - - if (PQresultStatus(res) != PGRES_COMMAND_OK) - pg_fatal("could not create temporary table: %s", - PQresultErrorMessage(res)); - PQclear(res); + run_simple_command(sql); sql = "COPY fetchchunks FROM STDIN"; res = PQexec(conn, sql);