From: Paul Lutus Date: 2006-12-07T19:30:07+09:00 Subject: Re: NoMethodError in protocol.rb Alex Young wrote: > Does this look familiar to anyone? > > NoMethodError: undefined method `+' for nil:NilClass at > /usr/local/lib/ruby/1.8/net/protocol.rb:176:in `write0' > > I'm getting it sporadically during some fairly heavy XMLRPC traffic. It > doesn't make very much sense to me, because write0 looks like this: > > def write0(str) > @debug_output << str.dump if @debug_output > len = @io.write(str) > @written_bytes += len # <= line 176 > len > end > > The error must mean that @written_bytes is nil. It's only called from > within a block passed to writing, which looks like this: > > def writing > @written_bytes = 0 > @debug_output << '<- ' if @debug_output > yield You aren't showing us the block to which this yield refers. Does that block modify @written_bytes? > @debug_output << "\n" if @debug_output > bytes = @written_bytes > @written_bytes = nil > bytes Okay, here you are modifying the @written_bytes class variable, assigning it nil, and this is likely to be the problem. Can I ask why you are using an instance variable here rather than a method-local one? Can't this need be met by a local variable? > end > > Is this a known thread-safety issue with a known solution, or would a > patch be in order? I've been testing this on 1.8.4, because that's what > we've got in production. Does anyone know if it's been addressed in > 1.8.5? AFAICS, it's not yet obvious to me that it is a language issue, as opposed to a coding issue. -- Paul Lutus http://www.arachnoid.com