Hi,

On 2018-06-27 15:56:58 +1200, Thomas Munro wrote:
> That's a different code path that eats a lot of CPU on the *primary*, because:

While that's obviously not great, I think it's far less dangerous than
the standby having worse complexity than the primary. There's an obvious
backpressure if commands on the primary take a while, but there's
normally none for commands with high complexity on the standby...


>                 /*
>                  * Normally, we need a transaction-safe truncation
> here.  However, if
>                  * the table was either created in the current
> (sub)transaction or has
>                  * a new relfilenode in the current (sub)transaction,
> then we can just
>                  * truncate it in-place, because a rollback would
> cause the whole
>                  * table or the current physical file to be thrown away 
> anyway.
>                  */
>                 if (rel->rd_createSubid == mySubid ||
>                         rel->rd_newRelfilenodeSubid == mySubid)
>                 {
>                         /* Immediate, non-rollbackable truncation is OK */
>                         heap_truncate_one_rel(rel);
>                 }
>                 else
> 
> Without range-scannable buffer mapping (Andres's radix tree thing),
> that bet doesn't work out too well when you do it more than once.
> Hmm... we could just... not do that?

That'd probably hurt noticably too...


> (Has anyone ever looked into a lazier approach to dropping buffers?)

What precisely are you thinking of? We kinda now do something lazy-ish
at EOXact...

Greetings,

Andres Freund

Reply via email to