@@ -303,7 +303,8 @@ logicalrep_workers_find(Oid subid, bool only_running)
303
303
* Returns true on success, false on failure.
304
304
*/
305
305
bool
306
- logicalrep_worker_launch (Oid dbid , Oid subid , const char * subname , Oid userid ,
306
+ logicalrep_worker_launch (LogicalRepWorkerType wtype ,
307
+ Oid dbid , Oid subid , const char * subname , Oid userid ,
307
308
Oid relid , dsm_handle subworker_dsm )
308
309
{
309
310
BackgroundWorker bgw ;
@@ -315,10 +316,18 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid,
315
316
int nsyncworkers ;
316
317
int nparallelapplyworkers ;
317
318
TimestampTz now ;
318
- bool is_parallel_apply_worker = (subworker_dsm != DSM_HANDLE_INVALID );
319
-
320
- /* Sanity check - tablesync worker cannot be a subworker */
321
- Assert (!(is_parallel_apply_worker && OidIsValid (relid )));
319
+ bool is_tablesync_worker = (wtype == WORKERTYPE_TABLESYNC );
320
+ bool is_parallel_apply_worker = (wtype == WORKERTYPE_PARALLEL_APPLY );
321
+
322
+ /*----------
323
+ * Sanity checks:
324
+ * - must be valid worker type
325
+ * - tablesync workers are only ones to have relid
326
+ * - parallel apply worker is the only kind of subworker
327
+ */
328
+ Assert (wtype != WORKERTYPE_UNKNOWN );
329
+ Assert (is_tablesync_worker == OidIsValid (relid ));
330
+ Assert (is_parallel_apply_worker == (subworker_dsm != DSM_HANDLE_INVALID ));
322
331
323
332
ereport (DEBUG1 ,
324
333
(errmsg_internal ("starting logical replication worker for subscription \"%s\"" ,
@@ -393,7 +402,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid,
393
402
* sync worker limit per subscription. So, just return silently as we
394
403
* might get here because of an otherwise harmless race condition.
395
404
*/
396
- if (OidIsValid ( relid ) && nsyncworkers >= max_sync_workers_per_subscription )
405
+ if (is_tablesync_worker && nsyncworkers >= max_sync_workers_per_subscription )
397
406
{
398
407
LWLockRelease (LogicalRepWorkerLock );
399
408
return false;
@@ -427,6 +436,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid,
427
436
}
428
437
429
438
/* Prepare the worker slot. */
439
+ worker -> type = wtype ;
430
440
worker -> launch_time = now ;
431
441
worker -> in_use = true;
432
442
worker -> generation ++ ;
@@ -466,7 +476,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid,
466
476
subid );
467
477
snprintf (bgw .bgw_type , BGW_MAXLEN , "logical replication parallel worker" );
468
478
}
469
- else if (OidIsValid ( relid ) )
479
+ else if (is_tablesync_worker )
470
480
{
471
481
snprintf (bgw .bgw_function_name , BGW_MAXLEN , "TablesyncWorkerMain" );
472
482
snprintf (bgw .bgw_name , BGW_MAXLEN ,
@@ -847,7 +857,7 @@ logicalrep_sync_worker_count(Oid subid)
847
857
{
848
858
LogicalRepWorker * w = & LogicalRepCtx -> workers [i ];
849
859
850
- if (w -> subid == subid && OidIsValid ( w -> relid ))
860
+ if (w -> subid == subid && isTablesyncWorker ( w ))
851
861
res ++ ;
852
862
}
853
863
@@ -1180,7 +1190,8 @@ ApplyLauncherMain(Datum main_arg)
1180
1190
(elapsed = TimestampDifferenceMilliseconds (last_start , now )) >= wal_retrieve_retry_interval )
1181
1191
{
1182
1192
ApplyLauncherSetWorkerStartTime (sub -> oid , now );
1183
- logicalrep_worker_launch (sub -> dbid , sub -> oid , sub -> name ,
1193
+ logicalrep_worker_launch (WORKERTYPE_APPLY ,
1194
+ sub -> dbid , sub -> oid , sub -> name ,
1184
1195
sub -> owner , InvalidOid ,
1185
1196
DSM_HANDLE_INVALID );
1186
1197
}
@@ -1290,7 +1301,7 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS)
1290
1301
worker_pid = worker .proc -> pid ;
1291
1302
1292
1303
values [0 ] = ObjectIdGetDatum (worker .subid );
1293
- if (OidIsValid ( worker . relid ))
1304
+ if (isTablesyncWorker ( & worker ))
1294
1305
values [1 ] = ObjectIdGetDatum (worker .relid );
1295
1306
else
1296
1307
nulls [1 ] = true;
0 commit comments