Timeout with persistent connections
Martin Parm
mp at leasingborsen.dk
Mon Jul 25 17:32:33 CEST 2011
I've recently hit a problem with connection timeouts in
AnyEvent::CouchDB::Database, and I think I've isolated the problem to
persistent connections in AnyEvent::HTTP.
The following script illustrates the problem I'm having:
---------------------------------
#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent::HTTP;
use Data::Dump qw(pp);
my $url='http://www.google.com';
sub fetch {
my $persistent = shift;
my $cv = AnyEvent->condvar;
http_request(
GET => $url,
persistent => $persistent,
timeout => 3,
sub { $cv->send($_[1]) }
);
return $cv;
}
sub test {
my $persistent = shift;
print "Fetching $url with persistent = $persistent\n";
print " - First fetch : Status=", fetch($persistent)->recv->{Status},
"\n";
sleep 6;
my $hdr = fetch($persistent)->recv;
print " - Second fetch : Status=", $hdr->{Status}, "\n";
pp $hdr if $hdr->{Status} ne "200";
}
print "Perl $^V\n";
print "AnyEvent version $AnyEvent::VERSION\n";
print "AnyEvent::HTTP version $AnyEvent::HTTP::VERSION\n\n";
test($_) for qw(0 1);
---------------------------------
On my setup I get the following result:
---------------------------------
Perl v5.12.3
AnyEvent version 5.31
AnyEvent::HTTP version 2.12
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=596
{
Reason => "Connection timed out",
Status => 596,
URL => "http://www.google.com",
}
---------------------------------
I've asked a few colleagues to run my script too, and it seems something
happened between 1.46 and 2.12. Here are the results I got:
---------------------------------
Perl v5.10.1
AnyEvent version 5.34
AnyEvent::HTTP version 2.12
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=596
{
Reason => "Connection timed out",
Status => 596,
URL => "http://www.google.com",
}
---------------------------------
Perl v5.10.1
AnyEvent version 5.271
AnyEvent::HTTP version 1.46
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=200
---------------------------------
Perl v5.10.0
AnyEvent version 5.34
AnyEvent::HTTP version 1.44
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=200
---------------------------------
Perl v5.10.1
AnyEvent version 5.261
AnyEvent::HTTP version 1.44
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=200
---------------------------------
Perl v5.10.1
AnyEvent version 5.34
AnyEvent::HTTP version 2.12
Fetching http://www.google.com with persistent = 0
- First fetch : Status=200
- Second fetch : Status=200
Fetching http://www.google.com with persistent = 1
- First fetch : Status=200
- Second fetch : Status=596
{
Reason => "Connection timed out",
Status => 596,
URL => "http://www.google.com",
}
---------------------------------
Shouldn't AnyEvent::HTTP automatically reconnect on timeouts? Can anyone
else recreate this problem?
Best Regards,
--
Martin Parm
LeasingBorsen.dk
More information about the anyevent
mailing list