Getting a "no empty local buffer" message when doing a join.
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));