[ruby-list:39541] Webrick + ruby-mswin32 で Errno::EINVAL
From:
Ken-ichi HASHIMOTO <ken@...14m.org>
Date:
2004-04-12 13:16:27 UTC
List:
ruby-list #39541
橋本です。
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