Re: POC: Cleaning up orphaned files using undo logs

From: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
To: Antonin Houska <ah(at)cybertec(dot)at>
Cc: Dmitry Dolgov <9erthalion6(at)gmail(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: POC: Cleaning up orphaned files using undo logs
Date: 2021-09-22 11:15:48
Message-ID: CAA4eK1KUPnnmox0fx89dH5tFdCz-MHzrQLvyqPmmD3wuACrY3A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Mon, Sep 20, 2021 at 10:55 AM Antonin Houska <ah(at)cybertec(dot)at> wrote:
>
> Amit Kapila <amit(dot)kapila16(at)gmail(dot)com> wrote:
>
> > On Thu, Sep 9, 2021 at 8:33 PM Antonin Houska <ah(at)cybertec(dot)at> wrote:
>
> > > The problem of the temporary undo log is that it's loaded into local buffers
> > > and that backend can exit w/o flushing local buffers to disk, and thus we are
> > > not guaranteed to find enough information when trying to discard the undo log
> > > the backend wrote. I'm thinking about the following solutions:
> > >
> > > 1. Let the backend manage temporary undo log on its own (even the slot
> > > metadata would stay outside the shared memory, and in particular the
> > > insertion pointer could start from 1 for each session) and remove the
> > > segment files at the same moment the temporary relations are removed.
> > >
> > > However, by moving the temporary undo slots away from the shared memory,
> > > computation of oldestFullXidHavingUndo (see the PROC_HDR structure) would
> > > be affected. It might seem that a transaction which only writes undo log
> > > for temporary relations does not need to affect oldestFullXidHavingUndo,
> > > but it needs to be analyzed thoroughly. Since oldestFullXidHavingUndo
> > > prevents transactions to be truncated from the CLOG too early, I wonder if
> > > the following is possible (This scenario is only applicable to the zheap
> > > storage engine [1], which is not included in this patch, but should already
> > > be considered.):
> > >
> > > A transaction creates a temporary table, does some (many) changes and then
> > > gets rolled back. The undo records are being applied and it takes some
> > > time. Since XID of the transaction did not affect oldestFullXidHavingUndo,
> > > the XID can disappear from the CLOG due to truncation.
> > >
> >
> > By above do you mean to say that in zheap code, we don't consider XIDs
> > that operate on temp table/undo for oldestFullXidHavingUndo?
>
> I was referring to the code
>
> /* We can't process temporary undo logs. */
> if (log->meta.persistence == UNDO_TEMP)
> continue;
>
> in undodiscard.c:UndoDiscard().
>

Here, I think it will just skip undo of temporary undo logs and
oldestFullXidHavingUndo should be advanced after skipping it.

> >
> > > However zundo.c in
> > > [1] indicates that the transaction status *is* checked during undo
> > > execution, so we might have a problem.
> > >
> >
> > It would be easier to follow if you can tell which exact code are you
> > referring here?
>
> In meant the call of TransactionIdDidCommit() in
> zundo.c:zheap_exec_pending_rollback().
>

IIRC, this should be called for temp tables after they have exited as
this is only to apply the pending undo actions if any, and in case of
temporary undo after session exit, we shouldn't need it.

I am not able to understand what exact problem you are facing for temp
tables after the session exit. Can you please explain it a bit more?

--
With Regards,
Amit Kapila.

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message houzj.fnst@fujitsu.com 2021-09-22 11:33:40 RE: Added schema level support for publication.
Previous Message Yura Sokolov 2021-09-22 10:52:43 Avoid dynahash's freelist in BufferAlloc.