Fix memory leak in SnapBuildSerialize.
authorAmit Kapila <akapila@postgresql.org>
Wed, 13 Jan 2021 03:01:45 +0000 (08:31 +0530)
committerAmit Kapila <akapila@postgresql.org>
Wed, 13 Jan 2021 03:31:57 +0000 (09:01 +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: funnyxj.fxj@alibaba-inc.com
Diagnosed-by: funnyxj.fxj@alibaba-inc.com
Author: Amit Kapila
Backpatch-through: 9.5
Discussion: https://postgr.es/m/033ab54c-6393-42ee-8ec9-2b399b5d8cde.funnyxj.fxj@alibaba-inc.com

src/backend/replication/logical/snapbuild.c

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