kill osrm-routed if it refuses to shutdown in cuke tests

This commit is contained in:
Emil Tin 2012-12-15 17:01:24 +01:00
parent 7f7055a9e7
commit 7e9614b9ec

View File

@ -1,14 +1,24 @@
require 'socket' require 'socket'
require 'sys/proctable' require 'sys/proctable'
LAUNCH_TIMEOUT = 5 LAUNCH_TIMEOUT = 2
SHUTDOWN_TIMEOUT = 5 SHUTDOWN_TIMEOUT = 2
class OSRMLauncher class OSRMLauncher
def initialize &block def initialize &block
Dir.chdir TEST_FOLDER do Dir.chdir TEST_FOLDER do
begin begin
begin launch
yield
ensure
shutdown
end
end
end
private
def launch
Timeout.timeout(LAUNCH_TIMEOUT) do Timeout.timeout(LAUNCH_TIMEOUT) do
osrm_up osrm_up
wait_for_connection wait_for_connection
@ -16,21 +26,18 @@ class OSRMLauncher
rescue Timeout::Error rescue Timeout::Error
raise "*** Launching osrm-routed timed out." raise "*** Launching osrm-routed timed out."
end end
yield
ensure def shutdown
begin
Timeout.timeout(SHUTDOWN_TIMEOUT) do Timeout.timeout(SHUTDOWN_TIMEOUT) do
osrm_down osrm_down
end end
rescue Timeout::Error rescue Timeout::Error
kill
raise "*** Shutting down osrm-routed timed out." raise "*** Shutting down osrm-routed timed out."
end end
end
end
end
end
def osrm_up?
def osrm_up?
if @pipe if @pipe
begin begin
Process.getpgid @pipe.pid Process.getpgid @pipe.pid
@ -41,31 +48,30 @@ def osrm_up?
else else
false false
end end
end end
def osrm_up def osrm_up
return if osrm_up? return if osrm_up?
#exec avoids popen running osrm-routed inside a shell #exec avoids popen running osrm-routed inside a shell
#if the cmd is run inside a shell, popen returns the pid for the shell, and if we try to kill it, #if the cmd is run inside a shell, popen returns the pid for the shell, and if we try to kill it,
#the child process is orphaned, and we can't terminate it. #the child process is orphaned, and we can't terminate it.
@pipe = IO.popen('exec ../osrm-routed 1>>osrm-routed.log 2>>osrm-routed.log') @pipe = IO.popen('exec ../osrm-routed 1>>osrm-routed.log 2>>osrm-routed.log')
end end
def osrm_down def osrm_down
if @pipe if @pipe
Process.kill 'TERM', @pipe.pid Process.kill 'TERM', @pipe.pid
wait_for_shutdown wait_for_shutdown
@pipe = nil
end end
end end
def kill def kill
if @pipe if @pipe
Process.kill 'KILL', @pipe.pid Process.kill 'KILL', @pipe.pid
end end
end end
def wait_for_connection def wait_for_connection
while true while true
begin begin
socket = TCPSocket.new('localhost', OSRM_PORT) socket = TCPSocket.new('localhost', OSRM_PORT)
@ -74,10 +80,11 @@ def wait_for_connection
sleep 0.1 sleep 0.1
end end
end end
end end
def wait_for_shutdown def wait_for_shutdown
while osrm_up? while osrm_up?
sleep 0.1 sleep 0.1
end end
end
end end