Hey, Just a quick note that we experienced similar difficulties with reconnection and mysqlplus.
Found sending a mysql_ping down the wire to assert that the thread identifier changed works best. libmysqld also reuses previously opened file descriptors for reconnection attempts. http://github.com/oldmoe/mysqlplus/commit/8e6f300f9db75f07c03049efd00a6b91fe16538d http://github.com/oldmoe/mysqlplus/blob/8e6f300f9db75f07c03049efd00a6b91fe16538d/test/reconnected_test.rb Reconnect behavior is especially important for an async interface as simply setting mysql.reconnect = true essentially invalidates an existing operation when sent down the wire, but pending a result. http://github.com/oldmoe/mysqlplus/commit/85141abf097a375520ca5cf17df4bccc48523d3e Noticed sporadic "MySQL server has gone away" in our environment with 2.3 / Edge ( stock mysql gem ) and am aware of others in the same boat. Essentially any of the following error states should warrant a reconnect : * CR_SERVER_LOST * CR_SERVER_GONE_ERROR * ER_SERVER_SHUTDOWN The latter being important for MySQL server restarts as well. Thoughts ? - Lourens On 2009/01/22, at 11:16, dubek wrote: > > Hi, > > In commit 9051da90e4da2ab0db16530a7f7568e24a0ccaed the following line > was added to MysqlAdapter#connect: > > @connection.reconnect = true if @connection.respond_to? > (:reconnect=) > > There are couple of problems with this: > > 1. It doesn't stick. A look at the sources of the mysql gem tells that > the > real_connect method sets reconnect to 0 (false). Since real_connect > is called > after the line given about, it'll reset the value of reconnect to > 0. A simple > test for that will be: > > def test_connection_has_mysql_reconnect_property > @connection = ActiveRecord::Base.connection > mysql_connection = @connection.instance_variable_get > (:@connection) > assert mysql_connection.reconnect > end > > This test fails. And it's easy to fix, we'll just move the line > above to > somewhere after the real_connect() call. (Unless, I'm missing > something, > of course.) > > > 2. Even after I fixed #1, I couldn't make reconnect work in my tests. > I did a simple > test without AR (directly with mysql gem), and it works OK (you can > see that > reconnection happened because the thread_id of the connection is > modified). > However, with AR I keep getting the "MySQL server has gone away" > errors. Here's > my test (should be in connection_test_mysql.rb): > > def test_select_auto_reconnects_after_connection_lost > mysql_connection = @connection.instance_variable_get > (:@connection) > assert mysql_connection.reconnect > > original_thread_id = mysql_connection.thread_id > assert_equal ["42"], @connection.select_values('SELECT 42') > > @connection.update('set @@wait_timeout=1') > sleep 2 > > # this shouldn't raise Mysql::Error if reconnect is true > assert_equal ["42"], @connection.select_values('SELECT 42') > new_thread_id = mysql_connection.thread_id > assert_not_equal original_thread_id, new_thread_id > end > > > 3. Do we want the reconnection at all? According to Mysql docs > ( http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html ) > the auto-reconnect does not save any session variables. This > includes these > two settings that AR sets after connection is established: > > SET NAMES 'utf8' > SET SQL_AUTO_IS_NULL=0 > > Which means, if the server was gone, auto-reconnect takes place on > the next > query, but the variables are back to the server default (use > SHOW VARIABLES LIKE 'character_set_client' to view the variable > value before > and after the reconnection). On my machine it's back to 'latin1'. > > > See previous (related) discussion at: > http://groups.google.com/group/rubyonrails-core/browse_thread/thread/a6a7eccf05b24c0 > > Best, > dubek. > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---