|
29 | 29 | #include "storage/dsm.h"
|
30 | 30 | #include "storage/ipc.h"
|
31 | 31 | #include "storage/latch.h"
|
| 32 | +#include "storage/proc.h" |
32 | 33 | #include "utils/builtins.h"
|
33 | 34 | #include "utils/datum.h"
|
34 | 35 | #include "utils/memutils.h"
|
@@ -256,6 +257,12 @@ create_partitions_bg_worker_segment(Oid relid, Datum value, Oid value_type)
|
256 | 257 | args->dbid = MyDatabaseId;
|
257 | 258 | args->partitioned_table = relid;
|
258 | 259 |
|
| 260 | +#if PG_VERSION_NUM >= 90600 |
| 261 | + /* Initialize args for BecomeLockGroupMember() */ |
| 262 | + args->parallel_master_pgproc = MyProc; |
| 263 | + args->parallel_master_pid = MyProcPid; |
| 264 | +#endif |
| 265 | + |
259 | 266 | /* Write value-related stuff */
|
260 | 267 | args->value_type = value_type;
|
261 | 268 | args->value_size = datum_size;
|
@@ -286,6 +293,11 @@ create_partitions_bg_worker(Oid relid, Datum value, Oid value_type)
|
286 | 293 | segment_handle = dsm_segment_handle(segment);
|
287 | 294 | bgw_args = (SpawnPartitionArgs *) dsm_segment_address(segment);
|
288 | 295 |
|
| 296 | +#if PG_VERSION_NUM >= 90600 |
| 297 | + /* Become locking group leader */ |
| 298 | + BecomeLockGroupLeader(); |
| 299 | +#endif |
| 300 | + |
289 | 301 | /* Start worker and wait for it to finish */
|
290 | 302 | start_bg_worker(spawn_partitions_bgw,
|
291 | 303 | bgw_main_spawn_partitions,
|
@@ -337,6 +349,13 @@ bgw_main_spawn_partitions(Datum main_arg)
|
337 | 349 | spawn_partitions_bgw, MyProcPid);
|
338 | 350 | args = dsm_segment_address(segment);
|
339 | 351 |
|
| 352 | +#if PG_VERSION_NUM >= 90600 |
| 353 | + /* Join locking group. If we can't join the group, quit */ |
| 354 | + if (!BecomeLockGroupMember(args->parallel_master_pgproc, |
| 355 | + args->parallel_master_pid)) |
| 356 | + return; |
| 357 | +#endif |
| 358 | + |
340 | 359 | /* Establish connection and start transaction */
|
341 | 360 | BackgroundWorkerInitializeConnectionByOid(args->dbid, args->userid);
|
342 | 361 |
|
|
0 commit comments