It applies cleanly to a fresh checkout for me. I've attached another,
freshly generated (and identical) patch.
$ patch -p0 < ~/dbi.patch
patching file lib/Apache/DBI.pm
$
Adam
Fred Moyer wrote:
> On Mon, Dec 14, 2009 at 1:22 PM, Adam Prime <[email protected]> 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 <[email protected]>
>> To: Fred Moyer <[email protected]>
>> CC: [email protected]
>> References: <[email protected]>
>> <[email protected]> <[email protected]>
>> <[email protected]> <[email protected]>
>> <[email protected]>
>> <[email protected]>
>>
>> Adam Prime wrote:
>>> Fred Moyer wrote:
>>>> On Tue, Jul 21, 2009 at 8:39 PM, Adam Prime<[email protected]> 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: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
Index: lib/Apache/DBI.pm
===================================================================
--- lib/Apache/DBI.pm (revision 890524)
+++ 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: [email protected]
For additional commands, e-mail: [email protected]