6.X vacuum bug found & fixed

Started by Vadim B. Mikheevalmost 28 years ago1 messages
#1Vadim B. Mikheev
vadim@sable.krasnoyarsk.su
1 attachment(s)

I got assertion in my 6.2.1 production data base today.
Patch for 6.2.1 follows and is on ftp site too.

Vadim

Attachments:

NVACtext/plain; charset=us-ascii; name=NVACDownload
*** vacuum.c.orig	Wed Feb 25 09:44:08 1998
--- vacuum.c	Wed Feb 25 09:58:17 1998
***************
*** 1144,1166 ****
  					/*
  					 * If no one tuple can't be added to this page -
  					 * remove page from Fvpl. - vadim 11/27/96
  					 */
! 					if (!vc_enough_space(ToVpd, vacrelstats->min_tlen))
  					{
! 						if (ToVpd != Fvplast)
! 						{
! 							Assert(Fnpages > ToVpI + 1);
! 							memmove(Fvpl->vpl_pgdesc + ToVpI,
! 									Fvpl->vpl_pgdesc + ToVpI + 1,
! 							sizeof(VPageDescr *) * (Fnpages - ToVpI - 1));
! 						}
! 						Assert(Fnpages >= 1);
  						Fnpages--;
! 						if (Fnpages == 0)
! 							break;
! 						/* get prev reapped page from Fvpl */
! 						Fvplast = Fvpl->vpl_pgdesc[Fnpages - 1];
! 						Fblklast = Fvplast->vpd_blkno;
  					}
  				}
  				for (i = 0; i < Fnpages; i++)
--- 1144,1162 ----
  					/*
  					 * If no one tuple can't be added to this page -
  					 * remove page from Fvpl. - vadim 11/27/96
+ 					 *
+ 					 * But we can't remove last page - this is our
+ 					 * "show-stopper" !!!	- vadim 02/25/98
  					 */
! 					if (ToVpd != Fvplast && 
! 						!vc_enough_space(ToVpd, vacrelstats->min_tlen))
  					{
! 						Assert(Fnpages > ToVpI + 1);
! 						memmove(Fvpl->vpl_pgdesc + ToVpI,
! 								Fvpl->vpl_pgdesc + ToVpI + 1,
! 								sizeof(VPageDescr *) * (Fnpages - ToVpI - 1));
  						Fnpages--;
! 						Assert (Fvplast == Fvpl->vpl_pgdesc[Fnpages - 1]);
  					}
  				}
  				for (i = 0; i < Fnpages; i++)