ReadRecentBuffer() is broken for local buffer
От | Heikki Linnakangas |
---|---|
Тема | ReadRecentBuffer() is broken for local buffer |
Дата | |
Msg-id | 2d74b46f-27c9-fb31-7f99-327a87184cc0@iki.fi обсуждение исходный текст |
Ответы |
Re: ReadRecentBuffer() is broken for local buffer
Re: ReadRecentBuffer() is broken for local buffer Re: ReadRecentBuffer() is broken for local buffer |
Список | pgsql-hackers |
ReadRecentBuffer() doesn't work for local buffers, i.e. for temp tables. The bug is pretty clear if you look at the code: if (BufferIsLocal(recent_buffer)) { - bufHdr = GetBufferDescriptor(-recent_buffer - 1); + bufHdr = GetLocalBufferDescriptor(-recent_buffer - 1); The code after that looks suspicious, too. It increases the usage count even if the buffer was already pinned. That's different from what it does for a shared buffer, and different from LocalBufferAlloc(). That's pretty harmless, just causes the usage count to be bumped more frequently, but I don't think it was intentional. The ordering of bumping the usage count, the local ref count, and registration in the resource owner are different too. As far as I can see, that makes no difference, but I think we should keep this code as close as possible to similar code used elsewhere, unless there's a particular reason to differ. I propose the attached to fix those things. I tested this by adding this little snippet to a random place where we have just read a page with ReadBuffer: diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index aab8d6fa4e5..c4abdbc96dd 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -403,6 +403,14 @@ heapgetpage(TableScanDesc sscan, BlockNumber page) RBM_NORMAL, scan->rs_strategy); scan->rs_cblock = page; + { + bool still_ok; + + still_ok = ReadRecentBuffer(scan->rs_base.rs_rd->rd_locator, MAIN_FORKNUM, page, scan->rs_cbuf); + Assert(still_ok); + ReleaseBuffer(scan->rs_cbuf); + } + if (!(scan->rs_base.rs_flags & SO_ALLOW_PAGEMODE)) return; Without the fix, the assertion is fails quickly on "make check". - Heikki
Вложения
В списке pgsql-hackers по дате отправления: