Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit37b5c5f

Browse files
committed
Avoid killing btree items that are already dead
_bt_killitems marks btree items dead when a scan leaves the page wherethey live, but it does so with only share lock (to improve concurrency).This was historicall okay, since killing a dead item has noconsequences. However, with the advent of data checksums andwal_log_hints, this action incurs a WAL full-page-image record of thepage. Multiple concurrent processes would write the same page severaltimes, leading to WAL bloat. The probability of this happening can bereduced by only killing items if they're not already dead, so change thecode to do that.The problem could eliminated completely by having _bt_killitems upgradeto exclusive lock upon seeing a killable item, but that would reduceconcurrency so it's considered a cure worse than the disease.Backpatch all the way back to 9.5, since wal_log_hints was introduced in9.4.Author: Masahiko Sawada <masahiko.sawada@2ndquadrant.com>Discussion:https://postgr.es/m/CA+fd4k6PeRj2CkzapWNrERkja5G0-6D-YQiKfbukJV+qZGFZ_Q@mail.gmail.com
1 parentbc4a8b4 commit37b5c5f

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

‎src/backend/access/nbtree/nbtutils.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,9 +1815,19 @@ _bt_killitems(IndexScanDesc scan)
18151815

18161816
if (ItemPointerEquals(&ituple->t_tid,&kitem->heapTid))
18171817
{
1818-
/* found the item */
1819-
ItemIdMarkDead(iid);
1820-
killedsomething= true;
1818+
/*
1819+
* Found the item. Mark it as dead, if it isn't already.
1820+
* Since this happens while holding a buffer lock possibly in
1821+
* shared mode, it's possible that multiple processes attempt
1822+
* to do this simultaneously, leading to multiple full-page
1823+
* images being sent to WAL (if wal_log_hints or data checksums
1824+
* are enabled), which is undesirable.
1825+
*/
1826+
if (!ItemIdIsDead(iid))
1827+
{
1828+
ItemIdMarkDead(iid);
1829+
killedsomething= true;
1830+
}
18211831
break;/* out of inner search loop */
18221832
}
18231833
offnum=OffsetNumberNext(offnum);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp