ssi-slru-truncate-fix.patch

text/plain

Filename: ssi-slru-truncate-fix.patch
Type: text/plain
Part: 0
Message: Re: SSI bug?

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/storage/lmgr/predicate.c 19 0
*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 920,945 **** CheckPointPredicate(void)
  	else
  	{
  		/*
! 		 * The SLRU is no longer needed. Truncate everything but the last
! 		 * page. We don't dare to touch the last page in case the SLRU is
! 		 * taken back to use, and the new tail falls on the same page.
  		 */
! 		tailPage = oldSerXidControl->headPage;
  		oldSerXidControl->headPage = -1;
  	}
  
  	LWLockRelease(OldSerXidLock);
  
  	/*
  	 * Flush dirty SLRU pages to disk
  	 *
  	 * This is not actually necessary from a correctness point of view. We do
  	 * it merely as a debugging aid.
  	 */
  	SimpleLruFlush(OldSerXidSlruCtl, true);
- 
- 	/* Truncate away pages that are no longer required */
- 	SimpleLruTruncate(OldSerXidSlruCtl, tailPage);
  }
  
  /*------------------------------------------------------------------------*/
--- 920,957 ----
  	else
  	{
  		/*
! 		 * The SLRU is no longer needed. Truncate everything.  If we try to
! 		 * leave the head page around to avoid re-zeroing it, we might not
! 		 * use the SLRU again until we're past the wrap-around point, which
! 		 * makes SLRU unhappy.
! 		 *
! 		 * While the API asks you to specify truncation by page, it silently
! 		 * ignores the request unless the specified page is in a segment
! 		 * past some allocated portion of the SLRU.  We don't care which
! 		 * page in a later segment we hit, so just add the number of pages
! 		 * per segment to the head page to land us *somewhere* in the next
! 		 * segment.
  		 */
! 		tailPage = oldSerXidControl->headPage + SLRU_PAGES_PER_SEGMENT;
  		oldSerXidControl->headPage = -1;
  	}
  
  	LWLockRelease(OldSerXidLock);
  
+ 	/* Truncate away pages that are no longer required */
+ 	SimpleLruTruncate(OldSerXidSlruCtl, tailPage);
+ 
  	/*
  	 * Flush dirty SLRU pages to disk
  	 *
  	 * This is not actually necessary from a correctness point of view. We do
  	 * it merely as a debugging aid.
+ 	 *
+ 	 * We're doing this after the truncation to avoid writing pages right
+ 	 * before deleting the file in which they sit, which would be completely
+ 	 * pointless.
  	 */
  	SimpleLruFlush(OldSerXidSlruCtl, true);
  }
  
  /*------------------------------------------------------------------------*/