aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2018-09-20 14:03:05 +1200
committerThomas Munro <tmunro@postgresql.org>2018-09-20 14:21:44 +1200
commit98a4e814e473784716f889d8e67d66c38e94c6b0 (patch)
tree57dee617fbb6bd816a8cec5df3d16500db9edd03
parent82b7cfaaadb46f50bfa23759d2e6ce3a343e932e (diff)
downloadpostgresql-98a4e814e473784716f889d8e67d66c38e94c6b0.tar.gz
postgresql-98a4e814e473784716f889d8e67d66c38e94c6b0.zip
Defer restoration of libraries in parallel workers.
Several users of extensions complained of crashes in parallel workers that turned out to be due to syscache access from their _PG_init() functions. Reorder the initialization of parallel workers so that libraries are restored after the caches are initialized, and inside a transaction. This was reported in bug #15350 and elsewhere. We don't consider it to be a bug: extensions shouldn't do that, because then they can't be used in shared_preload_libraries. However, it's a fairly obscure hazard and these extensions worked in practice before parallel query came along. So let's make it work. Later commits might add a warning message and eventually an error. Back-patch to 9.6, where parallel query landed. Author: Thomas Munro Reviewed-by: Amit Kapila Reported-by: Kieran McCusker, Jimmy Discussion: https://postgr.es/m/153512195228.1489.8545997741965926448%40wrigleys.postgresql.org
-rw-r--r--src/backend/access/transam/parallel.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c
index cfa13b908bb..e1dcac8d828 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -1119,14 +1119,6 @@ ParallelWorkerMain(Datum main_arg)
return;
/*
- * Load libraries that were loaded by original backend. We want to do
- * this before restoring GUCs, because the libraries might define custom
- * variables.
- */
- libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
- RestoreLibraryState(libraryspace);
-
- /*
* Identify the entry point to be called. In theory this could result in
* loading an additional library, though most likely the entry point is in
* the core backend or in a library we just loaded.
@@ -1147,9 +1139,17 @@ ParallelWorkerMain(Datum main_arg)
*/
SetClientEncoding(GetDatabaseEncoding());
+ /*
+ * Load libraries that were loaded by original backend. We want to do
+ * this before restoring GUCs, because the libraries might define custom
+ * variables.
+ */
+ libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
+ StartTransactionCommand();
+ RestoreLibraryState(libraryspace);
+
/* Restore GUC values from launching backend. */
gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false);
- StartTransactionCommand();
RestoreGUCState(gucspace);
CommitTransactionCommand();