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: 2ef6fe9)
Improve coding in _hash_addovflpage.
2017年1月10日 13:26:52 +0000 (08:26 -0500)
2017年1月10日 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.


diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c
index d2e8f6486bb6ae9a4180c989826e7037911acc03..e8928efc1aae1b92eafa8f251abac2e109f3fad9 100644 (file)
--- a/src/backend/access/hash/hashovfl.c
+++ b/src/backend/access/hash/hashovfl.c
@@ -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);
This is the main PostgreSQL git repository.
RSS Atom

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