From: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
---|---|
To: | Michael Paquier <michael(dot)paquier(at)gmail(dot)com> |
Cc: | Peter Geoghegan <pg(at)bowt(dot)ie>, "Wong, Yi Wen" <yiwong(at)amazon(dot)com>, "Wood, Dan" <hexpert(at)amazon(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple |
Date: | 2017-10-06 10:57:18 |
Message-ID: | 20171006105718.nl5ik274wqjsjou6@alvherre.pgsql |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-committers pgsql-hackers |
Michael Paquier wrote:
> On Fri, Oct 6, 2017 at 1:24 AM, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)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 some update, verify whether the
* given Xmax (corresponding to the previous version) matches the tuple's
* Xmin, taking into account 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 is InvalidXid, we don't
* know for certain that there is a match, but there may be one; and we
* must return true so that a 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
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2017-10-06 13:18:30 | Re: [COMMITTERS] pgsql: Fix freezing of a dead HOT-updated tuple |
Previous Message | Dave Page | 2017-10-06 08:42:13 | Re: pgsql: Use OpenSSL EVP API for symmetric encryption in pgcrypto. |
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Kapila | 2017-10-06 11:08:41 | Re: parallelize queries containing initplans |
Previous Message | Alvaro Herrera | 2017-10-06 10:34:04 | Re: [PATCH] Assert that the correct locks are held when calling PageGetLSN() |