Reported by:

miskr@miskrmac.mis.duke.edu

Date:

Sat 13 May 1995 01:54:2 (EDT)

Description

Getting a "no empty local buffer" message when doing a join.

Fix

Apply this patch:

diff -c src/backend/storage/buffer/bufmgr.c:1.7 src/backend/storage/buffer/bufmgr.c:1.8
*** src/backend/storage/buffer/bufmgr.c:1.7	1995/04/15 00:28:05
--- src/backend/storage/buffer/bufmgr.c		1995/05/14 03:53:31
***************
*** 181,198 ****
  {
      BufferDesc *bufHdr;
      LRelId lrelId;
      
!     if (BufferIsValid(buffer) && !BUFFER_IS_LOCAL(buffer)) {
!         bufHdr = &BufferDescriptors[buffer-1];
! 	lrelId = RelationGetLRelId(relation);
! 	SpinAcquire(BufMgrLock);
! 	if (bufHdr->tag.blockNum == blockNumber &&
! 	    bufHdr->tag.relId.relId == lrelId.relId &&
! 	    bufHdr->tag.relId.dbId == lrelId.dbId) {
! 	    SpinRelease(BufMgrLock);
! 	    return(buffer);
  	}
- 	return(ReadBufferWithBufferLock(relation, blockNumber, true));
      }
  
      return (ReadBuffer(relation, blockNumber));
--- 180,205 ----
  {
      BufferDesc *bufHdr;
      LRelId lrelId;
      
!     if (BufferIsValid(buffer)) {
! 	if (!BUFFER_IS_LOCAL(buffer)) {
! 	    bufHdr = &BufferDescriptors[buffer-1];
! 	    lrelId = RelationGetLRelId(relation);
! 	    SpinAcquire(BufMgrLock);
! 	    if (bufHdr->tag.blockNum == blockNumber &&
! 		bufHdr->tag.relId.relId == lrelId.relId &&
! 		bufHdr->tag.relId.dbId == lrelId.dbId) {
! 		SpinRelease(BufMgrLock);
! 		return(buffer);
! 	    }
! 	    return
! 		(ReadBufferWithBufferLock(relation, blockNumber, true));
! 	} else {
! 	    bufHdr = &LocalBufferDescriptors[-buffer-1];
! 	    if (bufHdr->tag.relId.relId == relation->rd_id &&
! 		bufHdr->tag.blockNum == blockNumber) {
! 		return buffer;
! 	    }
  	}
      }
  
      return (ReadBuffer(relation, blockNumber));