aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/async.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2015-10-16 11:48:48 -0400
committerRobert Haas <rhaas@postgresql.org>2015-10-16 11:49:31 -0400
commit816e336f12ecabdc834d4cc31bcf966b2dd323dc (patch)
treec5610be399cc7f7f8c9ca12287fe6618b68f66e9 /src/backend/commands/async.c
parent82b37765c76b8b2daf6cad3dfb5e5b4a2776d56f (diff)
downloadpostgresql-816e336f12ecabdc834d4cc31bcf966b2dd323dc.tar.gz
postgresql-816e336f12ecabdc834d4cc31bcf966b2dd323dc.zip
Mark more functions parallel-restricted or parallel-unsafe.
Commit 7aea8e4f2daa4b39ca9d1309a0c4aadb0f7ed81b was overoptimistic about the degree of safety associated with running various functions in parallel mode. Functions that take a table name or OID as an argument are at least parallel-restricted, because the table might be temporary, and we currently don't allow parallel workers to touch temporary tables. Functions that take a query as an argument are outright unsafe, because the query could be anything, including a parallel-unsafe query. Also, the queue of pending notifications is backend-private, so adding to it from a worker doesn't behave correctly. We could fix this by transferring the worker's queue of pending notifications to the master during worker cleanup, but that seems like more trouble than it's worth for now. In addition to adjusting the pg_proc.h markings, also add an explicit check for this in async.c.
Diffstat (limited to 'src/backend/commands/async.c')
-rw-r--r--src/backend/commands/async.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index f2b9a748a62..3657d693bf8 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -544,6 +544,9 @@ Async_Notify(const char *channel, const char *payload)
Notification *n;
MemoryContext oldcontext;
+ if (IsInParallelMode())
+ elog(ERROR, "cannot send notifications during a parallel operation");
+
if (Trace_notify)
elog(DEBUG1, "Async_Notify(%s)", channel);