Hi, When reading the logical replication code, I found that the following part could be improved a bit. In the foreach, LWLockAcquire and logicalrep_worker_find are called for each loop, but they are needed only when sub->enabled is true.
846 /* Start the missing workers for enabled subscriptions. */ 847 foreach(lc, sublist) 848 { 849 Subscription *sub = (Subscription *) lfirst(lc); 850 LogicalRepWorker *w; 851 852 LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); 853 w = logicalrep_worker_find(sub->oid, InvalidOid, false); 854 LWLockRelease(LogicalRepWorkerLock); 855 856 if (sub->enabled && w == NULL) 857 { 858 last_start_time = now; 859 wait_time = wal_retrieve_retry_interval; 860 861 logicalrep_worker_launch(sub->dbid, sub->oid, sub->name, 862 sub->owner, InvalidOid); 863 } 864 } We can fix this to call them only when there are needed, but I'm not sure whether these call are expensive enough to fix. Is it worth to fix? A patch attached. Regards, -- Yugo Nagata <nag...@sraoss.co.jp>
diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index d165d51..4816a5b 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -849,11 +849,14 @@ ApplyLauncherMain(Datum main_arg) Subscription *sub = (Subscription *) lfirst(lc); LogicalRepWorker *w; + if (!sub->enabled) + continue; + LWLockAcquire(LogicalRepWorkerLock, LW_SHARED); w = logicalrep_worker_find(sub->oid, InvalidOid, false); LWLockRelease(LogicalRepWorkerLock); - if (sub->enabled && w == NULL) + if (w == NULL) { last_start_time = now; wait_time = wal_retrieve_retry_interval;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers