vacuum_buffer_hack-7.3.4.diff

text/plain

Filename: vacuum_buffer_hack-7.3.4.diff
Type: text/plain
Part: 0
Message: Re: Experimental patch for inter-page delay in VACUUM

Patch

Format: context
File+
./backend/commands/vacuum.c 16 0
./backend/storage/buffer/bufmgr.c 12 0
./backend/storage/buffer/freelist.c 17 3
./backend/tcop/postgres.c 9 0
./include/storage/buf_internals.h 1 0
diff -crN ../src.orig/backend/commands/vacuum.c ./backend/commands/vacuum.c
*** ../src.orig/backend/commands/vacuum.c	Thu Oct 30 10:17:36 2003
--- ./backend/commands/vacuum.c	Thu Oct 30 10:27:57 2003
***************
*** 98,103 ****
--- 98,107 ----
  } VRelStats;
  
  
+ bool vacuum_buffer_hack = true;
+ bool vacuum_buffer_hack_active = false;
+ 
+ 
  static MemoryContext vac_context = NULL;
  
  static int	elevel = -1;
***************
*** 279,284 ****
--- 283,295 ----
  	}
  
  	/*
+ 	 * Change the buffer cache policy to avoid vacuum causing a
+ 	 * full cache eviction.
+ 	 */
+ 	if (vacuum_buffer_hack)
+ 		vacuum_buffer_hack_active = true;
+ 
+ 	/*
  	 * Loop to process each selected relation.
  	 */
  	foreach(cur, vrl)
***************
*** 320,325 ****
--- 331,341 ----
  			}
  		}
  	}
+ 
+ 	/*
+ 	 * Change back to normal buffer cache policy.
+ 	 */
+ 	vacuum_buffer_hack_active = false;
  
  	/*
  	 * Finish up processing.
diff -crN ../src.orig/backend/storage/buffer/bufmgr.c ./backend/storage/buffer/bufmgr.c
*** ../src.orig/backend/storage/buffer/bufmgr.c	Thu Oct 30 10:17:38 2003
--- ./backend/storage/buffer/bufmgr.c	Thu Oct 30 10:44:10 2003
***************
*** 64,69 ****
--- 64,72 ----
  bool	zero_damaged_pages = false;
  
  
+ extern bool vacuum_buffer_hack_active;
+ 
+ 
  static void WaitIO(BufferDesc *buf);
  static void StartBufferIO(BufferDesc *buf, bool forInput);
  static void TerminateBufferIO(BufferDesc *buf);
***************
*** 205,210 ****
--- 208,222 ----
  			StartBufferIO(bufHdr, false);
  			LWLockRelease(BufMgrLock);
  		}
+ 	}
+ 	else
+ 	{
+ 		/* The block was not found in the buffer cache. If we are in
+ 		 * vacuum buffer cache strategy mode, mark that this buffers
+ 		 * content was caused by vacuum.
+ 		 */
+ 		if (vacuum_buffer_hack_active)
+ 			bufHdr->flags |= BM_READ_BY_VACUUM;
  	}
  
  	/*
diff -crN ../src.orig/backend/storage/buffer/freelist.c ./backend/storage/buffer/freelist.c
*** ../src.orig/backend/storage/buffer/freelist.c	Thu Oct 30 10:17:38 2003
--- ./backend/storage/buffer/freelist.c	Thu Oct 30 12:38:42 2003
***************
*** 71,79 ****
  #endif   /* BMTRACE */
  	IsNotInQueue(bf);
  
! 	/* change bf so it points to inFrontOfNew and its successor */
! 	bf->freePrev = SharedFreeList->freePrev;
! 	bf->freeNext = Free_List_Descriptor;
  
  	/* insert new into chain */
  	BufferDescriptors[bf->freeNext].freePrev = bf->buf_id;
--- 71,93 ----
  #endif   /* BMTRACE */
  	IsNotInQueue(bf);
  
! 	if ((bf->flags & BM_READ_BY_VACUUM) != 0)
! 	{
! 		/* in the case the buffer was read or created by vacuum,
! 		 * add it to the end of the queue so that GetFreeBuffer()
! 		 * will return it next again.
! 		 */
! 		bf->freePrev = Free_List_Descriptor;
! 		bf->freeNext = SharedFreeList->freeNext;
! 
! 		bf->flags &= ~BM_READ_BY_VACUUM;
! 	}
! 	else
! 	{
! 		/* change bf so it points to inFrontOfNew and its successor */
! 		bf->freePrev = SharedFreeList->freePrev;
! 		bf->freeNext = Free_List_Descriptor;
! 	}
  
  	/* insert new into chain */
  	BufferDescriptors[bf->freeNext].freePrev = bf->buf_id;
diff -crN ../src.orig/backend/tcop/postgres.c ./backend/tcop/postgres.c
*** ../src.orig/backend/tcop/postgres.c	Thu Oct 30 10:17:39 2003
--- ./backend/tcop/postgres.c	Thu Oct 30 10:25:07 2003
***************
*** 69,74 ****
--- 69,77 ----
  extern int	optind;
  extern char *optarg;
  
+ extern bool vacuum_buffer_hack;
+ extern bool vacuum_buffer_hack_active;
+ 
  char	   *debug_query_string; /* for pgmonitor and
  								 * log_min_error_statement */
  
***************
*** 1874,1879 ****
--- 1877,1888 ----
  
  	for (;;)
  	{
+ 		/*
+ 		 * Reset the vacuum buffer hack active flag, could be left
+ 		 * true if a vacuum got aborted.
+ 		 */
+ 		vacuum_buffer_hack_active = false;
+ 
  		/*
  		 * Release storage left over from prior query cycle, and create a
  		 * new query input buffer in the cleared QueryContext.
diff -crN ../src.orig/include/storage/buf_internals.h ./include/storage/buf_internals.h
*** ../src.orig/include/storage/buf_internals.h	Thu Oct 30 10:17:43 2003
--- ./include/storage/buf_internals.h	Thu Oct 30 10:29:56 2003
***************
*** 41,46 ****
--- 41,47 ----
  #define BM_IO_ERROR				(1 << 6)
  #define BM_JUST_DIRTIED			(1 << 7)
  #define BM_PIN_COUNT_WAITER		(1 << 8)
+ #define BM_READ_BY_VACUUM		(1 << 9)
  
  typedef bits16 BufFlags;