diff options
author | Thomas Munro <tmunro@postgresql.org> | 2018-09-20 14:03:05 +1200 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2018-09-20 14:21:44 +1200 |
commit | 98a4e814e473784716f889d8e67d66c38e94c6b0 (patch) | |
tree | 57dee617fbb6bd816a8cec5df3d16500db9edd03 | |
parent | 82b7cfaaadb46f50bfa23759d2e6ce3a343e932e (diff) | |
download | postgresql-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.c | 18 |
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(); |