]> granicus.if.org Git - postgresql/commitdiff
Improve coding in _hash_addovflpage.
authorRobert Haas <rhaas@postgresql.org>
Tue, 10 Jan 2017 13:26:52 +0000 (08:26 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 10 Jan 2017 13:31:03 +0000 (08:31 -0500)
Instead of relying on the page contents to know whether we have
advanced from the primary bucket page to an overflow page, track
that explicitly.

Amit Kapila, per a complaint by me.

src/backend/access/hash/hashovfl.c

index d2e8f6486bb6ae9a4180c989826e7037911acc03..e8928efc1aae1b92eafa8f251abac2e109f3fad9 100644 (file)
@@ -128,11 +128,17 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
                        break;
 
                /* we assume we do not need to write the unmodified page */
-               if ((pageopaque->hasho_flag & LH_BUCKET_PAGE) && retain_pin)
+               if (retain_pin)
+               {
+                       /* pin will be retained only for the primary bucket page */
+                       Assert(pageopaque->hasho_flag & LH_BUCKET_PAGE);
                        LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+               }
                else
                        _hash_relbuf(rel, buf);
 
+               retain_pin = false;
+
                buf = _hash_getbuf(rel, nextblkno, HASH_WRITE, LH_OVERFLOW_PAGE);
        }
 
@@ -150,8 +156,12 @@ _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf, bool retain_pin)
        /* logically chain overflow page to previous page */
        pageopaque->hasho_nextblkno = BufferGetBlockNumber(ovflbuf);
        MarkBufferDirty(buf);
-       if ((pageopaque->hasho_flag & LH_BUCKET_PAGE) && retain_pin)
+       if (retain_pin)
+       {
+               /* pin will be retained only for the primary bucket page */
+               Assert(pageopaque->hasho_flag & LH_BUCKET_PAGE);
                LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+       }
        else
                _hash_relbuf(rel, buf);