Re: [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple
Wong, Yi Wen <yiwong@amazon.com>
From: "Wong, Yi Wen" <yiwong@amazon.com>
To: Peter Geoghegan <pg@bowt.ie>, "Wood, Dan" <hexpert@amazon.com>
Cc: Michael Paquier <michael.paquier@gmail.com>,
Alvaro Herrera <alvherre@2ndquadrant.com>,
PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2017-10-04T03:43:00Z
Lists: pgsql-hackers
My interpretation of README.HOT is the check is just to ensure the chain is continuous; in which case the condition should be: > if (TransactionIdIsValid(priorXmax) && > !TransactionIdEquals(priorXmax, HeapTupleHeaderGetRawXmin(htup))) > break; So the difference is GetRawXmin vs GetXmin, because otherwise we get the FreezeId instead of the Xmin when the transaction happened The interesting consequence of changing that is the prune seems to get the entire chain altogether with Dan's repro... I've run it a couple of times and have consistently gotten the following page lp | t_ctid | lp_off | lp_flags | t_infomask | t_infomask2 ----+--------+--------+----------+------------+------------- 1 | (0,1) | 8152 | 1 | 2818 | 3 2 | | 7 | 2 | | 3 | | 0 | 0 | | 4 | | 0 | 0 | | 5 | | 0 | 0 | | 6 | | 0 | 0 | | 7 | (0,7) | 8112 | 1 | 11010 | 32771 (7 rows) I've made this change to conditions in both heap_prune_chain and heap_get_root_tuples and this seems to cause things to pass my smoke tests. I'll look into this deeper tomorrow. Yi Wen ________________________________________ From: Peter Geoghegan <pg@bowt.ie> Sent: Tuesday, October 3, 2017 6:19 PM To: Wood, Dan Cc: Michael Paquier; Alvaro Herrera; PostgreSQL Hackers; Wong, Yi Wen Subject: Re: [HACKERS] [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple On Tue, Oct 3, 2017 at 6:09 PM, Wood, Dan <hexpert@amazon.com> wrote: > I’ve just started looking at this again after a few weeks break. > if (TransactionIdIsValid(priorXmax) && > !TransactionIdEquals(priorXmax, HeapTupleHeaderGetXmin(htup))) > break; > We need to understand why these TXID equal checks exist. Can we differentiate the cases they are protecting against with the two exceptions I’ve found? I haven't read your remarks here in full, since I'm about to stop working for the day, but I will point out that src/backend/access/heap/README.HOT says a fair amount about this, under "Abort Cases". -- Peter Geoghegan
Commits
-
Backport addition of rs_old_rel to rewriteheap's state.
- 152a56905658 9.3.21 landed
-
Perform a lot more sanity checks when freezing tuples.
- ed8e1aff6ace 9.4.16 landed
- d3044f8b0732 10.2 landed
- 986a9153b970 9.6.7 landed
- 94d1c88103ff 9.5.11 landed
- 4800f16a7ad0 9.3.21 landed
- 699bf7d05c68 11.0 landed
-
Revert bogus fixes of HOT-freezing bug
- c6764eb3aea6 11.0 landed
- f05ae2fa94b4 9.3.20 landed
- ef0339ee5dcf 9.4.15 landed
- b3888b60d3f0 9.5.10 landed
- 7a95966bc03c 10.1 landed
- 08ba67d596a1 9.6.6 landed
-
Fix traversal of half-frozen update chains
- a5736bf754c8 11.0 landed
- fc0df3bdafd6 9.5.10 landed
- d441cff14249 9.6.6 landed
- b052d524ca71 9.3.20 landed
- 8b6d85f2dc1e 9.4.15 landed
- 22576734b805 10.1 landed
-
Fix freezing of a dead HOT-updated tuple
- 46c35116ae1a 10.0 cited
- 20b655224249 11.0 cited
-
During index build, check and elog (not just Assert) for broken HOT chain.
- d70cf811f7dd 9.4.0 cited
-
Fix WAL replay of locking an updated tuple
- 6bfa88acd3df 9.4.0 cited
-
Change the way we mark tuples as frozen.
- 37484ad2aace 9.4.0 cited