Skip Menu |

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

Report information
The Basics
Id: 83346
Status: rejected
Priority: 0/
Queue: DBD-mysql

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

Bug Information
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.