Avoid creating parallel apply state hash table unless required.
authorAmit Kapila <[email protected]>
Fri, 13 Jan 2023 02:58:05 +0000 (08:28 +0530)
committerAmit Kapila <[email protected]>
Fri, 13 Jan 2023 02:58:05 +0000 (08:28 +0530)
This hash table is used to cache the state of streaming transactions being
applied by the parallel apply workers. So, this should be created only
when we are successful in launching at least one worker. This avoids rare
case memory leak when we are never able to launch any worker.

Author: Ted Yu
Discussion: https://postgr.es/m/CALte62wg0rBR3Vj2beV=HiWo2qG9L0hzKcX=yULNER0wmf4aEw@mail.gmail.com

src/backend/replication/logical/applyparallelworker.c

index 2e5914d5d95faec038079c1adb7d8d2f86983480..3dfcff2798fc7f30ef08d9ccf02a199cdfc29fa8 100644 (file)
@@ -475,6 +475,10 @@ pa_allocate_worker(TransactionId xid)
    if (!pa_can_start())
        return;
 
+   winfo = pa_launch_parallel_worker();
+   if (!winfo)
+       return;
+
    /* First time through, initialize parallel apply worker state hashtable. */
    if (!ParallelApplyTxnHash)
    {
@@ -490,10 +494,6 @@ pa_allocate_worker(TransactionId xid)
                                           HASH_ELEM | HASH_BLOBS | HASH_CONTEXT);
    }
 
-   winfo = pa_launch_parallel_worker();
-   if (!winfo)
-       return;
-
    /* Create an entry for the requested transaction. */
    entry = hash_search(ParallelApplyTxnHash, &xid, HASH_ENTER, &found);
    if (found)