]> granicus.if.org Git - postgresql/commitdiff
Fix race introduced by 6d46f4783efe457f74816a75173eb23ed8930020.
authorRobert Haas <rhaas@postgresql.org>
Mon, 5 Dec 2016 16:43:37 +0000 (11:43 -0500)
committerRobert Haas <rhaas@postgresql.org>
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.

src/backend/access/hash/hashpage.c

index 74ffa9d161f4dad2f2e3ca0969a6f31655b7f757..44332e72ec6d2ca650bc199852f58307bb77fdac 100644 (file)
@@ -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);