From 1caa3d4e275cdf7152153bb9231a7df1399710c2 Mon Sep 17 00:00:00 2001 From: Alex Young Date: Mon, 16 Jul 2012 12:34:39 +0100 Subject: [PATCH] Make an EADDRINUSE on server bind fatal. This is important because if we try to rebind after a migration and someone else is in the way, any clients trying to reconnect to us will instead be connecting to the squatter. --- src/serve.c | 10 +++++++++- tests/acceptance/fakes/source/successful_transfer.rb | 8 -------- tests/acceptance/flexnbd.rb | 9 +++++++-- tests/acceptance/test_dest_error_handling.rb | 3 ++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/serve.c b/src/serve.c index aee69cc..fff834a 100644 --- a/src/serve.c +++ b/src/serve.c @@ -232,13 +232,21 @@ void serve_bind( struct server * serve ) * Any of these other than EACCES, * EADDRINUSE or EADDRNOTAVAIL signify * that there's a logic error somewhere. + * + * EADDRINUSE is fatal: if there's + * something already where we want to be + * listening, we have no guarantees that + * any clients will cope with it. */ case EACCES: - case EADDRINUSE: case EADDRNOTAVAIL: debug("retrying"); sleep(1); continue; + case EADDRINUSE: + fatal( "%s port %d in use, giving up.", + s_address, + ntohs(serve->bind_to.v4.sin_port)); default: fatal( "Giving up" ); } diff --git a/tests/acceptance/fakes/source/successful_transfer.rb b/tests/acceptance/fakes/source/successful_transfer.rb index 4472aba..47e8ada 100755 --- a/tests/acceptance/fakes/source/successful_transfer.rb +++ b/tests/acceptance/fakes/source/successful_transfer.rb @@ -17,13 +17,5 @@ client.send_mirror() sleep(1) -squatter.close() - -sleep(1) - -client2 = FakeSource.new( newaddr, newport.to_i, "Timed out reconnecting" ) -client2.read_hello -client2.read( 0, 8 ) -client2.close exit( 0 ) diff --git a/tests/acceptance/flexnbd.rb b/tests/acceptance/flexnbd.rb index 2bb83cf..5326bfe 100644 --- a/tests/acceptance/flexnbd.rb +++ b/tests/acceptance/flexnbd.rb @@ -317,8 +317,13 @@ class FlexNBD _, status = Process.waitpid2( pid ) if @kill - fail "flexnbd quit with a bad status: #{status.exitstatus}" unless - @kill.include? status.exitstatus + if status.signaled? + fail "flexnbd quit with a bad signal: #{status.inspect}" unless + @kill.include? status.termsig + else + fail "flexnbd quit with a bad status: #{status.inspect}" unless + @kill.include? status.exitstatus + end else $stderr.puts "flexnbd #{self.pid} quit" fail "flexnbd #{self.pid} quit early with status #{status.to_i}" diff --git a/tests/acceptance/test_dest_error_handling.rb b/tests/acceptance/test_dest_error_handling.rb index 085cec8..27ef197 100644 --- a/tests/acceptance/test_dest_error_handling.rb +++ b/tests/acceptance/test_dest_error_handling.rb @@ -80,7 +80,8 @@ class TestDestErrorHandling < Test::Unit::TestCase end - def test_cant_rebind_retries + def test_cant_rebind_dies + @env.nbd1.can_die(6) run_fake( "source/successful_transfer" ) end