Re: tracking commit timestamps - Mailing list pgsql-hackers

From Petr Jelinek
Subject Re: tracking commit timestamps
Date
Msg-id 54594207.8030506@2ndquadrant.com
Whole thread Raw
In response to Re: tracking commit timestamps  (Michael Paquier <michael.paquier@gmail.com>)
List pgsql-hackers
On 04/11/14 09:19, Michael Paquier wrote:
> On Sat, Nov 1, 2014 at 10:00 PM, Michael Paquier
> <michael.paquier@gmail.com <mailto:michael.paquier@gmail.com>> wrote:
>
>     More comments:
>
> Here are also more comments about the code that I found while focusing
> on committs.c:
> 1) When the GUC is not enabled, and when the transaction ID provided is
> not in a correct range, a dummy value based on InvalidTransactionId (?!)
> is returned, like that:
> +       /* Return empty if module not enabled */
> +       if (!commit_ts_enabled)
> +       {
> +               if (ts)
> +                       *ts = InvalidTransactionId;
> +               if (data)
> +                       *data = (CommitExtraData) 0;
> +               return;
> +       }
> This leads to some incorrect results:
> =# select pg_get_transaction_committime('1');
>   pg_get_transaction_committime
> -------------------------------
>   2000-01-01 09:00:00+09
> (1 row)

Oh, I had this on my TODO and somehow forgot about it, I am leaning 
towards throwing an error when calling any committs "get" function while 
the tracking is disabled.

> Or for example:
> =# SELECT txid_current();
>   txid_current
> --------------
>           1006
> (1 row)
> =# select pg_get_transaction_committime('1006');
>   pg_get_transaction_committime
> -------------------------------
>   2014-11-04 14:54:37.589381+09
> (1 row)
> =# select pg_get_transaction_committime('1007');
>   pg_get_transaction_committime
> -------------------------------
>   2000-01-01 09:00:00+09
> (1 row)
> =# SELECT txid_current();
>   txid_current
> --------------
>           1007
> (1 row)
> And at other times error is not that helpful for user:
> =# select pg_get_transaction_committime('10000');
> ERROR:  XX000: could not access status of transaction 10000
> DETAIL:  Could not read from file "pg_committs/0000" at offset 114688:
> Undefined error: 0.
> LOCATION:  SlruReportIOError, slru.c:896
> I think that you should simply return an error in
> TransactionIdGetCommitTsData when xid is not in the range supported.
> That will be more transparent for the user.

Agreed.

> 5) Reading the code, TransactionTreeSetCommitTimestamp is always called
> with do_xlog = false, making that actually no timestamps are WAL'd...
> Hence WriteSetTimestampXlogRec is just dead code with the latest version
> of the patch. IMO, this should be always WAL-logged when
> track_commit_timestamp is on.

As Andres explained this is always WAL-logged when called by current 
caller so we don't want it to be double logged, so that's why do_xlog = 
false, but when extension will need call it, it will most likely need 
do_xlog = true.

> 8) The redo and xlog routines of committs should be out in a dedicated
> file, like committsxlog.c or similar. The other rmgr do so, so let's be
> consistent.
>

Most actually don't AFAICS.

--  Petr Jelinek                  http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training &
Services



pgsql-hackers by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: WAL replay bugs
Next
From: Peter Eisentraut
Date:
Subject: Re: tracking commit timestamps