aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2015-10-16 09:59:57 -0400
committerRobert Haas <rhaas@postgresql.org>2015-10-16 09:59:57 -0400
commit94b4f7e2a635c3027a23b07086f740615b56aa64 (patch)
tree5f264bcd1859ab678ea5f0b90b33d02112ce4474 /src
parent423ec0877ff29bc78e48e50362dbcde351a1f025 (diff)
downloadpostgresql-94b4f7e2a635c3027a23b07086f740615b56aa64.tar.gz
postgresql-94b4f7e2a635c3027a23b07086f740615b56aa64.zip
Tighten up application of parallel mode checks.
Commit 924bcf4f16d54c55310b28f77686608684734f42 failed to enforce parallel mode checks during the commit of a parallel worker, because we exited parallel mode prior to ending the transaction so that we could pop the active snapshot. Re-establish parallel mode during parallel worker commit. Without this, it's far too easy for unsafe actions during the pre-commit sequence to crash the server instead of hitting the error checks as intended. Just to be extra paranoid, adjust a couple of the sanity checks in xact.c to check not only IsInParallelMode() but also IsParallelWorker().
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/xact.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 3e24800fbd1..47312f6854f 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -497,7 +497,7 @@ AssignTransactionId(TransactionState s)
* Workers synchronize transaction state at the beginning of each parallel
* operation, so we can't account for new XIDs at this point.
*/
- if (IsInParallelMode())
+ if (IsInParallelMode() || IsParallelWorker())
elog(ERROR, "cannot assign XIDs during a parallel operation");
/*
@@ -931,7 +931,7 @@ CommandCounterIncrement(void)
* parallel operation, so we can't account for new commands after that
* point.
*/
- if (IsInParallelMode())
+ if (IsInParallelMode() || IsParallelWorker())
elog(ERROR, "cannot start commands during a parallel operation");
currentCommandId += 1;
@@ -1927,6 +1927,10 @@ CommitTransaction(void)
is_parallel_worker = (s->blockState == TBLOCK_PARALLEL_INPROGRESS);
+ /* Enforce parallel mode restrictions during parallel worker commit. */
+ if (is_parallel_worker)
+ EnterParallelMode();
+
ShowTransactionState("CommitTransaction");
/*
@@ -1971,10 +1975,7 @@ CommitTransaction(void)
/* If we might have parallel workers, clean them up now. */
if (IsInParallelMode())
- {
AtEOXact_Parallel(true);
- s->parallelModeLevel = 0;
- }
/* Shut down the deferred-trigger manager */
AfterTriggerEndXact(true);
@@ -2013,6 +2014,7 @@ CommitTransaction(void)
* commit processing
*/
s->state = TRANS_COMMIT;
+ s->parallelModeLevel = 0;
if (!is_parallel_worker)
{