In rescanLatestTimeLine(), if a new target timeline is found, expectedTLEs is replaced with newExpectedTLEs that is newly allocated by readTimeLineHistory(), and old expectedTLEs is released using list_free_deep().
However, if the current timeline is not part of the history of the new timeline, the function returns without using newExpectedTLEs, nor releasing it. I wonder this is a memory leak and it is better to release it, although the affect may be not so much. I've attached the patch. Regards, Yugo Nagata -- Yugo Nagata <nag...@sraoss.co.jp>
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 178491f6f5..ec518d35e8 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -4157,6 +4157,7 @@ rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN) (errmsg("new timeline %u is not a child of database system timeline %u", newtarget, replayTLI))); + list_free_deep(newExpectedTLEs); return false; } @@ -4172,6 +4173,7 @@ rescanLatestTimeLine(TimeLineID replayTLI, XLogRecPtr replayLSN) newtarget, replayTLI, LSN_FORMAT_ARGS(replayLSN)))); + list_free_deep(newExpectedTLEs); return false; }