mysql-proxy-discuss team mailing list archive
-
mysql-proxy-discuss team
-
Mailing list archive
-
Message #00231
Re: rw-splitting: proxy chokes on MYSQLD_PACKET_EOF
Hi Georg,
Thanks for al this information, could you open a bug report at
http://bugs.mysql.com/report.php
with the details you found?
Thanks
Diego
On Fri, Jul 24, 2009 at 8:13 AM, Georg Moritz<georg.moritz@xxxxxxxxxxxx> wrote:
> Hello Diego, hello team,
>
> after poking around a bit and adding debug print statements, I found out
> that rw-splitting.lua only works with non-authenticated connections.
>
> Running the loop
>
> bash# for i in `seq 1 11`; do
> > echo "select count(ip) from awl;" | \
> > mysql -h 10.1.2.24 --port=4040 -u amavis -ppass sa_bayes
> > done
>
> the mysql-proxy on the master node 10.1.2.20 to which the mysql-proxy
> on 10.1.2.24 connects, chokes with the 11th connection:
>
> ---8<---
> [connect_server] 10.1.2.24:57708
> [1].connected_clients = 0
> [1].pool.cur_idle = 5
> [1].pool.max_idle = 8
> [1].pool.min_idle = 4
> [1].type = 1
> [1].state = 1
> [2].connected_clients = 0
> [2].pool.cur_idle = 0
> [2].pool.max_idle = 8
> [2].pool.min_idle = 4
> [2].type = 2
> [2].state = 1
> [2] idle-conns below min-idle
> [read_query] 10.1.2.24:57708
> current backend = 0
> client default db = sa_bayes
> client username = amavis
> query = select count(ip) from awl
> statement = TK_SQL_SELECT
> BACKEND_TYPE_RO s.state = 1
> conns.cur_idle_connections = 5
> ***** choosing backend 2
> sending to backend : 127.0.0.1:3306
> is_slave : true
> server default db: sa_bayes
> server username : amavis
> in_trans : false
> in_calc_found : false
> COM_QUERY : true
> [read_query] 10.1.2.24:57708
> current backend = 0
> client default db = sa_bayes
> client username = amavis
> (QUIT) current backend = 0
> [disconnect_client] 10.1.2.24:57708
>
> [connect_server] 10.1.2.24:57710
> [1].connected_clients = 0
> [1].pool.cur_idle = 5
> [1].pool.max_idle = 8
> [1].pool.min_idle = 4
> [1].type = 1
> [1].state = 1
> [2].connected_clients = 0
> [2].pool.cur_idle = 5
> [2].pool.max_idle = 8
> [2].pool.min_idle = 4
> [2].type = 2
> [2].state = 1
> [1] taking master as default <==== here
> using pooled connection from: 1 <==== it chokes
> [disconnect_client] 10.1.2.24:57710
> ---8<---
>
> The "taking master as default" message from rw-splitting.lua is printed
> in function connect_server() if the last branch of the if-condition in
> the backends-loop is met:
>
> ---8<---
> elseif s.type == proxy.BACKEND_TYPE_RW and
> s.state ~= proxy.BACKEND_STATE_DOWN and
> rw_ndx == 0 then
> rw_ndx = i
> end
> end
>
> if proxy.connection.backend_ndx == 0 then
> if is_debug then
> print(" [" .. rw_ndx .. "] taking master as default")
> end
> proxy.connection.backend_ndx = rw_ndx
> end
>
> -- pick a random backend
> --
> -- we someone have to skip DOWN backends
>
> -- ok, did we got a backend ?
>
> if proxy.connection.server then
> if is_debug then
> print(" using pooled connection from: " .. proxy.connection.backend_ndx)
> end
>
> -- stay with it
> return proxy.PROXY_IGNORE_RESULT
> end
> ---8<---
>
> After the "return proxy.PROXY_IGNORE_RESULT", the mysql proxy on the master
> node gets a MYSQLD_PACKET_EOF which triggers the g_error() at line 468 in function
> network_mysqld_proto_get_query_result() in file src/network-mysqld-packet.c:
>
> 441 int network_mysqld_proto_get_query_result(network_packet *packet, network_mysqld_con *con) {
> 442 guint8 status;
> 443 int is_finished = 0;
> 444 int err = 0;
> 445 network_mysqld_eof_packet_t *eof_packet;
> 446
> 447 err = err || network_mysqld_proto_skip_network_header(packet);
> 448 if (err) return -1;
> 449
> 450 /* forward the response to the client */
> 451 switch (con->parse.command) {
> 452 case COM_CHANGE_USER:
> 453 /**
> 454 * - OK
> 455 * - ERR (in 5.1.12+ + a duplicate ERR)
> 456 */
> 457 err = err || network_mysqld_proto_get_int8(packet, &status);
> 458 if (err) return -1;
> 459
> 460 switch (status) {
> 461 case MYSQLD_PACKET_ERR:
> 462 is_finished = 1;
> 463 break;
> 464 case MYSQLD_PACKET_OK:
> 465 is_finished = 1;
> 466 break;
> 467 default:
> 468 g_error("%s.%d: COM_(0x%02x) should be (ERR|OK), got %02x",
> 469 __FILE__, __LINE__,
> 470 con->parse.command, status);
> 471 break;
> 472 }
> 473 break;
> 474 case COM_INIT_DB:
>
>
> It seems that this is related to the statement at
> http://forge.mysql.org/wiki/MySQL_Proxy_RW_Splitting
>
> "As the authentication protocol never transmits the real password nor anything we
> can use to authenticate against another server, we need a internal storage of
> credentials to open connections to the backend-servers when we are short of
> connections in the pool."
>
> best regards,
> 0--gg-
>
> From the keyboard of Diego Medina [20.07.09,16:06]:
>
>> Hi Georg,
>>
>> Are you using a mysql proxy "in between" the replication between your
>> master and slave? Or are you using a proxy in between your web
>> application and the database?
>>
>> In either case, could you identify what query is causing the error?
>>
>> Thanks.
>>
>> Diego
>>
>> On Sat, Jul 18, 2009 at 5:44 PM, Georg Moritz<georg.moritz@xxxxxxxxxxxx> wrote:
>> >
>> > IMHO MySQL-Proxy shold handle an EOF gracefully. If I omit the rw-splitting.lua
>> > script, all queries are sent to the MySL Master Proxy - that works like a charm;
>> > but I need read/write splitting...
>> >
>> > Any clues?
>> >
>> > 0--gg-
>
> --
> _($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
> /\_¯/(q /
> ---------------------------- \__(m.====·.(_("always off the crowd"))."·
> ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
>
--
Diego Medina
Web Developer
http://www.fmpwizard.com
References