invalid arg to sysread deep within protocol.rb

  • Thread starter William E. Rubin
  • Start date
W

William E. Rubin

I just made a script that fetches certain web pages, using Net::HTTP,
over and over in a loop. Everything worked fine, for about 5000
iterations, but then the following error was thrown (this is in Ruby
1.8.3):

C:/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `sysread'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill'
C:/Ruby/lib/ruby/1.8/timeout.rb:45:in `timeout'
C:/Ruby/lib/ruby/1.8/timeout.rb:62:in `timeout'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:126:in `readline'
C:/Ruby/lib/ruby/1.8/net/http.rb:1988:in `read_status_line'
C:/Ruby/lib/ruby/1.8/net/http.rb:1977:in `read_new'
C:/Ruby/lib/ruby/1.8/net/http.rb:1046:in `request'
C:/Ruby/lib/ruby/1.8/net/http.rb:944:in `request_get'

The appropriate part in protocol.rb is this:

def rbuf_fill
timeout(@read_timeout) {
@rbuf << @io.sysread(1024)
}
end

So sysread suddenly considers "1024" to be an invalid number of bytes
to read? After having considered it valid on each of the previous 5000
iterations?

Any clues? Thanks.
 
L

Logan Capaldo

I just made a script that fetches certain web pages, using Net::HTTP,
over and over in a loop. Everything worked fine, for about 5000
iterations, but then the following error was thrown (this is in Ruby
1.8.3):

C:/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `sysread'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill'
C:/Ruby/lib/ruby/1.8/timeout.rb:45:in `timeout'
C:/Ruby/lib/ruby/1.8/timeout.rb:62:in `timeout'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
C:/Ruby/lib/ruby/1.8/net/protocol.rb:126:in `readline'
C:/Ruby/lib/ruby/1.8/net/http.rb:1988:in `read_status_line'
C:/Ruby/lib/ruby/1.8/net/http.rb:1977:in `read_new'
C:/Ruby/lib/ruby/1.8/net/http.rb:1046:in `request'
C:/Ruby/lib/ruby/1.8/net/http.rb:944:in `request_get'

The appropriate part in protocol.rb is this:

def rbuf_fill
timeout(@read_timeout) {
@rbuf << @io.sysread(1024)
}
end

So sysread suddenly considers "1024" to be an invalid number of bytes
to read? After having considered it valid on each of the previous 5000
iterations?

Any clues? Thanks.

Maybe there aren't 1024 bytes left? According to the docs sysread is
supposed to raise EOFError at the end of the file, are you sure
that's not being raised?
 
W

William E. Rubin

Maybe there aren't 1024 bytes left? According to the docs sysread is
supposed to raise EOFError at the end of the file, are you sure
that's not being raised?

Yes, I'm sure. Now that I look back at my original post, I notice that
I left out a crucial piece of information:

The error raised was an "Invalid Argument" error.
 
W

William E. Rubin

This seems to occur every few thousand iterations (not the same number
of iterations every time).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top