Re: strong memory leak in plpgsql from handled rollback and lazy cast

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: strong memory leak in plpgsql from handled rollback and lazy cast
Дата
Msg-id 18608.1569192203@sss.pgh.pa.us
обсуждение исходный текст
Ответ на strong memory leak in plpgsql from handled rollback and lazy cast  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: strong memory leak in plpgsql from handled rollback and lazy cast  (Andres Freund <andres@anarazel.de>)
Список pgsql-hackers
Pavel Stehule <pavel.stehule@gmail.com> writes:
> When I tested some hypothesis I wrote buggy code. It was surprise how fast
> I lost all free memory

> do $$
> begin
>   for i in 1..3000000
>   loop
>     begin
>       -- do some error
>       if i then end if;
>     exception when others then
>       -- do nothing
>     end;
>   end loop;
> end;
> $$;

Yeah, this is because an error gets thrown inside the cast-to-boolean.
It's intentional that the execution state tree gets thrown away if that
happens, per the comment in get_cast_hashentry:

     * Prepare the expression for execution, if it's not been done already in
     * the current transaction; also, if it's marked busy in the current
     * transaction, abandon that expression tree and build a new one, so as to
     * avoid potential problems with recursive cast expressions and failed
     * executions.  (We will leak some memory intra-transaction if that
     * happens a lot, but we don't expect it to.)  It's okay to update the

I'm not convinced that it'd be safe to re-use an ExprState after a
previous execution failed (though perhaps Andres has a different opinion?)
so I think the only way to avoid the intratransaction memory leak would
be to set up each new cast ExprState in its own memory context that we
could free.  That seems like adding quite a lot of overhead to get rid
of a leak that we've been living with for ages.

Maybe we could pay the extra overhead only after the expression has
failed at least once.  Seems a bit messy though, and I'm afraid that
we'd have to add PG_TRY overhead in any case.

            regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Thomas Munro
Дата:
Сообщение: Re: scorpionfly needs more semaphores
Следующее
От: Alexander Korotkov
Дата:
Сообщение: Re: JSONPATH documentation