From: | Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp> |
---|---|
To: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
Cc: | Kohei KaiGai <kaigai(at)heterodb(dot)com>, Michael Paquier <michael(at)paquier(dot)xyz>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: [report] memory leaks in COPY FROM on partitioned table |
Date: | 2018-08-02 01:40:00 |
Message-ID: | 7c4a5955-f3fe-333d-490d-e3e2f5afcfce@lab.ntt.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 2018/08/02 5:38, Alvaro Herrera wrote:
> On 2018-Jul-24, Amit Langote wrote:
>
>> Your patch takes care of allocation happening inside
>> get_partition_for_tuple, but as you mention there might be others in its
>> caller ExecFindPartition. So, I think we should switch to the per-tuple
>> context in ExecFindPartition.
>
> Right, makes sense. Pushed that way.
Thanks.
> I also moved the
> ExecFetchSlotTuple call to happen after the memcxt change, because it
> seemed to me that it may be possible for tuple_expand to allocate memory
> (if not, it's not obvious).
Oops, you're right.
> I also reworded some comments -- hope not
> to have broken anything too bad there. I also renamed variable
> "parent", which confused the heck out of me.
TBH, "parent" had started to become distracting even for me, who gave it
that name to begin with.
> I had conflicts when applying this in master after developing it in
> pg11, because of some new development there (and my variable rename). I
> really hope we don't open the pg13 tree as early as we opened the pg12
> one ...
>
>> When I tried to do that, I discovered that we have to be careful about
>> releasing some of the memory that's allocated in ExecFindPartition
>> ourselves instead of relying on the reset of per-tuple context to take
>> care of it. That's because some of the structures that ExecFindPartition
>> assigns the allocated memory to are cleaned up at the end of the query, by
>> when it's too late to try to release per-tuple memory. So, the patch I
>> ended up with is slightly bigger than simply adding a
>> MemoryContextSwitchTo() call at the beginning of ExecFindPartition.
>
> Yeah, that stuff looks a bit brittle. I wish I had an idea on how to
> make it less so. Thanks for taking care of that.
Just to recap in the light of this commit, we cannot do a full
ExecDropSingleTupleTableSlot right in ExecFindPartition, because we may
want to use the slot again for the next tuple. Per-tuple memory taken up
by the copy of the tuple in the slot would be released by resetting
per-tuple context in which it is (now) allocated, even if we didn't
release it ourselves. But we also need to do some bookkeeping, such as
setting the slot's tts_shouldFree to false. Hence the explicit
ExecClearTuple(), which both frees the memory and does the necessary
bookkeeping.
Thanks,
Amit
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2018-08-02 01:41:56 | Re: [report] memory leaks in COPY FROM on partitioned table |
Previous Message | Alvaro Herrera | 2018-08-02 01:20:22 | Re: [Patch] Checksums for SLRU files |