Package: libdbd-pg-perl
Version: 2.19.2-2+deb7u1

    my $dbh= DBI->connect("dbi:Pg:$pg", '','', {
        AutoCommit => 1,
        HandleError => sub {
            my ($emsg,$edbh,$firstval) = @_;
            if (Osstest::JobDB::Executive::_need_retry($edbh)) {
                chomp $emsg;
                printf STDERR "DB confict (err=%s state=%s): %s\n",
                    ($edbh->err // 'undef'),
                    $edbh->state,
                    $emsg;
                die new Osstest::JobDB::Executive::RetryException $emsg;
            }

    ...
    [ do things with $dbh ]
    ...

    package Osstest::JobDB::Executive;

    sub _need_retry ($) {
        my ($dbh) = @_;
        return
            ($dbh->err() // 0)==7 &&
            ($dbh->state =~ m/^(?:40P01|40001|23|40002|$)/);
        # ...
    }

Sometimes, when used with SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE, generates this message:

    DB confict (err=7 state=): DBD::Pg::db selectrow_hashref failed: ERROR:  
could not serialize access due to read/write dependencies among transactions
    DETAIL:  Reason code: Canceled on identification as a pivot, during 
conflict out checking.
    HINT:  The transaction might succeed if retried. [for Statement "           
 SELECT  *
    [...rest of message deleted -iwj...]

Observe that the "state" value is "", meaning no error.  This is
AFAICT contrary to the documentation and also not very helpful.

I conjecture that DBD::Pg is doing "something else" which completes
successfully, trashing the error code.  But, if this is true, it is
funny that $dbh->err is not reset.

I have no real knowledge of whether this is a bug in DBD::Pg, or some
lower layer.  I could perhaps test a debugging patch to something if
that would be helpful.

I can't easily retest with a new Debian release.

Ian.

Reply via email to