logo       

[ruby-list:43021] Open3: msg#00006

lang.ruby.japanese

Subject: [ruby-list:43021] Open3

大原です。

Open3 を使っていて気になった点がありましたので報告します。

Open3 と ActiveRecord を使っているときに、
Open3 でコマンド起動に失敗すると、
それ以降 ActiveRecord の検索が失敗するという現象が起こりました。


具体的には、こんなスクリプト

% cat foo.rb
#!/usr/local/bin/ruby
require "rubygems"
require_gem "activerecord"
require "open3"
class Foo < ActiveRecord::Base; end
Foo.establish_connection(:adapter => "mysql", :database => "foo",
:user => "user", :password => "password")
Foo.find_first
Open3::popen3("nonexistent")
sleep 1
Foo.find_first

を実行すると、 2回目の AR::find で下記のようなエラーとなりました。

% ruby -v
ruby 1.8.5 (2006-08-25) [i386-freebsd6]
% mysql --version
mysql Ver 14.12 Distrib 5.0.27, for portbld-freebsd6.1 (i386) using 5.0
% ruby foo.rb
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/abstract_adapter.rb:120:in
`log': Mysql::Error: MySQL server has gone away: SELECT * FROM foos LIMIT 1
(ActiveRecord::StatementInvalid)
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/mysql_adapter.rb:184:in
`execute'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/mysql_adapter.rb:336:in
`select'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_adapters/mysql_adapter.rb:175:in
`select_all'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/base.rb:390:in
`find_by_sql'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/base.rb:924:in
`find_every'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/base.rb:918:in
`find_initial'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/base.rb:380:in
`find'
from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/deprecated_finders.rb:22:in
`find_first'
from foo.rb:11


fork した子が exec 失敗後に終了する際に
ActiveRecord 的な後始末を行ってしまっておかしくなっているのかなと推測し、
open3.rb に下記のような修正を行ってみたところ、
この現象は無くなりました。

どうするのが正しい対処法なのかわからなかったのですが、
とりあえず御報告まで。


--- /usr/local/lib/ruby/1.8/open3.rb Sat Aug 5 07:00:21 2006
+++ open3.rb Wed Dec 6 18:44:30 2006
@@ -45,7 +45,11 @@
STDERR.reopen(pe[1])
pe[1].close

- exec(*cmd)
+ begin
+ exec(*cmd)
+ ensure
+ exit!(0)
+ end
}
exit!(0)
}

----
OHARA Shigeki (大原 重樹) <os-cj7TXg5MjN14Eiagz67IpQ@xxxxxxxxxxxxxxxx>




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise