aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2011-03-17 13:10:42 -0400
committerRobert Haas <rhaas@postgresql.org>2011-03-17 13:12:21 -0400
commit9a56dc3389b9470031e9ef8e45c95a680982e01a (patch)
treeec20f12f1a2a01ace8fa595f85179c75699c3dce /src/backend/tcop/postgres.c
parente148443ddd95cd29edf4cc1de6188eb9cee029c5 (diff)
downloadpostgresql-9a56dc3389b9470031e9ef8e45c95a680982e01a.tar.gz
postgresql-9a56dc3389b9470031e9ef8e45c95a680982e01a.zip
Fix various possible problems with synchronous replication.
1. Don't ignore query cancel interrupts. Instead, if the user asks to cancel the query after we've already committed it, but before it's on the standby, just emit a warning and let the COMMIT finish. 2. Don't ignore die interrupts (pg_terminate_backend or fast shutdown). Instead, emit a warning message and close the connection without acknowledging the commit. Other backends will still see the effect of the commit, but there's no getting around that; it's too late to abort at this point, and ignoring die interrupts altogether doesn't seem like a good idea. 3. If synchronous_standby_names becomes empty, wake up all backends waiting for synchronous replication to complete. Without this, someone attempting to shut synchronous replication off could easily wedge the entire system instead. 4. Avoid depending on the assumption that if a walsender updates MyProc->syncRepState, we'll see the change even if we read it without holding the lock. The window for this appears to be quite narrow (and probably doesn't exist at all on machines with strong memory ordering) but protecting against it is practically free, so do that. 5. Remove useless state SYNC_REP_MUST_DISCONNECT, which isn't needed and doesn't actually do anything. There's still some further work needed here to make the behavior of fast shutdown plausible, but that looks complex, so I'm leaving it for a separate commit. Review by Fujii Masao.
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 39b7b5b678e..79c0f68966e 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2643,6 +2643,9 @@ die(SIGNAL_ARGS)
InterruptHoldoffCount--;
ProcessInterrupts();
}
+
+ /* Interrupt any sync rep wait which is currently in progress. */
+ SetLatch(&(MyProc->waitLatch));
}
errno = save_errno;
@@ -2681,6 +2684,9 @@ StatementCancelHandler(SIGNAL_ARGS)
InterruptHoldoffCount--;
ProcessInterrupts();
}
+
+ /* Interrupt any sync rep wait which is currently in progress. */
+ SetLatch(&(MyProc->waitLatch));
}
errno = save_errno;