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:42:59 +0000 (09:12 +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 cdc117763cb07e7428891a2038471a71ac183e41..bba558705d15836405f7f3b2535e08e8a99a2393 100644 (file)
@@ -1464,7 +1464,7 @@ static void
 SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
 {
    Size        needed_length;
-   SnapBuildOnDisk *ondisk;
+   SnapBuildOnDisk *ondisk = NULL;
    char       *ondisk_c;
    int         fd;
    char        tmppath[MAXPGPATH];
@@ -1656,6 +1656,9 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn)
 out:
    ReorderBufferSetRestartPoint(builder->reorder,
                                 builder->last_serialized_snapshot);
+   /* be tidy */
+   if (ondisk)
+       pfree(ondisk);
 }
 
 /*