summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2016-10-06 13:24:46 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2016-10-06 13:34:32 +0300
commit69da71254b4293b6f817486eaed2df17f8725743 (patch)
tree3bc0c52571157eae79317b59d114cca13c24489a /src
parentce603a34a4568e876c0d9c826325d9b12c9e5497 (diff)
Disable synchronous commits in pg_rewind.
If you point pg_rewind to a server that is using synchronous replication, with "pg_rewind --source-server=...", and the replication is not working for some reason, pg_rewind will get stuck because it creates a temporary table, which needs to be replicated. You could call broken replication a pilot error, but pg_rewind is often used in special circumstances, when there are changes to the replication setup. We don't do any "real" updates, and we don't care about fsyncing or replicating the operations on the temporary tables, so fix that by setting synchronous_commit off. Michael Banck, Michael Paquier. Backpatch to 9.5, where pg_rewind was introduced. Discussion: <20161005143938.GA12247@nighthawk.caipicrew.dd-dns.de>
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_rewind/libpq_fetch.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/bin/pg_rewind/libpq_fetch.c b/src/bin/pg_rewind/libpq_fetch.c
index 41d687ba403..5683eeccdc1 100644
--- a/src/bin/pg_rewind/libpq_fetch.c
+++ b/src/bin/pg_rewind/libpq_fetch.c
@@ -49,6 +49,7 @@ void
libpqConnect(const char *connstr)
{
char *str;
+ PGresult *res;
conn = PQconnectdb(connstr);
if (PQstatus(conn) == CONNECTION_BAD)
@@ -77,6 +78,19 @@ libpqConnect(const char *connstr)
if (strcmp(str, "on") != 0)
pg_fatal("full_page_writes must be enabled in the source server\n");
pg_free(str);
+
+ /*
+ * Although we don't do any "real" updates, we do work with a temporary
+ * table. We don't care about synchronous commit for that. It doesn't
+ * otherwise matter much, but if the server is using synchronous
+ * 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);
}
/*