On 08/07/2014 01:34 PM, Teodor Sigaev wrote:
> Hi!
>
> I have a questions about setting transaction's wraparound limits. Function
> SetTransactionIdLimit() in access/transam/varsup.c:
>
> 1)
> xidWrapLimit = oldest_datfrozenxid + (MaxTransactionId >> 1);
> if (xidWrapLimit < FirstNormalTransactionId)
> xidWrapLimit += FirstNormalTransactionId;
>
> Isn't it a problem if oldest_datfrozenxid > MaxTransactionId/2?
Don't think so. What problem do you see?
> 2)
> xidStopLimit = xidWrapLimit - 1000000;
> if (xidStopLimit < FirstNormalTransactionId)
> xidStopLimit -= FirstNormalTransactionId;
>
> xidWarnLimit = xidStopLimit - 10000000;
> if (xidWarnLimit < FirstNormalTransactionId)
> xidWarnLimit -= FirstNormalTransactionId;
>
> Why does it use '-' instead of '+' if variable < FirstNormalTransactionId? In
> this case it is easy to get xidStopLimit > xidWrapLimit or xidWarnLimit >
> xidStopLimit...
Remember that the limits are compared with xids using wrap-around aware
functions TransactionIdPrecedes and TransactionidFollows. Not regular <
and >. The "<" checks above are just to check if the XID hit one of the
special TransactionIds, and if so, increase/decrese it to get back to
the normal range.
- Heikki