Re: Another possible corruption bug in 9.3.2 or possibly a known MultiXact problem? - Mailing list pgsql-hackers
| From | Andres Freund |
|---|---|
| Subject | Re: Another possible corruption bug in 9.3.2 or possibly a known MultiXact problem? |
| Date | |
| Msg-id | 20140224211731.GM6718@awork2.anarazel.de Whole thread Raw |
| In response to | Re: Another possible corruption bug in 9.3.2 or possibly a known MultiXact problem? (Alvaro Herrera <alvherre@2ndquadrant.com>) |
| Responses |
Re: Another possible corruption bug in 9.3.2 or possibly a
known MultiXact problem?
Re: Another possible corruption bug in 9.3.2 or possibly a known MultiXact problem? Re: Another possible corruption bug in 9.3.2 or possibly a known MultiXact problem? |
| List | pgsql-hackers |
Hi,
On 2014-02-24 17:55:14 -0300, Alvaro Herrera wrote:
> Greg Stark wrote:
> > I have a database where a a couple rows don't appear in index scans
> > but do appear in sequential scans. It looks like the same problem as
> > Peter reported but this is a different database. I've extracted all
> > the xlogdump records and below are the ones I think are relevant. You
> > can see that lp 2 gets a few HOT updates and concurrently has someone
> > create a MultiXact NO KEY UPDATE lock while one of those HOT updates
> > is pending but not committed.
Per se the sequence of records doesn't look bad (even though I am not
happy that we log intermediate and final rows first, and only then the
start of the chain).
> > The net result seems to be that the ctid
> > update chain got broken. The index of course points to the head of the
> > HOT chain so it doesn't find the live tail whereas the sequential scan
> > picks it up.
Yea, that's the problem.
> > rmgr: Heap len (rec/tot): 291/ 323, tx: 5943849, lsn: FD/2F0ADFC0, prev FD/2F0ADF90, bkp: 0000,
desc:hot_update: rel 1663/16385/212653; tid 13065/2 xmax 5943849 ; new tid 13065/3 xmax 0
> > rmgr: Heap2 len (rec/tot): 25/ 57, tx: 5943851, lsn: FD/2F0AE450, prev FD/2F0AE408, bkp: 0000,
desc:lock updated: xmax 5943851 msk 000a; rel 1663/16385/212653; tid 13065/3
> > rmgr: MultiXact len (rec/tot): 28/ 60, tx: 5943851, lsn: FD/2F0AE490, prev FD/2F0AE450, bkp: 0000,
desc:create mxid 728896 offset 1632045 nmembers 2: 5943849 (nokeyupd) 5943851 (keysh)
> > rmgr: Heap len (rec/tot): 25/ 57, tx: 5943851, lsn: FD/2F0AE4D0, prev FD/2F0AE490, bkp: 0000,
desc:lock 728896: rel 1663/16385/212653; tid 13065/2 IS_MULTI EXCL_LOCK
> > lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff |
> >
----+--------+----------+--------+---------+---------+----------+------------+-------------+------------+--------+-
> > 2 | 3424 | 1 | 232 | 5943845 | 728896 | 0 | (13065,2) | 32 | 4419 | 32 |
> > 3 | 3152 | 1 | 272 | 5943849 | 5943879 | 0 | (13065,4) | 49184 | 9475 | 32 |
> > 4 | 2864 | 1 | 287 | 5943879 | 5943880 | 0 | (13065,7) | 49184 | 9475 | 32 |
> > 7 | 2576 | 1 | 287 | 5943880 | 0 | 0 | (13065,7) | 32800 | 10499 | 32 |
Those together explain the story. Note this bit:
static void
heap_xlog_lock(XLogRecPtr lsn, XLogRecord *record)
{
... HeapTupleHeaderClearHotUpdated(htup); HeapTupleHeaderSetXmax(htup, xlrec->locking_xid);
HeapTupleHeaderSetCmax(htup,FirstCommandId, false); /* Make sure there is no forward chain link in t_ctid */
htup->t_ctid= xlrec->target.tid;
...
}
So, the replay of FD/2F0AE4D0 breaks the ctid chain *and* unsets the
HOT_UPDATED flag.
Which means fkey locks have never properly worked across SR/crash
recovery.
Haven't thought about how to fix it yet, I hope won't have to (hint hint).
We somehow need to have a policy of testing changes to the WAL format
without full_page_writes. They hide bugs in replay far, far too often.
Greetings,
Andres Freund
-- Andres Freund http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services
pgsql-hackers by date: