git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 0e50af2)
Fix race introduced by 6d46f4783efe457f74816a75173eb23ed8930020.
Mon, 5 Dec 2016 16:43:37 +0000 (11:43 -0500)
Mon, 5 Dec 2016 16:43:37 +0000 (11:43 -0500)
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.


diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c
index 74ffa9d161f4dad2f2e3ca0969a6f31655b7f757..44332e72ec6d2ca650bc199852f58307bb77fdac 100644 (file)
--- a/src/backend/access/hash/hashpage.c
+++ b/src/backend/access/hash/hashpage.c
@@ -653,13 +653,21 @@ restart_expand:
*/
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. */
_hash_chgbufaccess(rel, metabuf, HASH_READ, HASH_NOLOCK);
hashbucketcleanup(rel, old_bucket, buf_oblkno, start_oblkno, NULL,
- metap->hashm_maxbucket, metap->hashm_highmask,
- metap->hashm_lowmask, NULL,
- NULL, true, NULL, NULL);
+ maxbucket, highmask, lowmask, NULL, NULL, true,
+ NULL, NULL);
_hash_dropbuf(rel, buf_oblkno);
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /