[ruby-list:43021] Open3

From: OHARA Shigeki <os@...>
Date: 2006-12-08 10:16:12 UTC
List: ruby-list #43021
大原です。

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@iij.ad.jp>

In This Thread

Prev Next