Re: [HACKERS] [COMMITTERS] pgsql: Fix freezing of a dead HOT-updatedtuple
От | Alvaro Herrera |
---|---|
Тема | Re: [HACKERS] [COMMITTERS] pgsql: Fix freezing of a dead HOT-updatedtuple |
Дата | |
Msg-id | 20171006105718.nl5ik274wqjsjou6@alvherre.pgsql обсуждение исходный текст |
Ответ на | Re: [HACKERS] [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple (Michael Paquier <michael.paquier@gmail.com>) |
Ответы |
Re: [HACKERS] [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple
|
Список | pgsql-hackers |
Michael Paquier wrote: > On Fri, Oct 6, 2017 at 1:24 AM, Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > + /* > + * If the xmax of the old tuple is identical to the xmin of the new one, > + * it's a match. > + */ > + if (xmax == xmin) > + return true; > I would use TransactionIdEquals() here, to remember once you switch > that to a macro. I've had second thoughts about the macro thing -- for now I'm keeping it a function, actually. > +/* > + * Given a tuple, verify whether the given Xmax matches the tuple's Xmin, > + * taking into account that the Xmin might have been frozen. > + */ > [...] > + /* > + * We actually don't know if there's a match, but if the previous tuple > + * was frozen, we cannot really rely on a perfect match. > + */ I don't know what you had in mind here, but I tweaked the 9.3 version so that it now looks like this: /** HeapTupleUpdateXmaxMatchesXmin - verify update chain xmax/xmin lineage** Given the new version of a tuple after someupdate, verify whether the* given Xmax (corresponding to the previous version) matches the tuple's* Xmin, taking intoaccount that the Xmin might have been frozen after the* update.*/ bool HeapTupleUpdateXmaxMatchesXmin(TransactionId xmax, HeapTupleHeader htup) {TransactionId xmin = HeapTupleHeaderGetXmin(htup); /* * If the xmax of the old tuple is identical to the xmin of the new one, * it's a match. */if (TransactionIdEquals(xmax,xmin)) return true; /* * When a tuple is frozen, the original Xmin is lost, but we know it's a * committed transaction. So unless the Xmax isInvalidXid, we don't * know for certain that there is a match, but there may be one; and we * must return true so thata HOT chain that is half-frozen can be walked * correctly. */if (TransactionIdEquals(xmin, FrozenTransactionId) && TransactionIdIsValid(xmax)) return true; return false; } -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
В списке pgsql-hackers по дате отправления: