• unknown's avatar
    FreeBSD patch by Jeremy Zawodny. · 835da5c4
    unknown authored
    His explanation:
    
     The socket on which MySQL listens for new connections on a blocking
      socket most of the time but is set to non-blocking during the
      accept() of the new connection.  Due to a bug in the kernel, the new
      socket returned by accept() is a blocking socket but returns the
      O_NONBLOCK flag when queried via fcntl(F_GETFL).  That is, the file
      descriptor and the underlying socket don't agree on the blocking
      mode.
    
      Since MySQL determines via fcntl(F_GETFL) that the socket is
      non-blocking, it expects the first read() in my_real_read to not
      block, so it doesn't enable the timeout alarm.  However, the read
      does block, and thus there's no timeout alarm.  The thread kill
      (which relies on rescheduling the timeout alarm) also does not work
      as a consequence.
    
    The bug shows itself if you build MySQL with LinuxThreads support
    (needed for SMP on FreeBSD).  Issuing a KILL command in MySQL won't be
    "noticed" by the "killed" thread until it runs another query--that
    makes KILL pretty useless.  And the wait_timeout doesn't work either.
    
    
    vio/vio.c:
      FreeBSD patch by Jeremy Zawodny
    835da5c4
vio.c 3.89 KB