Re: Possibly too stringent Assert() in b-tree code
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Antonin Houska <ah@cybertec.at>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2016-09-19T11:07:28Z
Lists: pgsql-hackers
On Mon, Sep 19, 2016 at 1:32 PM, Antonin Houska <ah@cybertec.at> wrote: > I've recently seen this when using 9.6: > > #0 0x00007f147892f0c7 in raise () from /lib64/libc.so.6 > #1 0x00007f1478930478 in abort () from /lib64/libc.so.6 > #2 0x00000000009683a1 in ExceptionalCondition (conditionName=0x9f2ef8 "!(((PageHeader) (page))->pd_special >= (__builtin_offsetof (PageHeaderData, pd_linp)))", errorType=0x9f2e8a "FailedAssertion", > fileName=0x9f2e60 "../../../../src/include/storage/bufpage.h", lineNumber=314) at assert.c:54 > #3 0x00000000004ee3d2 in PageValidateSpecialPointer (page=0x7f14700f3480 "") at ../../../../src/include/storage/bufpage.h:314 > #4 0x00000000004ef913 in _bt_getbuf (rel=0x7f14795a1a50, blkno=11, access=2) at nbtpage.c:629 > #5 0x00000000004eae8c in _bt_split (rel=0x7f14795a1a50, buf=136, cbuf=0, firstright=367, newitemoff=408, newitemsz=16, newitem=0x2608330, newitemonleft=0 '\000') at nbtinsert.c:986 > #6 0x00000000004ea563 in _bt_insertonpg (rel=0x7f14795a1a50, buf=136, cbuf=0, stack=0x26090c8, itup=0x2608330, newitemoff=408, split_only_page=0 '\000') at nbtinsert.c:781 > #7 0x00000000004e954c in _bt_doinsert (rel=0x7f14795a1a50, itup=0x2608330, checkUnique=UNIQUE_CHECK_YES, heapRel=0x25aa0a0) at nbtinsert.c:204 > #8 0x00000000004f3b73 in btinsert (rel=0x7f14795a1a50, values=0x7ffe46c6f7f0, isnull=0x7ffe46c6f7d0 "", ht_ctid=0x260927c, heapRel=0x25aa0a0, checkUnique=UNIQUE_CHECK_YES) at nbtree.c:279 > #9 0x00000000004e7964 in index_insert (indexRelation=0x7f14795a1a50, values=0x7ffe46c6f7f0, isnull=0x7ffe46c6f7d0 "", heap_t_ctid=0x260927c, heapRelation=0x25aa0a0, checkUnique=UNIQUE_CHECK_YES) > at indexam.c:204 > > Of course, the database could have been corrupted after having encountered > many crashes during my experiments. Neverthelesss, even without in-depth > knowledge of the b-tree code I suspect that this stack trace might reflect a > legal situation. In partcular, if _bt_page_recyclable() returned on this > condition: > > if (PageIsNew(page)) > return true; > I think you have a valid point. It seems we don't need to write WAL for reuse page (aka don't call _bt_log_reuse_page()), if the page is new, as the only purpose of that log is to handle conflict based on transaction id stored in special area which will be anyway zero. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
Commits
-
Avoid emitting a bogus WAL record when recycling an all-zero btree page.
- e8fe3bb23003 9.3.24 landed
- d80ec868fa3a 9.4.19 landed
- cfcfbd39b182 11.0 landed
- 7ddac4e8feba 9.5.14 landed
- 59b2dcbf45ab 10.5 landed
- 568995be6703 9.6.10 landed
- 0905fe8911ea 12.0 landed