Preferred bug tracker

Please visit the preferred bug tracker to report your issue.

This queue is for tickets about the DBD-mysql CPAN distribution.

Report information
The Basics
Id:
83346
Status:
rejected
Priority:
Low/Low
Queue:

People
Owner:
Nobody in particular
Requestors:
sveta.smirnova [...] oracle.com
Cc:
AdminCc:

BugTracker
Severity:
(no value)
Broken in:
(no value)
Fixed in:
(no value)



Subject: Connections initiated too fast might result in "Cannot assign requested address"
Originally reported by Csongor Fagyal at http://bugs.mysql.com/bug.php?id=26112 Description: I get periodical errors saying: Can't connect to MySQL server on '192.168.0.200' (99) Happens if I try to connect to the server very frequently (in a loop). Tracing the program gives: restart_syscall(<... resuming interrupted call ...>) = 0 time(NULL) = 1170758829 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 fcntl64(3, F_SETFL, O_RDONLY) = 0 fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR) connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("192.168.0.200")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address) shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected) close(3) = 0 write(1, "Doesn\'t work. Reconnecting in 1 "..., 51) = 51 time(NULL) = 1170758829 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 nanosleep({1, 0}, {1, 0}) = 0 time(NULL) = 1170758830 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 fcntl64(3, F_SETFL, O_RDONLY) = 0 fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR) connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("192.168.0.200")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address) shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected) How to repeat: use DBI; use strict; my $dsn = "DBI:mysql:database=test:host=192.168.0.200"; my $dbh; my $user = 'test'; my $password = 'test'; for (1..50000) { $dbh = DBI->connect($dsn, $user, $password, {'RaiseError' => 1} ); my $sth = $dbh->prepare('SELECT * FROM users'); $sth= undef; $dbh->disconnect; $dbh= undef; } Suggested fix: I am thinking whether I run out of ports because of the high number of connects... I see a lot of "TIME_WAIT" TCP connections when I do netstat -n (somewhere around 15000). Also, if at a failure I wait a few seconds, I am able to connect again. I have found this (a similar situation?): http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4294599 Or could it be related to bug # 20629 ? [6 Feb 2007 11:32] Csongor Fagyal Actually I am pretty sure now that I just simply run out of available TCP ports, so I have changed severity to "feature request". However, I would like to see DBD::mysql to handle this situation in a more transparent way (some sort of a "retry connect" feature).
Running out of TCP ports is a system setup issue and nothing us poor DBD driver maintainers can really do anything about AFAIK.


This service runs on Request Tracker, is sponsored by The Perl Foundation, and maintained by Best Practical Solutions.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.