diff --git a/src/serve.c b/src/serve.c index 91f2569..e720be0 100644 --- a/src/serve.c +++ b/src/serve.c @@ -816,8 +816,8 @@ int do_serve(struct server* params) int has_control; error_set_handler((cleanup_handler*) serve_cleanup, params); - serve_open_server_socket(params); serve_init_allocation_map(params); + serve_open_server_socket(params); serve_accept_loop(params); has_control = params->has_control; serve_cleanup(params, 0); diff --git a/tests/acceptance/flexnbd.rb b/tests/acceptance/flexnbd.rb index 1262982..887e7d8 100644 --- a/tests/acceptance/flexnbd.rb +++ b/tests/acceptance/flexnbd.rb @@ -314,9 +314,16 @@ module FlexNBD while !File.socket?(ctrl) pid, status = Process.wait2(@pid, Process::WNOHANG) - raise "server did not start (#{cmd})" if pid + raise "server did not start (#{cmd}) - UNIX socket didn't appear" if pid sleep 0.1 end + + while !socket_open? + pid, status = Process.wait2(@pid, Process::WNOHANG) + raise "server did not start (#{cmd}) - TCP socket didn't appear" if pid + sleep 0.1 + end + at_exit { kill } end private :run_serve_cmd @@ -511,7 +518,15 @@ module FlexNBD hsh end + def socket_open? + sock = (TCPSocket.new(@ip, @port) rescue nil) + !!sock + ensure + sock.close rescue nil if sock + end + end end + diff --git a/tests/acceptance/flexnbd/fake_source.rb b/tests/acceptance/flexnbd/fake_source.rb index 1f14719..5d4c91a 100644 --- a/tests/acceptance/flexnbd/fake_source.rb +++ b/tests/acceptance/flexnbd/fake_source.rb @@ -8,16 +8,35 @@ module FlexNBD class FakeSource def initialize( addr, port, err_msg, source_addr=nil, source_port=0 ) - timing_out( 2, err_msg ) do - @sock = if source_addr - TCPSocket.new( addr, port, source_addr, source_port ) - else - TCPSocket.new( addr, port ) - end + timing_out( 10, err_msg ) { + @sock = wait_for_server_socket( addr, port, source_addr, source_port ) + } + end + + + def wait_for_server_socket(addr, port, saddr = nil, sport = 0) + sock = nil + + loop do + sock = try_get_server_socket( addr, port, saddr, sport ) + break if sock + sleep 0.1 + end + + sock + end + + def try_get_server_socket(addr, port, saddr = nil, sport = 0) + if saddr + TCPSocket.new( addr, port, saddr, sport ) rescue nil + else + TCPSocket.new( addr, port ) rescue nil end end + + def close @sock.close end @@ -137,3 +156,4 @@ module FlexNBD end # class FakeSource end # module FlexNBD +