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:
parent
0e50af2453
commit
2f4193c350
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue