diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index dba19eb..2b9cfbb 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1660,8 +1660,20 @@ SyncOneBuffer(int buf_id, bool skip_recently_used) if (!(bufHdr->flags & BM_VALID) || !(bufHdr->flags & BM_DIRTY)) { - /* It's clean, so nothing to do */ - UnlockBufHdr(bufHdr); + /* + * If the buffer is unused then move it to freelist + */ + if ((bufHdr->flags & BM_VALID) + && (bufHdr->refcount == 0 && bufHdr->usage_count == 0) + && (bufHdr->freeNext == FREENEXT_NOT_IN_LIST)) + { + InvalidateBuffer(bufHdr); + } + else + { + /* It's clean, so nothing to do */ + UnlockBufHdr(bufHdr); + } return result; } @@ -1677,6 +1689,20 @@ SyncOneBuffer(int buf_id, bool skip_recently_used) LWLockRelease(bufHdr->content_lock); UnpinBuffer(bufHdr, true); + + /* + * If the buffer is unused then move it to freelist + */ + LockBufHdr(bufHdr); + if (bufHdr->refcount == 0 && bufHdr->usage_count == 0) + { + InvalidateBuffer(bufHdr); + } + else + { + UnlockBufHdr(bufHdr); + } + return result | BUF_WRITTEN; }