# Mongrel Timeout for System Calls

**URL:** <https://www.ruby-forum.com/t/mongrel-timeout-for-system-calls/174966>\
**Category:** Mongrel\
**Created:** [September 4, 2009, 9:45pm UTC](https://www.ruby-forum.com/t/mongrel-timeout-for-system-calls/174966 "2009-09-04T21:45:36Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![jmadtech](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/7cd45c/32.png) [@jmadtech](https://www.ruby-forum.com/u/jmadtech)\
**Post date:** [September 4, 2009, 9:45pm UTC](https://www.ruby-forum.com/t/mongrel-timeout-for-system-calls/174966/1 "2009-09-04T21:45:36Z")

</div>

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/](http://adamblog.heroku.com/past/2008/6/17/battling_wedged_mongrels_with_a/)).

I immediately installed SystemTimer  
([http://ph7spot.com/articles/system\_timer](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 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!
