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
-~----------~----~----~----~------~----~------~--~---

Reply via email to