Re: [HACKERS] aggregation memory leak and fix - Mailing list pgsql-hackers
From | Erik Riedel |
---|---|
Subject | Re: [HACKERS] aggregation memory leak and fix |
Date | |
Msg-id | QqyGa6600gNtMmTG1o@andrew.cmu.edu Whole thread Raw |
In response to | Re: [HACKERS] aggregation memory leak and fix (Bruce Momjian <maillist@candle.pha.pa.us>) |
List | pgsql-hackers |
> I am interested to see if it fixes the expression leak you saw. I have > not committed this yet. I want to look at it some more. > I'm afraid that this doesn't seem to have any effect on my query. Looking at your code, I think the problem is that most of the allocations in my query are on the top part of the if statement that you modified (i.e. the == SQLlanguageId part). Below is a snippet of a trace from my query, with approximate line numbers for execQual.c with your patch applied: (execQual) language == SQLlanguageId (execQual.c:757) (execQual) execute postquel_function (execQual.c:759) (mcxt) MemoryContextAlloc 32 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 16 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 528 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 56 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 88 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 24 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 8 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 65 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 48 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 8 bytes in ** Blank Portal **-heap (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (execQual) exit qual context (execQual.c:862) (mcxt) MemoryContextAlloc 60 bytes in ** Blank Portal **-heap (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 16 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 64 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 64 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 528 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 16 bytes (execQual) return from postquel_function (execQual.c:764) (execQual) return from ExecEvalFuncArgs (execQual.c:792) (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (execQual) exit qual context (execQual.c:862) (mcxt) MemoryContextAlloc 108 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 108 bytes in ** Blank Portal **-heap (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 128 bytes (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (mcxt) MemoryContextAlloc 8 bytes in <Qual manager>-heap (execQual) exit qual context (execQual.c:862) <pattern repeats> (execQual) language == SQLlanguageId (execQual.c:757) (execQual) execute postquel_function (execQual.c:759) (mcxt) MemoryContextAlloc 32 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 16 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 528 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 56 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 88 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 24 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 8 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 65 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 48 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 8 bytes in ** Blank Portal **-heap (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (execQual) exit qual context (execQual.c:862) (mcxt) MemoryContextAlloc 60 bytes in ** Blank Portal **-heap (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 16 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 64 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 64 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 528 bytes (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 16 bytes (execQual) return from postquel_function (execQual.c:764) (execQual) return from ExecEvalFuncArgs (execQual.c:792) (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (execQual) exit qual context (execQual.c:862) (mcxt) MemoryContextAlloc 108 bytes in ** Blank Portal **-heap (mcxt) MemoryContextAlloc 108 bytes in ** Blank Portal **-heap (mcxt) MemoryContextFree in ** Blank Portal **-heap freed 128 bytes (execQual) else clause NOT SQLlanguageId (execQual.c:822) (execQual) install qual memory context (execQual.c:858) (mcxt) MemoryContextAlloc 8 bytes in <Qual manager>-heap (execQual) exit qual context (execQual.c:862) the MemoryContext lines give the name of the portal where each allocation is happening - you see that your Qual manager only captures a very small number (one) of the allocations, the rest are in the upper part of the if statement. Note that I also placed a printf next to your EndPortalAllocMode() and StartPortalAllocMode() fix in ExecQual() - I believe this is what is supposed to clear the portal and free the memory - and that printf never appears in the above trace. Sorry if the trace is a little confusing, but I hope that it helps you zero in. Erik
pgsql-hackers by date: