On Mon, Dec 14, 2009 at 1:22 PM, Adam Prime <adam.pr...@utoronto.ca> wrote: > This thread is 6 months stale, but Jonathan Swartz just replied to the > RT ticket, and once again brought it to mind. > > Can we please do something about this, even if that something is > re-releasing Apache::DBI 1.06 as 1.08 (as pgollucci said he was going to > do over a year and a half ago).
First thing we will need is a patch that doesn't fail when applied - [1]. I may be able to clean it up this week and run the test suite against it. [1] svn ph...@pooky ~/dev/svn/modperl/Apache-DBI/trunk $ svn update At revision 890520. ph...@pooky ~/dev/svn/modperl/Apache-DBI/trunk $ patch -p0 < p.patch patching file lib/Apache/DBI.pm Hunk #1 succeeded at 39 with fuzz 2. Hunk #2 FAILED at 124. Hunk #3 FAILED at 136. Hunk #4 FAILED at 222. Hunk #5 succeeded at 236 with fuzz 1. 3 out of 5 hunks FAILED -- saving rejects to file lib/Apache/DBI.pm.rej > > Thanks, > > Adam > > > > -------- Original Message -------- > Subject: Re: Apache::DBI > Date: Mon, 27 Jul 2009 00:06:07 -0400 > From: Adam Prime <adam.pr...@utoronto.ca> > To: Fred Moyer <f...@redhotpenguin.com> > CC: dev@perl.apache.org > References: <4a65c9a1.70...@utoronto.ca> > <4a65ec64.4060...@redhotpenguin.com> <4a65fe8e.1020...@p6m7g8.com> > <4a6610a1.7020...@utoronto.ca> <4a6689e0.2030...@utoronto.ca> > <ad28918e0907220152o6cfe5272r5280d8b19f1f6...@mail.gmail.com> > <4a6708ee.7030...@utoronto.ca> > > Adam Prime wrote: >> Fred Moyer wrote: >>> On Tue, Jul 21, 2009 at 8:39 PM, Adam Prime<adam.pr...@utoronto.ca> wrote: >>>> Adam Prime wrote: >>>>> What I wanted to do was fix this issue: >>>>> >>>>> http://rt.cpan.org/Public/Bug/Display.html?id=36346 >>> I was just looking over your original code where you connect() in >>> startup.pl. Won't that cause issues since the database handle will be >>> forked also? Here's what I have in my startup.pl: >> >> The code in the ticket was just to illustrate the failure. I ran into >> this problem because I wanted to preload a large read-only datastructure >> out of the database prior to the fork to get it completely shared >> between all the children. The handle itself is then disconnected and >> discarded. >> >> Adam >> > > The patch attached ads code to bail out of connect() calls called prior > to the fork by setting a package global during the ChildInit phase, > along with the other patch which was submitted to the users mailing list. > > It works fine for me in extremely limited testing. > > Thoughts? > > Adam > > > Index: lib/Apache/DBI.pm > =================================================================== > --- lib/Apache/DBI.pm (revision 796605) > +++ lib/Apache/DBI.pm (working copy) > @@ -39,6 +39,9 @@ > # a negative value de-activates ping, > # default = 0 > my %LastPingTime; # keeps track of last ping per data_source > +my $ChildExitHandlerInstalled; # set to true on installation of > + # PerlChildExitHandler > +my $InChild; > > # Check to see if we need to reset TaintIn and TaintOut > my $TaintInOut = ($DBI::VERSION >= 1.31) ? 1 : 0; > @@ -121,8 +124,7 @@ > # unpredictable query results. > # See: > http://perl.apache.org/docs/2.0/user/porting/compat.html#C__Apache__Server__Starting__and_C__Apache__Server__ReStarting_ > if (MP2) { > - require Apache2::ServerUtil; > - if (Apache2::ServerUtil::restart_count() == 1) { > + if (!$InChild) { > debug(2, "$prefix skipping connection during server startup, read > the docu !!"); > return $drh->connect(@args); > } > @@ -134,6 +136,23 @@ > } > } > > + # this PerlChildExitHandler is supposed to disconnect all open > + # connections to the database > + if (!$ChildExitHandlerInstalled) { > + $ChildExitHandlerInstalled = 1; > + my $s; > + if (MP2) { > + $s = Apache2::ServerUtil->server; > + } > + elsif (Apache->can('push_handlers')) { > + $s = 'Apache'; > + } > + if ($s) { > + debug(2, "$prefix push PerlChildExitHandler"); > + $s->push_handlers(PerlChildExitHandler => \&childexit); > + } > + } > + > # this PerlCleanupHandler is supposed to initiate a rollback after the > # script has finished if AutoCommit is off. however, cleanup can only > # be determined at end of handle life as begin_work may have been called > @@ -203,6 +222,7 @@ > my $prefix = "$$ Apache::DBI "; > debug(2, "$prefix PerlChildInitHandler"); > > + $InChild = 1; > %Connected = () if MP2; > > if (@ChildConnect) { > @@ -216,6 +236,22 @@ > 1; > } > > +# The PerlChildExitHandler disconnects all open connections > +sub childexit { > + > + my $prefix = "$$ Apache::DBI "; > + debug(2, "$prefix PerlChildExitHandler"); > + > + foreach my $dbh (values(%Connected)) { > + eval { DBI::db::disconnect($dbh) }; > + if ($@) { > + debug(2, "$prefix DBI::db::disconnect failed - $@"); > + } > + } > + > + 1; > +} > + > # The PerlCleanupHandler is supposed to initiate a rollback after the script > # has finished if AutoCommit is off. > # Note: the PerlCleanupHandler runs after the response has been sent to > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org > For additional commands, e-mail: dev-h...@perl.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org For additional commands, e-mail: dev-h...@perl.apache.org