Fix memory leak in SnapBuildSerialize.
authorAmit Kapila <[email protected]>
Wed, 13 Jan 2021 03:01:45 +0000 (08:31 +0530)
committerAmit Kapila <[email protected]>
Wed, 13 Jan 2021 03:52:03 +0000 (09:22 +0530)
The memory for the snapshot was leaked while serializing it to disk during
logical decoding. This memory will be freed only once walsender stops
streaming the changes. This can lead to a huge memory increase when master
logs Standby Snapshot too frequently say when the user is trying to create
many replication slots.

Reported-by: [email protected]
Diagnosed-by: [email protected]
Author: Amit Kapila
Backpatch-through: 9.5
Discussion: https://postgr.es/m/033ab54c-6393-42ee-8ec9-2b399b5d8cde[email protected]

src/backend/replication/logical/snapbuild.c

index 7bd4a74225cce709c2a4bc5c6cf76eb35e8db2cc..56d5f9422ae9c971ce57356d69bbf96ed820924e 100644 (file)
@@ -1447,7 +1447,7 @@ static void
 SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
 {
    Size        needed_length;
-   SnapBuildOnDisk *ondisk;
+   SnapBuildOnDisk *ondisk = NULL;
    char       *ondisk_c;
    int         fd;
    char        tmppath[MAXPGPATH];
@@ -1639,6 +1639,9 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
 out:
    ReorderBufferSetRestartPoint(builder->reorder,
                                 builder->last_serialized_snapshot);
+   /* be tidy */
+   if (ondisk)
+       pfree(ondisk);
 }
 
 /*