From 32cae67a75434ef5487c70b9f8f42e233f8ba31d Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 25 Sep 2012 11:47:44 +0100 Subject: [PATCH] flexnbd: Move building the allocation map to before server socket bind() Building the allocation map takes time, which scales with the size of the disc being presented. By building that map in the space between bind() and accept(), we leave the process in a useless state after the only good signal we have for "we are ready" and the state where it is actually ready. This was breaking migrations of large files. --- src/serve.c | 2 +- tests/acceptance/flexnbd.rb | 17 ++++++++++++- tests/acceptance/flexnbd/fake_source.rb | 32 ++++++++++++++++++++----- 3 files changed, 43 insertions(+), 8 deletions(-) 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 +