Re: BRIN indexes - TRAP: BadArgument

David Rowley <dgrowleyml@gmail.com>

From: David Rowley <dgrowleyml@gmail.com>
To: Alvaro Herrera <alvherre@2ndquadrant.com>
Cc: Jeff Janes <jeff.janes@gmail.com>, Robert Haas <robertmhaas@gmail.com>, Heikki Linnakangas <hlinnakangas@vmware.com>, Erik Rijkers <er@xs4all.nl>, Emanuel Calvo <3manuek@esdebian.org>, Simon Riggs <simon@2ndquadrant.com>, Nicolas Barbier <nicolas.barbier@gmail.com>, Claudio Freire <klaussfreire@gmail.com>, Josh Berkus <josh@agliodbs.com>, Andres Freund <andres@2ndquadrant.com>, Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2014-11-07T23:32:58Z
Lists: pgsql-hackers

Attachments

On Sat, Nov 8, 2014 at 8:56 AM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

>
> I just pushed this, after some more minor tweaks.  Thanks, and please do
> continue testing!
>
>
I'm having problems getting this to compile on MSVC. Attached is a patch
which fixes the problem.

There also seems to be a bit of a problem with:

brin.c(250): warning C4700: uninitialized local variable 'newsz' used

/*
 * Before releasing the lock, check if we can attempt a same-page
 * update.  Another process could insert a tuple concurrently in
 * the same page though, so downstream we must be prepared to cope
 * if this turns out to not be possible after all.
 */
samepage = brin_can_do_samepage_update(buf, origsz, newsz);

LockBuffer(buf, BUFFER_LOCK_UNLOCK);

newtup = brin_form_tuple(bdesc, heapBlk, dtup, &newsz);

Here newsz is passed to brin_can_do_samepage_update before being
initialised. I'm not quite sure of the solution here as I've not spent much
time looking at it, but perhaps brin_form_tuple needs to happen before
brin_can_do_samepage_update, then the lock should be released? I didn't
change this in the patch as I'm not sure if that's the proper fix or not.

The attached should fix the build problem that anole is having:
http://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=anole&dt=2014-11-07%2022%3A04%3A03

Regards

David Rowley

Commits

  1. Refactor per-page logic common to all redo routines to a new function.

  2. Reduce use of heavyweight locking inside hash AM.

  3. Scan the buffer pool just once, not once per fork, during relation drop.

  4. Major patch from Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>