Martín

On Tue, Nov 20th, 2018 at 6:0 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:

> 
> 
> 
> =?UTF-8?q?Mart=C3=ADn_Fern=C3=A1ndez?= < fmarti...@gmail.com > writes:
> > First thing that generated a lot of noise in my head was the following,
> if pg assigns contiguous numeric values for the txid, how does pg deal
> with fragmentation issues ? Then I later found that the txid space is
> actually circular and not linearly as I originally thought it was. This
> exposed me to the fact that the txid is actually exported as a 64bit value
> where the last 32bits are an epoch. My understanding is that the epoch is
> the component that allows the circularity of the data structure. I then
> started analyzing how pg decides if a given tuple is eligible for
> freezing.  I found out that pg will compare a cutoff_tx (I assume this is
> the last committed tx) with the xmin value of the given tuple, if xmin
> precedes the cutoff_tx the tuple is eligible (I’m ignoring
> HEAP_XMAX_IS_MULTI and HEAP_MOVED cases). Now, the xmin of a tuple is an
> 32 bit integer, so, how is the epoch part of an exported txid considered
> here ? What if we had a database really old where a txid with integer
> value 10 is greater than a txid of value 1000 ? 
> 
> Actually, XID epoch is an artifact that's bolted on for possible use by
> replication or what have you. So far as the core database is concerned,
> XIDs are 32 bits in a circular space, and the way that we deal with your
> question is we don't let the case arise. Every old tuple must be marked
> "frozen" before its XID gets to be 2 billion XIDs old; after that, we
> don't particularly care just how old it is. The whole "wraparound"
> business just exists to make sure that happens in time.
> 
> If the stored XIDs were 64 bits wide, we'd not have to bother with all
> of this mess ... but adding another 64 bits to tuple headers would be
> a painful space cost, not to mention the storage compatibility issues.
> 
> regards, tom lane
> 
> 
> 
> 

Tom,

Thanks for the insight!!

I got confused with the comment under "Transaction IDs and Snapshots"( 
https://www.postgresql.org/docs/current/functions-info.html ) "The internal 
transaction ID type (xid) is 32 bits wide and wraps around every 4 billion 
transactions. However, these functions export a 64-bit format that is extended 
with an "epoch" counter so it will not wrap around during the life of an 
installation. "

Reply via email to