Re: vac_truncate_clog()'s bogus check leads to bogusness

Noah Misch <noah@leadboat.com>

From: Noah Misch <noah@leadboat.com>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-hackers@postgresql.org, Tom Lane <tgl@sss.pgh.pa.us>
Date: 2023-06-23T05:29:12Z
Lists: pgsql-hackers
On Thu, Jun 22, 2023 at 09:45:18AM -0700, Andres Freund wrote:
> On 2023-06-21 21:50:39 -0700, Noah Misch wrote:
> > On Wed, Jun 21, 2023 at 03:12:08PM -0700, Andres Freund wrote:
> > > When vac_truncate_clog() returns early
> > ...
> > > we haven't released the lwlock that we acquired earlier
> > 
> > > Until there's some cause for the session to call LWLockReleaseAll(), the lock
> > > is held. Until then neither the process holding the lock, nor any other
> > > process, can finish vacuuming.  We don't even have an assert against a
> > > self-deadlock with an already held lock, oddly enough.
> > 
> > I agree with this finding.  Would you like to add the lwlock releases, or
> > would you like me to?
> 
> Happy with either.  I do have code and testcase, so I guess it would make
> sense for me to do it?

Sounds good.  Thanks.



Commits

  1. Release lock after encountering bogs row in vac_truncate_clog()