Added the flexnbd break command to stop mirroring

This commit is contained in:
Alex Young
2012-07-17 16:30:49 +01:00
parent 1caa3d4e27
commit 314c0c2a2a
10 changed files with 223 additions and 8 deletions

View File

@@ -42,6 +42,10 @@ class Environment
end
def break1
@nbd1.break
end
def acl1( *acl )
@nbd1.acl( *acl )
end
@@ -111,7 +115,7 @@ class Environment
end
def run_fake( name, addr, port, rebind_addr = addr, rebind_port = port )
def run_fake( name, addr, port, rebind_addr = addr, rebind_port = port, sock=nil )
fakedir = File.join( File.dirname( __FILE__ ), "fakes" )
fake = Dir[File.join( fakedir, name ) + "*"].sort.find { |fn|
File.executable?( fn )
@@ -124,7 +128,7 @@ class Environment
raise "no rebind_port" unless rebind_port
@fake_pid = fork do
exec [fake, addr, port, @nbd1.pid, rebind_addr, rebind_port].map{|x| x.to_s}.join(" ")
exec [fake, addr, port, @nbd1.pid, rebind_addr, rebind_port, sock].map{|x| x.to_s}.join(" ")
end
sleep(0.5)
end

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env ruby
# encoding: utf-8
# Open a server, accept a client, then cancel the migration by issuing
# a break command.
require 'flexnbd/fake_dest'
include FlexNBD
addr, port, src_pid, _, _, sock = *ARGV
server = FakeDest.new( addr, port )
client = server.accept
ctrl = UNIXSocket.open( sock )
Process.kill("STOP", src_pid.to_i)
ctrl.write( "break\n" )
ctrl.close_write
client.write_hello
Process.kill("CONT", src_pid.to_i)
fail "Unexpected control response" unless
ctrl.read =~ /0: mirror stopped/
client2 = nil
begin
client2 = server.accept( "Expected timeout" )
fail "Unexpected reconnection"
rescue Timeout::Error
# expected
end
client.close
exit(0)

View File

@@ -271,6 +271,11 @@ class FlexNBD
"#{@debug} "
end
def break_cmd
"#{@bin} break "\
"--sock #{ctrl} "\
"#{@debug}"
end
def status_cmd
"#{@bin} status "\
@@ -416,6 +421,14 @@ class FlexNBD
end
def break(timeout=nil)
cmd = break_cmd
debug( cmd )
maybe_timeout( cmd, timeout )
end
def acl(*acl)
cmd = acl_cmd( *acl )
debug( cmd )
@@ -439,6 +452,14 @@ class FlexNBD
end
def paused
Process.kill( "STOP", @pid )
yield
ensure
Process.kill( "CONT", @pid )
end
protected
def control_command(*args)
raise "Server not running" unless @pid

View File

@@ -90,10 +90,14 @@ class TestSourceErrorHandling < Test::Unit::TestCase
end
def test_cancel_migration
run_fake( "dest/break_after_hello" )
end
private
def run_fake(name, opts = {})
@env.run_fake( name, @env.ip, @env.port2 )
@env.run_fake( name, @env.ip, @env.port2, @env.ip, @env.port2, @env.nbd1.ctrl )
stdout, stderr = @env.mirror12_unchecked
assert_success
assert_match( opts[:err], stderr ) if opts[:err]