Thread: When is the MessageContext released?

When is the MessageContext released?

From
Andy Fan
Date:
Hi :
  I run a query like "select * from t" and set the break like this:

break exec_simple_query
break MemoryContextDelete
  commands
   p context->name
   c
  end

I can see most of the MemoryContext is relased, but never MessageContext,  when will it be released?

/*
* Create the memory context we will use in the main loop.
*
* MessageContext is reset once per iteration of the main loop, ie, upon
* completion of processing of each command message from the client.
*/



Thanks!

Re: When is the MessageContext released?

From
Andres Freund
Date:
On 2019-02-27 14:08:47 +0800, Andy Fan wrote:
> Hi :
>   I run a query like "select * from t" and set the break like this:
> 
> break exec_simple_query
> break MemoryContextDelete
>   commands
>    p context->name
>    c
>   end
> 
> I can see most of the MemoryContext is relased, but never MessageContext,
> when will it be released?

It's released above exec_simple_query, as it actually contains the data
that lead us to call exec_simple_query().  See the main for loop in
PostgresMain():

        /*
         * Release storage left over from prior query cycle, and create a new
         * query input buffer in the cleared MessageContext.
         */
        MemoryContextSwitchTo(MessageContext);
        MemoryContextResetAndDeleteChildren(MessageContext);

Greetings,

Andres Freund


Re: When is the MessageContext released?

From
Andy Fan
Date:
Thanks you Andres for your time!  this context is free with AllocSetReset rather than AllocSetDelete, that makes my breakpoint doesn't catch it.  

On Wed, Feb 27, 2019 at 2:15 PM Andres Freund <andres@anarazel.de> wrote:
On 2019-02-27 14:08:47 +0800, Andy Fan wrote:
> Hi :
>   I run a query like "select * from t" and set the break like this:
>
> break exec_simple_query
> break MemoryContextDelete
>   commands
>    p context->name
>    c
>   end
>
> I can see most of the MemoryContext is relased, but never MessageContext,
> when will it be released?

It's released above exec_simple_query, as it actually contains the data
that lead us to call exec_simple_query().  See the main for loop in
PostgresMain():

                /*
                 * Release storage left over from prior query cycle, and create a new
                 * query input buffer in the cleared MessageContext.
                 */
                MemoryContextSwitchTo(MessageContext);
                MemoryContextResetAndDeleteChildren(MessageContext);

Greetings,

Andres Freund