mirror of
https://github.com/postgres/postgres.git
synced 2025-10-24 01:29:19 +03:00
Fix race introduced by 6d46f4783e.
It's possible for the metapage contents to change after we release the lock, so we must read them before releasing the lock. Amit Kapila. Submitted in response to a trouble report from Andreas Seltenreich, though it is not certain this fixes the problem.
This commit is contained in:
@@ -653,13 +653,21 @@ restart_expand:
|
|||||||
*/
|
*/
|
||||||
if (H_NEEDS_SPLIT_CLEANUP(oopaque))
|
if (H_NEEDS_SPLIT_CLEANUP(oopaque))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Copy bucket mapping info now; refer to the comment in code below
|
||||||
|
* where we copy this information before calling _hash_splitbucket
|
||||||
|
* to see why this is okay.
|
||||||
|
*/
|
||||||
|
maxbucket = metap->hashm_maxbucket;
|
||||||
|
highmask = metap->hashm_highmask;
|
||||||
|
lowmask = metap->hashm_lowmask;
|
||||||
|
|
||||||
/* Release the metapage lock. */
|
/* Release the metapage lock. */
|
||||||
_hash_chgbufaccess(rel, metabuf, HASH_READ, HASH_NOLOCK);
|
_hash_chgbufaccess(rel, metabuf, HASH_READ, HASH_NOLOCK);
|
||||||
|
|
||||||
hashbucketcleanup(rel, old_bucket, buf_oblkno, start_oblkno, NULL,
|
hashbucketcleanup(rel, old_bucket, buf_oblkno, start_oblkno, NULL,
|
||||||
metap->hashm_maxbucket, metap->hashm_highmask,
|
maxbucket, highmask, lowmask, NULL, NULL, true,
|
||||||
metap->hashm_lowmask, NULL,
|
NULL, NULL);
|
||||||
NULL, true, NULL, NULL);
|
|
||||||
|
|
||||||
_hash_dropbuf(rel, buf_oblkno);
|
_hash_dropbuf(rel, buf_oblkno);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user