I've got a problem with timing out a C RFC call.

Essentially, I've got code that initializes and executes an RFC to a
remote server that, depending on the server, could take a significant
amount of time to return a response.

To minimize end-user impact, I wrapped the call with a timeout of 20
seconds.

When I executed a test, it didn't appear to do anything as the process
still took 120-130 seconds to complete.

After digging around a bit, I discovered this writeup about timeout and
system calls
(http://adamblog.heroku.com/past/2008/6/17/battling_wedged_mongrels_with_a/).

I immediately installed SystemTimer
(http://ph7spot.com/articles/system_timer) and tried again:

begin
  require 'system_timer'
  MyTimer = SystemTimer
rescue LoadError
  require 'timeout'
  MyTimer = Timeout
end

def invoke(rfc)
    MyTimer.timeout_after(20.seconds) do
      rfc.invoke
    end
    rescue Timeout::Error
      raise Timeout::Error, "RFC Call timed out after 20 seconds"
end

This time, it executed and waited the full length of time (120-130
seconds).  20 seconds AFTER it completed, I then saw the "RFC Call timed
out after 20 seconds" error written to the logs.

After some more investigation, I read about Terminator and the use of
new threads to kill stuck/long-running threads.

I installed it and updated my above block of code to use the Terminator
syntax.

This time when I ran it, a view of the process list showed that the new
thread got created with a timer of 20 seconds.  20 seconds into
processing, the thread showed as <Defunct> and nothing happened to the
existing thread... that is until it completed.  Once the process
finished running, the mongrel log shows that it was issued a restart
command and restarted.

What am I doing wrong?  There must be a way to timeout a system level C
API/RFC call...

Running Ruby 1.8.6 p114 on CentOS 5.1 64-bit with mongrel 1.1.5

Thanks in advance for anyone who can help!
-- 
Posted via http://www.ruby-forum.com/.
_______________________________________________
Mongrel-users mailing list
Mongrel-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-users

Reply via email to