Ben Armstrong created JRUBY-6274:
------------------------------------

             Summary: OpenVMS: IOError when TCP client hangs up, filling 
webrick log with unhandled exceptions
                 Key: JRUBY-6274
                 URL: https://jira.codehaus.org/browse/JRUBY-6274
             Project: JRuby
          Issue Type: Bug
          Components: Standard Library
    Affects Versions: JRuby 1.6.5, JRuby 1.6.3, JRuby 1.6
         Environment: OpenVMS V8.3-1H1/I64, Java 1.6.0
            Reporter: Ben Armstrong
            Assignee: Thomas E Enebo
            Priority: Minor


Wrong exceptions are thrown when TCP client hangs up, filling WEBrick's log 
with spurious error messages, since these "normal" conditions that could have 
been caught by WEBrick and dealt with are not being handled. This happens, for 
example, if I serve up a large file from a WEBrick server and break the 
connection before the file is completely delivered, a perfectly normal thing to 
do.

For EPIPE and ECONNRESET errors respectively, I see messages like:

[2011-08-22 10:24:08] ERROR IOError: broken pipe (errno:32)
[2011-11-26 11:41:44] ERROR IOError: connection reset by peer   (errno:54)

>From a search of the web, the errors that people more typically report look 
>like:

[2011-04-02 01:04:39] ERROR Errno::EPIPE: Broken pipe
[2011-09-10 10:14:25] ERROR Errno::ECONNRESET: Connection reset by peer

In my brief survey of the WEBrick code, in some places these errors are 
rescued, but since WEBrick does not (usually) handle IOError, they end up as 
stack dumps in the log.

I can reproduce this in several versions of JRuby running on VMS, including the 
patched for VMS 1.6.3 kit (includes FFI) from Philippe Vouters and Thierry Uso 
at: http://vmsfree.ouvaton.org/freen/index.php?s=jruby and also a pristine, 
unmodified 1.6.5 binary kit obtained directly from 
http://www.jruby.org/download, and an unmodified 1.6.0 binary kit we have 
deployed in production.

What I don't understand at this point is if these are bugs in HP Java (as we 
found before with concurrent file access in webrick) or a deficiency in the 
JRuby VMS port. What is responsible for mapping the error codes that appear 
here as "errno:#" into proper exceptions that could then be handled by WEBrick 
and other standard ruby library code?

Here is a minimal failing case, starting the server on VMS:

$ ruby -e "require 
'webrick';s=WEBrick::HTTPServer.new(:DocumentRoot=>'/dsa0/bg/',:Port=>8080);['INT','TERM'].each{|_|trap(_){s.shutdown}};s.start"

and from my workstation:

$ wget http://dyma:8080/words2.txt
... ^C before the file is complete ...

where words2.txt is a 27M test file.

This is the output from webrick (on JRuby 1.6.5):

[2011-12-14 11:32:21] INFO  WEBrick 1.3.1
[2011-12-14 11:32:21] INFO  ruby 1.8.7 (2011-10-25) [java]
[2011-12-14 11:32:21] INFO  WEBrick::HTTPServer#start: pid=564898696 port=8080
[2011-12-14 11:32:33] ERROR IOError: broken pipe (errno:32)
        org/jruby/RubyIO.java:1323:in `write'
        org/jruby/RubyIO.java:1469:in `<<'
        /jruby_root/lib/ruby/1.8/webrick/httpresponse.rb:324:in `_write_data'
        /jruby_root/lib/ruby/1.8/webrick/httpresponse.rb:317:in `_send_file'
        /jruby_root/lib/ruby/1.8/webrick/httpresponse.rb:272:in `send_body_io'
        /jruby_root/lib/ruby/1.8/webrick/httpresponse.rb:186:in `send_body'
        /jruby_root/lib/ruby/1.8/webrick/httpresponse.rb:104:in `send_response'
        /jruby_root/lib/ruby/1.8/webrick/httpserver.rb:79:in `run'
        /jruby_root/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
        org/jruby/RubyProc.java:270:in `call'
        org/jruby/RubyProc.java:224:in `call'
24.222.19.4 - - [14/Dec/2011:11:32:32 AST] "GET /words2.txt HTTP/1.1" 200 0
- -> /words2.txt

If I keep at it long enough, re-fetching and interrupting the transfer near the 
end, I can force an error that I expected to be returned as Errno::ECONNRESET 
error like:

[2011-12-14 11:45:16] ERROR IOError: connection reset by peer   (errno:54)
        org/jruby/RubyIO.java:1851:in `eof?'
        /jruby_root/lib/ruby/1.8/webrick/httpserver.rb:55:in `run'
        /jruby_root/lib/ruby/1.8/webrick/httpserver.rb:48:in `run'
        /jruby_root/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
        /jruby_root/lib/ruby/1.8/webrick/server.rb:163:in `start_thread'
        org/jruby/RubyProc.java:270:in `call'
        org/jruby/RubyProc.java:224:in `call'
24.222.19.4 - - [14/Dec/2011:11:45:16 AST] "GET /words2.txt HTTP/1.1" 200 
27355064
- -> /words2.txt

Having our logs filled with garbage is annoying enough, but we are on the trail 
of a more serious (and apparently quite VMS-specific) issue, causing WEBrick to 
crash, seen in https://gist.github.com/1416904. This issue may or may not be 
contributed to by the fact that webrick is not handling these conditions 
properly. That's what I would like to determine. If I can get webrick to handle 
EPIPE and ECONNRESET properly and we're still seeing webrick crashes, we have 
something different on our hands and I'll file a separate bug.

Once again, I understand few people are familiar with OpenVMS, so I'm reaching 
out for help to debug this on my own. I require deeper knowledge of Java and 
JRuby to know where to look.

Thanks,
Ben



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to