Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

Re: non-blocking connect and EAGAIN

From: Chad MILLER <cmiller(at)mysql.com>
Date: Wed Sep 19 2007 - 10:04:53 EDT


Hi, Dmitriy, Vladimir!

On 19 Sep 2007, at 07:40, Vladimir Shebordaev wrote:

> Hi, Dmitriy,
>
> would you please specify when you get those reconnects?
>
> The Linux connect() system call on non-blocking AF_UNIX sockets
> should return immediately with EAGAIN when the peer's backlog queue
> is full.

Vladimir's right here. The Linux kernel doesn't normally send errno EINPROGRESS, but it does send EAGAIN for this case:

         if (skb_queue_len(&other->sk_receive_queue) >
             other->sk_max_ack_backlog) {
                 err = -EAGAIN;
                 if (!timeo)
                         goto out_unlock;

                 timeo = unix_wait_for_peer(other, timeo);

                 err = sock_intr_errno(timeo);
                 if (signal_pending(current))
                         goto out;
                 sock_put(other);
                 goto restart;
         }

Notably, the BSDs don't send EAGAIN, as far as I can tell.

> Otherwise connect() will block until there is some room available
> on receiving end. MySQL client intention is to literally follow
> that system call when there is no timeout option explicitly
> specified (see the comments in my_connect() right above the lines
> you've cited). So, what you get looks like intended behavior from
> both kernel and MySQL side.

Agreed, for the most part. (I don't know that the kernel sends EAGAIN /only/ for no-timeout/non-blocking connect()ion attempts. I didn't dig wider than the above.)

The Linux kernel truly couldn't accept the connect() syscall, and this is a valid problem. The library code behaves correctly because the library /should/ pass errors from the kernel up to the client. This specific case isn't one I think we considered, but client code should handle all errors the OS could generate; the library shouldn't insulate the client from the kernel, but it should from the server.

Do you need help?X

> Please check out the MySQL 5.0 trouble shooting page at <http://
> dev.mysql.com/doc/refman/5.0/en/can-not-connect-to-server.html>.
> You've probably got your server crashed or stalled due to some real
> bug. If so, you should try to reproduce it and file a bug report.
> But please upgrade to decent MySQL version first of all.

It could be a crashed server that's causing the problem, I suppose. More likely, if it's not, please keep us included if there's another bottleneck in connecting that you find.

  • chad

> Dmitriy MiksIr wrote:
>> Hello!
>> I got a lot of mysql errors "Can't connect to local MySQL server
>> through socket '/var/lib/mysql/mysql.sock' (11)".
>> I trace one of this error and see, what non-blocking connect
>> return EAGAIN. See:
>> fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
>> connect(3, {sa_family=AF_FILE, path="/var/lib/mysql/mysql.sock"},
>> 110) = -1 EAGAIN (Resource temporarily unavailable)
>> Mysql's connect do not detect this error:
>> if ((res != 0) && (s_err != EINPROGRESS))
>> {
>> errno= s_err; /* Restore it */
>> return(-1);
>> }
>> Is this kernel bug (Linux 2.6.16-std26-smp-alt1)?... which return
>> EAGAIN instead of EINPROGRESS, or some other troubles can force
>> EAGAIN on unix socket connect?

--
Chad Miller, Software Developer                         chad@mysql.com
MySQL Inc., www.mysql.com
Orlando, Florida, USA                                13-20z,  UTC-0400
Office: +1 408 213 6740                         sip:6740@sip.mysql.com
Received on Wed Sep 19 10:05:09 2007

This archive was generated by hypermail 2.1.8 : Sun Oct 07 2007 - 07:59:31 EDT


Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library