From 7adc408f4b64db1c9244dc48d40b87ba8be9df9a Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Wed, 13 Jan 2021 08:31:45 +0530 Subject: [PATCH] Fix memory leak in SnapBuildSerialize. 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 9b81874ce1..521e5d238f 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -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]; @@ -1681,6 +1681,9 @@ SnapBuildSerialize(SnapBuild *builder, XLogRecPtr lsn) out: ReorderBufferSetRestartPoint(builder->reorder, builder->last_serialized_snapshot); + /* be tidy */ + if (ondisk) + pfree(ondisk); } /*