From: Peter Rabbitson Date: Sun, 6 Sep 2009 16:33:46 +0000 (+0000) Subject: Stop eating exceptions in ::Storage::DBI::DESTROY X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f66e15f39f65384d95c4a254b9aefe14f32e49e3;p=dbsrgits%2FDBIx-Class-Historic.git Stop eating exceptions in ::Storage::DBI::DESTROY --- diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index af54f1c..6b5ec3d 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -2546,10 +2546,12 @@ sub lag_behind_master { sub DESTROY { my $self = shift; + $self->_verify_pid if $self->_dbh; # some databases need this to stop spewing warnings if (my $dbh = $self->_dbh) { + local $@; eval { $dbh->disconnect }; } diff --git a/t/storage/exception.t b/t/storage/exception.t index 725a0ab..9ce05b4 100644 --- a/t/storage/exception.t +++ b/t/storage/exception.t @@ -9,6 +9,8 @@ use lib qw(t/lib); use DBICTest; use DBICTest::Schema; +# make sure nothing eats the exceptions (an unchecked eval in Storage::DESTROY used to be a problem) + { package Dying::Storage; @@ -29,11 +31,7 @@ use DBICTest::Schema; } } -TODO: { -local $TODO = "I have no idea what is going on here... but it ain't right"; - for (qw/before_populate after_populate/) { - dies_ok (sub { my $schema = DBICTest::Schema->clone; $schema->storage_type ('Dying::Storage'); @@ -42,32 +40,4 @@ for (qw/before_populate after_populate/) { }, "$_ exception found"); } -} - done_testing; - -__END__ -For reference - next::method goes to ::Storage::DBI::_populate_dbh -which is: - -sub _populate_dbh { - my ($self) = @_; - - my @info = @{$self->_dbi_connect_info || []}; - $self->_dbh(undef); # in case ->connected failed we might get sent here - $self->_dbh($self->_connect(@info)); - - $self->_conn_pid($$); - $self->_conn_tid(threads->tid) if $INC{'threads.pm'}; - - $self->_determine_driver; - - # Always set the transaction depth on connect, since - # there is no transaction in progress by definition - $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1; - - $self->_run_connection_actions unless $self->{_in_determine_driver}; -} - -After further tracing it seems that if I die() before $self->_conn_pid($$) -the exception is propagated. If I die after it - it's lost. What The Fuck?!