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);