Re: [HACKERS] Re:HEAP_MOVED_IN during vacuum - test case - Mailing list pgsql-hackers

From Tom Lane
Subject Re: [HACKERS] Re:HEAP_MOVED_IN during vacuum - test case
Date
Msg-id 1886.947478709@sss.pgh.pa.us
Whole thread Raw
In response to Re:HEAP_MOVED_IN during vacuum - test case  (Stephen Birch <sbirch@ironmountainsystems.com>)
List pgsql-hackers
Stephen Birch <sbirch@ironmountainsystems.com> writes:
> I have now created a test case that demonstrate the HEAP_MOVED_IN during
> vacuum problem.

OK, I've sussed it.  Dunno if you want the details, but briefly: the
code was using the last element of a list of target pages (pages that
had room to insert more tuples) as a sentinel point to know when to
stop trying to move tuples out of source pages.  But there was also
an optimization in there to remove target pages from the target list
as soon as they got full (so as not to keep checking them).  Sure
enough, with the right data pattern it was possible to remove the
last modified page from the target-page list before the source loop
got to it, and then everything falls over.  I'm surprised we haven't
heard more complaints about this, actually --- it doesn't look like
the failure should be all that unlikely.

I have committed what I think is a proper fix into current sources,
but I don't really think it should be trusted until it's been through
a beta test cycle.  Instead, attached is a very low-risk patch that
just dikes out the code that tries to remove target pages early.
This will result in some marginal slowdown when vacuuming huge
relations, but I think it should be safe to plug into production
6.5.* servers.

Thanks again for the narrowly focused test case --- I suspect you
put quite a bit of time into developing it...
        regards, tom lane

*** src/backend/commands/vacuum.c.orig    Tue Jan  4 12:27:26 2000
--- src/backend/commands/vacuum.c    Sun Jan  9 23:16:10 2000
***************
*** 1253,1258 ****
--- 1253,1259 ----                 {                     if (!vc_enough_space(to_vpd, tlen))                     {
+ #if 0                            /* this code is broken */                         if (to_vpd != last_fraged_page &&
                       !vc_enough_space(to_vpd, vacrelstats->min_tlen))                         {
 
***************
*** 1263,1268 ****
--- 1264,1270 ----                             num_fraged_pages--;                             Assert(last_fraged_page
==fraged_pages->vpl_pagedesc[num_fraged_pages - 1]);                         }
 
+ #endif                         for (i = 0; i < num_fraged_pages; i++)                         {
     if (vc_enough_space(fraged_pages->vpl_pagedesc[i], tlen))
 
***************
*** 1517,1522 ****
--- 1519,1525 ----                     WriteBuffer(cur_buffer);                     cur_buffer = InvalidBuffer; 
+ #if 0                            /* this code is broken */                     /*                      * If no one
tuplecan't be added to this page -                      * remove page from fraged_pages. - vadim 11/27/96
 
***************
*** 1534,1539 ****
--- 1537,1543 ----                         num_fraged_pages--;                         Assert(last_fraged_page ==
fraged_pages->vpl_pagedesc[num_fraged_pages- 1]);                     }
 
+ #endif                 }                 for (i = 0; i < num_fraged_pages; i++)                 {


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Postgres Features for 7.X
Next
From: Bruce Momjian
Date:
Subject: Number of index fields configurable