Fix SPGiST vacuum algorithm to handle concurrent tuple motion properly.

Tom Lane <tgl@sss.pgh.pa.us>

Commit: b4af1c25bbc636379efc5d2ffb9d420765705b8a
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: 2012-03-12T20:10:28Z
Releases: 9.2.0
Fix SPGiST vacuum algorithm to handle concurrent tuple motion properly.

A leaf tuple that we need to delete could get moved as a consequence of an
insertion happening concurrently with the VACUUM scan.  If it moves from a
page past the current scan point to a page before, we'll miss it, which is
not acceptable.  Hence, when we see a leaf-page REDIRECT that could have
been made since our scan started, chase down the redirection pointer much
as if we were doing a normal index search, and be sure to vacuum every page
it leads to.  This fixes the issue because, if the tuple was on page N at
the instant we start our scan, we will surely find it as a consequence of
chasing the redirect from page N, no matter how much it moves around in
between.  Problem noted by Takashi Yamamoto.

Files

PathChange+/−
src/backend/access/spgist/README modified +21 −0
src/backend/access/spgist/spgvacuum.c modified +221 −10