1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-27 22:56:53 +03:00

Fix more hash index bugs around marking buffers dirty.

In _hash_freeovflpage(), if we're freeing the overflow page that
immediate follows the page to which tuples are being moved (the
confusingly-named "write buffer"), don't forget to mark that
page dirty after updating its hasho_nextblkno.

In _hash_squeezebucket(), it's not necessary to mark the primary
bucket page dirty if there are no overflow pages, because there's
nothing to squeeze in that case.

Amit Kapila, with help from Kuntal Ghosh and Dilip Kumar, after
an initial trouble report by Jeff Janes.
This commit is contained in:
Robert Haas 2016-12-16 09:52:04 -05:00
parent 25216c9893
commit 6a4fe1127c

View File

@ -452,6 +452,11 @@ _hash_freeovflpage(Relation rel, Buffer ovflbuf, Buffer wbuf,
MarkBufferDirty(prevbuf);
_hash_relbuf(rel, prevbuf);
}
else
{
/* ensure to mark prevbuf as dirty */
wbuf_dirty = true;
}
}
/* write and unlock the write buffer */
@ -643,7 +648,7 @@ _hash_squeezebucket(Relation rel,
*/
if (!BlockNumberIsValid(wopaque->hasho_nextblkno))
{
_hash_chgbufaccess(rel, wbuf, HASH_WRITE, HASH_NOLOCK);
_hash_chgbufaccess(rel, wbuf, HASH_READ, HASH_NOLOCK);
return;
}