Le Dimanche 17 Janvier 2010 18:36:06, Cyril Bonté a écrit :
> Hi all,
> 
> Le Samedi 16 Janvier 2010 23:58:25, Willy Tarreau a écrit :
> > Hi Hervé,
> > 
> > On Sat, Jan 16, 2010 at 11:34:38PM +0100, Herve COMMOWICK wrote:
> > > Hi Cyril,
> > > 
> > > You forgot the log-error option that much sysadmin use for correct 
> > > debugging
> > > without pollution, but i don't think it logs incorrect logging (if i
> > > remember well).
> 
> Actually, the "log-error" file contains mysql start/stop messages and 
> critical errors (engines integrity errors, server/thread crashes, ...) but 
> authentication is not logged in it.

Oh ok, I think I get it...maybe you talked about log-warnings. In that case, 
the mysql-check will add logs on the mysql server, but only if the "haproxy" 
user exists.
To prevent this, haproxy *must* quit properly by sending another packet to 
execute the COM_QUIT command (mysql_close).

A quick test shows that appending this packet to the authentication packet 
works :

const char mysql40_client_auth_pkt[] = {
        "\x0e\x00\x00"  /* packet length */
        "\x01"          /* packet number */
        "\x00\x00"      /* client capabilities */
        "\x00\x00\x01"  /* max packet */
        "haproxy\x00"   /* username (null terminated string) */
        "\x00"          /* filler (always 0x00) */
        "\x01\x00\x00"  /* packet length */
        "\x00"          /* packet number */
        "\x01"          /* COM_QUIT command */
};

Currently, I can't confirm it won't block the server if we send a second packet 
like this on the same connection when the authentication fails (my first tests 
shows it seems to work but it' preferable to have a second look on this).

But it would be better to follow the negotiation sequentially (then I agree 
with what you said at the beginning of this thread, currently it can't be done 
in a clean way) :
server -> client : Handshake Initialisation Packet
client -> server : Authentication request (with a valid user, this time)
server -> client : Authentication succeeded (EOF packet)
client -> server : COM_QUIT command (to send only if the previous response 
succeeded)

-- 
Cyril Bonté

Reply via email to