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