Improve coding in _hash_addovflpage.
authorRobert Haas <[email protected]>
Tue, 10 Jan 2017 13:26:52 +0000 (08:26 -0500)
committerRobert Haas <[email protected]>
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);