Add the write-during-migration test to the acceptance test run
This commit is contained in:
@@ -1,124 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
require 'rubygems'
|
||||
require 'flexnbd/fake_source'
|
||||
require 'socket'
|
||||
require 'fileutils'
|
||||
|
||||
|
||||
FLEXNBD = ARGV.shift
|
||||
raise "No binary!" unless File.executable?( FLEXNBD )
|
||||
raise "No trickle!" unless system "which trickle > /dev/null"
|
||||
|
||||
Thread.abort_on_exception = true
|
||||
|
||||
|
||||
#BREAKIT = false
|
||||
BREAKIT = true
|
||||
|
||||
MB = 1024*1024
|
||||
GB = 1024*MB
|
||||
SIZE = 20*MB
|
||||
WRITE_DATA = "foo!" * 2048 # 8K write
|
||||
SOURCE_PORT = 9990
|
||||
DEST_PORT = 9991
|
||||
SOURCE_SOCK = "src.sock"
|
||||
DEST_SOCK = "dst.sock"
|
||||
SOURCE_FILE = "src.file"
|
||||
DEST_FILE = "dst.file"
|
||||
|
||||
puts "Cleaning up from old runs..."
|
||||
FileUtils.rm_f "src*"
|
||||
FileUtils.rm_f "dst*"
|
||||
|
||||
puts "Creating source & destination files..."
|
||||
FileUtils.touch(SOURCE_FILE)
|
||||
File.truncate(SOURCE_FILE, SIZE)
|
||||
FileUtils.touch(DEST_FILE)
|
||||
File.truncate(DEST_FILE, SIZE)
|
||||
|
||||
puts "Making source data"
|
||||
File.open(SOURCE_FILE, "wb"){|f| f.write "a"*SIZE }
|
||||
#Kernel.system "dd if=/dev/urandom of=#{SOURCE_FILE} bs=#{SIZE} count=1"
|
||||
|
||||
puts "Starting destination process..."
|
||||
dst_proc = fork() {
|
||||
cmd = "#{FLEXNBD} listen -l 127.0.0.1 -p #{DEST_PORT} -f #{DEST_FILE} -s #{DEST_SOCK} -v"
|
||||
exec cmd
|
||||
}
|
||||
|
||||
puts "Starting source process..."
|
||||
src_proc = fork() {
|
||||
cmd = "#{FLEXNBD} serve -l 127.0.0.1 -p #{SOURCE_PORT} -f #{SOURCE_FILE} -s #{SOURCE_SOCK} -v"
|
||||
#exec "trickle -t 1 -u 5120 -s #{cmd}"
|
||||
exec cmd
|
||||
}
|
||||
|
||||
puts "dst_proc is #{dst_proc}"
|
||||
puts "src_proc is #{src_proc}"
|
||||
|
||||
|
||||
at_exit {
|
||||
[dst_proc, src_proc].each do |pid|
|
||||
Process.kill( "KILL", pid ) rescue nil
|
||||
end
|
||||
[SOURCE_FILE, DEST_FILE, SOURCE_SOCK, DEST_SOCK].each do |filename|
|
||||
FileUtils.rm_f filename
|
||||
end
|
||||
}
|
||||
|
||||
|
||||
|
||||
puts "Sleeping to let flexnbds run..."
|
||||
Timeout.timeout(10) do
|
||||
sleep 0.1 while !File.exists?( SOURCE_SOCK )
|
||||
puts "Got source sock"
|
||||
sleep 0.1 while !File.exists?( DEST_SOCK )
|
||||
puts "Got dest sock"
|
||||
end
|
||||
|
||||
|
||||
if BREAKIT
|
||||
# Start writing to the source
|
||||
puts "Creating thread to write to the source..."
|
||||
|
||||
src_writer = Thread.new do
|
||||
client = FlexNBD::FakeSource.new( "127.0.0.1", SOURCE_PORT, "Timed out connecting" )
|
||||
loop do
|
||||
begin
|
||||
client.write(0, WRITE_DATA)
|
||||
rescue => err
|
||||
puts "Writer encountered #{err.inspect} writing to source"
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
puts "Starting mirroring process..."
|
||||
UNIXSocket.open(SOURCE_SOCK) {|sock|
|
||||
sock.write(["mirror", "127.0.0.1", DEST_PORT.to_s, "unlink"].join("\x0A") + "\x0A\x0A")
|
||||
sock.flush
|
||||
rsp = sock.readline
|
||||
puts "Response: #{rsp}"
|
||||
}
|
||||
|
||||
# tell serve to migrate to the listen one
|
||||
|
||||
Timeout.timeout( 10 ) do
|
||||
start_time = Time.now
|
||||
puts "Waiting for destination #{dst_proc} to exit..."
|
||||
dst_result = Process::waitpid2(dst_proc)
|
||||
puts "destination exited: #{dst_result.inspect}"
|
||||
|
||||
puts "Waiting for source to exit..."
|
||||
src_result = Process::waitpid2(src_proc)
|
||||
puts "Source exited after #{Time.now - start_time} seconds: #{src_result.inspect}"
|
||||
end
|
||||
|
||||
|
||||
if BREAKIT
|
||||
puts "Waiting for writer to die..."
|
||||
src_writer.join
|
||||
puts "Writer has died"
|
||||
end
|
||||
|
@@ -17,8 +17,8 @@ class Environment
|
||||
@rebind_port1 = @available_ports.shift
|
||||
@port2 = @available_ports.shift
|
||||
@rebind_port2 = @available_ports.shift
|
||||
@nbd1 = FlexNBD.new("../../build/flexnbd", @ip, @port1)
|
||||
@nbd2 = FlexNBD.new("../../build/flexnbd", @ip, @port2)
|
||||
@nbd1 = FlexNBD::FlexNBD.new("../../build/flexnbd", @ip, @port1)
|
||||
@nbd2 = FlexNBD::FlexNBD.new("../../build/flexnbd", @ip, @port2)
|
||||
|
||||
@fake_pid = nil
|
||||
end
|
||||
|
@@ -163,6 +163,7 @@ class ValgrindKillingExecutor
|
||||
end # class ValgrindExecutor
|
||||
|
||||
|
||||
module FlexNBD
|
||||
# Noddy test class to exercise FlexNBD from the outside for testing.
|
||||
#
|
||||
class FlexNBD
|
||||
@@ -513,3 +514,4 @@ class FlexNBD
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
128
tests/acceptance/test_write_during_migration.rb
Executable file
128
tests/acceptance/test_write_during_migration.rb
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'test/unit'
|
||||
require 'flexnbd/fake_source'
|
||||
require 'socket'
|
||||
require 'fileutils'
|
||||
require 'tmpdir'
|
||||
|
||||
Thread.abort_on_exception = true
|
||||
|
||||
class TestWriteDuringMigration < Test::Unit::TestCase
|
||||
|
||||
def setup
|
||||
@flexnbd = File.expand_path("../../build/flexnbd")
|
||||
|
||||
raise "No binary!" unless File.executable?( @flexnbd )
|
||||
raise "No trickle!" unless system "which trickle > /dev/null"
|
||||
|
||||
|
||||
@size = 20*1024*1024 # 20MB
|
||||
@write_data = "foo!" * 2048 # 8K write
|
||||
@source_port = 9990
|
||||
@dest_port = 9991
|
||||
@source_sock = "src.sock"
|
||||
@dest_sock = "dst.sock"
|
||||
@source_file = "src.file"
|
||||
@dest_file = "dst.file"
|
||||
end
|
||||
|
||||
|
||||
def teardown
|
||||
[@dst_proc, @src_proc].each do |pid|
|
||||
if pid
|
||||
Process.kill( "KILL", pid ) rescue nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def launch_servers
|
||||
@dst_proc = fork() {
|
||||
cmd = "#{@flexnbd} listen -l 127.0.0.1 -p #{@dest_port} -f #{@dest_file} -s #{@dest_sock}"
|
||||
exec cmd
|
||||
}
|
||||
|
||||
@src_proc = fork() {
|
||||
cmd = "#{@flexnbd} serve -l 127.0.0.1 -p #{@source_port} -f #{@source_file} -s #{@source_sock}"
|
||||
exec cmd
|
||||
}
|
||||
begin
|
||||
awaiting = nil
|
||||
Timeout.timeout(10) do
|
||||
awaiting = :source
|
||||
sleep 0.1 while !File.exists?( @source_sock )
|
||||
awaiting = :dest
|
||||
sleep 0.1 while !File.exists?( @dest_sock )
|
||||
end
|
||||
rescue Timeout::Error
|
||||
case awaiting
|
||||
when :source
|
||||
fail "Couldn't get a source socket."
|
||||
when :dest
|
||||
fail "Couldn't get a destination socket."
|
||||
else
|
||||
fail "Something went wrong I don't understand."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def make_files()
|
||||
FileUtils.touch(@source_file)
|
||||
File.truncate(@source_file, @size)
|
||||
FileUtils.touch(@dest_file)
|
||||
File.truncate(@dest_file, @size)
|
||||
|
||||
File.open(@source_file, "wb"){|f| f.write "a"*@size }
|
||||
end
|
||||
|
||||
|
||||
def start_mirror
|
||||
UNIXSocket.open(@source_sock) {|sock|
|
||||
sock.write(["mirror", "127.0.0.1", @dest_port.to_s, "unlink"].join("\x0A") + "\x0A\x0A")
|
||||
sock.flush
|
||||
rsp = sock.readline
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
def wait_for_quit()
|
||||
Timeout.timeout( 10 ) do
|
||||
start_time = Time.now
|
||||
dst_result = Process::waitpid2(@dst_proc)
|
||||
src_result = Process::waitpid2(@src_proc)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
def test_write_during_migration
|
||||
|
||||
Dir.mktmpdir() do |tmpdir|
|
||||
Dir.chdir( tmpdir ) do
|
||||
make_files()
|
||||
|
||||
launch_servers()
|
||||
|
||||
src_writer = Thread.new do
|
||||
client = FlexNBD::FakeSource.new( "127.0.0.1", @source_port, "Timed out connecting" )
|
||||
loop do
|
||||
begin
|
||||
client.write(0, @write_data)
|
||||
rescue => err
|
||||
# We expect a broken write at some point, so ignore it
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
start_mirror()
|
||||
wait_for_quit()
|
||||
src_writer.join
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
@@ -29,7 +29,7 @@ end
|
||||
|
||||
@local = File.open(testname_local, "r+")
|
||||
|
||||
@serve = FlexNBD.new(binary, "127.0.0.1", 41234)
|
||||
@serve = FlexNBD::FlexNBD.new(binary, "127.0.0.1", 41234)
|
||||
@serve.serve(testname_serve)
|
||||
|
||||
$record = []
|
||||
|
Reference in New Issue
Block a user