From: Ken-ichi HASHIMOTO Date: 2004-04-12T22:16:27+09:00 Subject: [ruby-list:39541] Webrick + ruby-mswin32 で Errno::EINVAL 橋本です。 ruby-mswin32の問題だと思うのですが、webrickを使った場合しか 再現方法が分かっていません。 今まで悩んでいたのですが、調査にも詰まってきたので、 皆様のお力をお借りしたくご報告させていただきます。 現象: webrickでwebサーバを動作させ、ローカルからブラウザで 多くの要求を出すとSOCKETが例外を出す。 ログを最後に書いておきます。 再現コード: -------------------- require 'webrick' s=WEBrick::HTTPServer.new( :BindAddress => "127.0.0.1", :Port => 23456 ) trap("INT"){ s.shutdown } s.start -------------------- 再現方法: インターネットエクスプローラから該当アドレスにアクセスし 多重に要求を出す。 例: IE から http://localhost:23456/ にアクセスし、その後 リロードをたくさん(F5攻撃)行う。 再現環境 ruby 1.8.1 mswin 版 ruby 1.9.0 mswin 版 OS Windows 2000 Pro + SP4 CPU Mobile P3 850MHz MEM 384M その他情報: 以前から調査を行っていた時の記憶です。 (事実と異なる場合があるかもしれませんが、参考になればと思い書いておきます) ・ruby 1.6 mswin版でも発生していた ・場合によるが、gets で発生する場合と write で発生する場合がある (例えば、rthmlなファイルを処理した時、writeで同様に発生する場合もある) ・writeの場合、socket に対して << でデータを書いているが、 socket に send を行ったところ、再現しなくなったように思える (しかし、getsで発生するようになるので、本当に大丈夫か分からない) ・Linux では発生していないっぽい (昔の調査でやっていたため、もしかすると勘違いかも) ・IO(io.c) の バッファリング の処理付近で発生しているっぽい ( Scoket系の個所にトレース文を入れてコンパイルしてみたが、 Errno::EINVAL を発生させる場所は見つかっていない。 IO の 例外を出す付近で発生させてる事を確認した事を覚えている ) ・単純なソケットの要求処理をRUBY thread で多重処理させても 発生しなかった(負荷だけの問題だけではないらしい) 憶測: ・Winsock と ファイルディスクリプタに関する何かが windowsだと何か変? (Win95とかだと問題があるとかいう事を聞いた事がある) ・IO系と、RubyのThreadに関して、mswin32版だと相性が悪い? ログ: >ruby bug.rb [2004-04-12 21:21:55] INFO WEBrick 1.3.1 [2004-04-12 21:21:55] INFO ruby 1.8.1 (2004-04-02) [i386-mswin32] [2004-04-12 21:21:55] INFO WEBrick::HTTPServer#start: pid=2060 port=23456 LAPIS2 - - [12/Apr/2004:21:22:18 東京 (標準時)] "GET / HTTP/1.1" 404 271 - -> / LAPIS2 - - [12/Apr/2004:21:22:22 東京 (標準時)] "GET / HTTP/1.1" 404 271 - -> / LAPIS2 - - [12/Apr/2004:21:22:27 東京 (標準時)] "GET / HTTP/1.1" 404 271 - -> / [2004-04-12 21:22:28] ERROR Errno::EINVAL: Invalid argument C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:307:in `gets' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:307:in `__send__' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:307:in `_read_data' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:306:in `timeout' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/timeout.rb:55:in `timeout' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:306:in `_read_data' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:317:in `read_line' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:207:in `read_request_line' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httprequest.rb:80:in `parse' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/httpserver.rb:46:in `run' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:150:in `start_thread' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:144:in `start' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:144:in `start_thread' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:94:in `start' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:89:in `each' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:89:in `start' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:79:in `start' C:/OtherProgramFiles/Ruby/lib/ruby/1.8/webrick/server.rb:79:in `start' bug.rb:8 >d:\ruby-1.9\bin\ruby bug.rb [2004-04-12 21:29:16] INFO WEBrick 1.3.1 [2004-04-12 21:29:16] INFO ruby 1.9.0 (2004-04-02) [i386-mswin32] [2004-04-12 21:29:16] INFO WEBrick::HTTPServer#start: pid=2048 port=23456 [2004-04-12 21:29:40] ERROR `/' not found. LAPIS2 - - [12/Apr/2004:21:29:40 東京 (標準時)] "GET / HTTP/1.1" 404 271 - -> / [2004-04-12 21:29:45] ERROR `/' not found. LAPIS2 - - [12/Apr/2004:21:29:45 東京 (標準時)] "GET / HTTP/1.1" 404 271 - -> / [2004-04-12 21:29:45] ERROR Errno::EINVAL: Invalid argument d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:307:in `gets' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:307:in `__send__' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:307:in `_read_data' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:306:in `timeout' d:/ruby-1.9/lib/ruby/1.9/timeout.rb:55:in `timeout' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:306:in `_read_data' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:317:in `read_line' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:207:in `read_request_line' d:/ruby-1.9/lib/ruby/1.9/webrick/httprequest.rb:80:in `parse' d:/ruby-1.9/lib/ruby/1.9/webrick/httpserver.rb:49:in `run' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:153:in `start_thread' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:147:in `start' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:147:in `start_thread' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:97:in `start' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:89:in `each' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:89:in `start' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:79:in `start' d:/ruby-1.9/lib/ruby/1.9/webrick/server.rb:79:in `start' bug.rb:8 -- Ken-ichi HASHIMOTO E-Mail ken@club.h14m.org