Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 9d178fb

Browse files
committed
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
1 parent 6449616 commit 9d178fb

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/backend/access/transam/parallel.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,14 +1303,6 @@ ParallelWorkerMain(Datum main_arg)
13031303
fps->parallel_master_pid))
13041304
return;
13051305

1306-
/*
1307-
* Load libraries that were loaded by original backend. We want to do
1308-
* this before restoring GUCs, because the libraries might define custom
1309-
* variables.
1310-
*/
1311-
libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
1312-
RestoreLibraryState(libraryspace);
1313-
13141306
/*
13151307
* Identify the entry point to be called. In theory this could result in
13161308
* loading an additional library, though most likely the entry point is in
@@ -1333,9 +1325,17 @@ ParallelWorkerMain(Datum main_arg)
13331325
*/
13341326
SetClientEncoding(GetDatabaseEncoding());
13351327

1328+
/*
1329+
* Load libraries that were loaded by original backend. We want to do
1330+
* this before restoring GUCs, because the libraries might define custom
1331+
* variables.
1332+
*/
1333+
libraryspace = shm_toc_lookup(toc, PARALLEL_KEY_LIBRARY, false);
1334+
StartTransactionCommand();
1335+
RestoreLibraryState(libraryspace);
1336+
13361337
/* Restore GUC values from launching backend. */
13371338
gucspace = shm_toc_lookup(toc, PARALLEL_KEY_GUC, false);
1338-
StartTransactionCommand();
13391339
RestoreGUCState(gucspace);
13401340
CommitTransactionCommand();
13411341

0 commit comments

Comments
 (0)