Hi again Hervé,

Le Mercredi 13 Janvier 2010 12:56:30, Hervé COMMOWICK a écrit :
> Hi Cyril,
> 
> I know the check is not perfect, because it doesn't handle a correct 
> disconnection.
> Mysql expect the client to talk, and i think it's weird... in the 
> future, i think it will be better to do a *real* mysql ping, but at the 
> moment, the checks API doesn't let me handle this in a cleaner way.

This is not a patch but a start of reflection :

In the function event_srv_chk_r(int fd),
after this condition :
        if (trash[4] != -1) {

I added this quick and dirty reply :
        char handshake[] =
                "\x22\x00\x00"  /* packet length */
                "\x01"                  /* packet number */
                "\x00\x00"              /* client capabilities */
                "\x00\x00"              /* extended client capabilities */
                "\x00\x00\x00\x01"      /* max packet */
                "\x08"                  /* charset */
                
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
 /* reserved (23 bytes) */
                "\x00"                  /* username (null terminated string) */
                "\x00";                 /* empty password */
        send(fd, handshake, sizeof(handshake), MSG_DONTWAIT | MSG_NOSIGNAL);

After several tests, this finishes the handshake correctly.
Note that this packet is only valid for mysql >= 4.1 (haproxy would have to 
check the version to decide which reply to send).
At the moment, I have no mysql 4.0 to validate the other reply type.

For more information :
http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Client_Authentication_Packet

I hope this will be helpful.

-- 
Cyril Bonté

Reply via email to