tmtm / ruby-mysql

MySQL connector for Ruby. pure Ruby version.
MIT License
143 stars 34 forks source link

NoMethodError: undefined method `unpack' for nil:NilClass after MySQL server is restarted #4

Closed rust closed 11 years ago

rust commented 14 years ago

接続した後に MySQL サーバを再起動すると表題のエラーが発生します。再現手順と環境は以下の通りです。

% uname -a
Linux precision-debian 2.6.26-2-amd64 #1 SMP Sun Jun 20 20:16:30 UTC 2010 x86_64 GNU/Linux
% ruby -v          
ruby 1.9.3dev (2010-07-07 trunk 28561) [x86_64-linux]

まずirbで接続してそのままにします。

% irb               
ruby-head > require 'mysql'
 => true 
ruby-head > my = Mysql.connect("127.0.0.1", "root", "", "sessions", 3306)
 => #, authinfo["root", "", "sessions", 0, nil], seq3, sqlstate"00000", server_info"5.1.43-1~bpo50+1-log", server_version50143, thread_id628, charset#, charset#, connect_timeoutnil, read_timeoutnil, write_timeoutnil, init_commandnil, affected_rowsnil, warning_count0, sqlstate"00000", query_with_resulttrue, host_info"127.0.0.1 via TCP/IP", infonil, last_errornil, result_existfalse, local_infilenil 
ruby-head > my.stat
 => "Uptime: 355595  Threads: 2  Questions: 24843  Slow queries: 634  Opens: 2128  Flush tables: 1  Open tables: 63  Queries per second avg: 0.69" 

別のターミナルでMySQLサーバを再起動します。

% sudo invoke-rc.d mysql restart
[sudo] password for ogawa: 
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld . ..
Checking for corrupt, not cleanly closed and upgrade needing tables..

再び irb で mysql.stat を実行するとエラーになります。

ruby-head > my.stat
NoMethodError: undefined method `unpack' for nil:NilClass
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:567:in `block in read'
    from /home/ogawa/.rvm/rubies/ruby-head/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:565:in `read'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:641:in `block in simple_command'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:545:in `synchronize'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:638:in `simple_command'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql/protocol.rb:413:in `statistics_command'
    from /home/ogawa/.rvm/gems/ruby-head/gems/ruby-mysql-2.9.3/lib/mysql.rb:502:in `stat'
    from (irb):5
    from /home/ogawa/.rvm/rubies/ruby-head/bin/irb:17:in `
'

MySQL::Protocol#readの @sock.read(4) が nil になるのが原因のようです。 エラーはともかく、NoMethodErrorでは何が起こったのかわかりにくいので、nil なら Errno::EPIPE: Broken pipe になるなどの対策をお願いしたいところです。

tmtm commented 11 years ago

クローズし忘れてましたが SHA: 8d0fdcfd で修正されていると思います。