Re: [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple
Alvaro Herrera <alvherre@alvh.no-ip.org>
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
To: Peter Geoghegan <pg@bowt.ie>
Cc: "Wong, Yi Wen" <yiwong@amazon.com>, "Wood, Dan" <hexpert@amazon.com>, Michael Paquier <michael.paquier@gmail.com>, PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2017-10-05T16:24:03Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-bugs.patch (text/plain) patch 0001
I think this is the patch for 9.3. I ran the test a few hundred times (with some additional changes such as randomly having an update inside a savepoint that's randomly aborted, randomly aborting the transaction, randomly skipping the for key share lock, randomly sleeping at a few points; and also adding filler columns, reducing fillfactor and using 5, 50, 180, 250, 500 sessions after verifying that it causes the tuples to stay in the same page or migrate to later pages). The final REINDEX has never complained again about failing to find the root tuple. I hope it's good now. The attached patch needs a few small tweaks, such as improving commentary in the new function, maybe turn it into a macro (otherwise I think it could be bad for performance; I'd like a static func but not sure those are readily available in 9.3), change the XID comparison to use the appropriate macro rather than ==, and such. Regarding changes of xmin/xmax comparison, I also checked manually the spots I thought should be modified and later double-checked against the list that Michael posted. It's a match, except for rewriteheap.c which I cannot make heads or tails about. (I think it's rather unfortunate that it sticks a tuple's Xmax into a field that's called Xmin, but let's put that aside). Maybe there's a problem here, maybe there isn't. I'm now going to forward-port this to 9.4. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
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