Project

General

Profile

Actions

Bug #3999

closed

imap connection thread stuck on wait call

Added by kbaum (Karl Baum) about 14 years ago. Updated over 13 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
ruby -v:
jruby
[ruby-core:32939]

Description

=begin
My ruby application is making many connections to imap servers and after about a day or so of running, all 200 worker threads deadlock on @response_arrival.wait within imap.rb:

 def get_tagged_response(tag)
   until @tagged_responses.key?(tag)
     @response_arrival.wait
   end
   return pick_up_tagged_response(tag)
 end

I looked at the code and the following lines look suspicious to me:

def receive_responses
while true
begin
resp = get_response
rescue Exception
@sock.close
@client_thread.raise($!)
break
end
break unless resp
begin
synchronize do
case resp
when TaggedResponse
@tagged_responses[resp.tag] = resp
@response_arrival.broadcast
if resp.tag == @logout_command_tag
return
end
when UntaggedResponse
record_response(resp.name, resp.data)
if resp.data.instance_of?(ResponseText) &&
(code = resp.data.code)
record_response(code.name, code.data)
end
if resp.name == "BYE" && @logout_command_tag.nil?
@sock.close
raise ByeResponseError, resp.raw_data
end
when ContinuationRequest
@continuation_request = resp
@response_arrival.broadcast
end
@response_handlers.each do |handler|
handler.call(resp)
end
end
rescue Exception
@client_thread.raise($!)
end
end
end

It looks like in the conditions of "when UntaggedResponse", the @response_arrival.broadcast is not invoked. Would this cause the waiting thread to wait forever?

thx
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0