Skip to content

Commit

Permalink
virtio_fs_localfs_migration: Migrate localfs with different cache modes
Browse files Browse the repository at this point in the history
Signed-off-by: Zhenchao Liu <[email protected]>
  • Loading branch information
zhencliu committed Oct 29, 2024
1 parent d5093fb commit 7eb9f47
Show file tree
Hide file tree
Showing 2 changed files with 251 additions and 0 deletions.
82 changes: 82 additions & 0 deletions qemu/tests/cfg/virtio_fs_localfs_migration.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
- virtio_fs_localfs_migration:
no RHEL.6 RHEL.7 RHEL.8.0 RHEL.8.1
no Win2008 Win7

type = virtio_fs_localfs_migration
virt_test_type = qemu
required_qemu = [9.0.0,)
kill_vm = yes
start_vm = yes

filesystems = fs
filesystems_migration = targetfs
fs_driver = virtio-fs
fs_source_type = mount
fs_source_dir_fs = /var/tmp/virtio_fs_source/
fs_source_dir_targetfs = /var/tmp/virtio_fs_target/
fs_target = myfs
fs_dest = /mnt/${fs_target}
force_create_fs_source = no
remove_fs_source = no
fs_driver_props = {"queue-size": 1024}
fs_binary_extra_options = ''
driver_name = viofs

test_file = 'test_file'
test_data = 'hello_virtiofs'
pre_command = "mkdir -p ${fs_source_dir_fs} ${fs_source_dir_targetfs}"
pre_command += " && echo -e ${test_data} > ${fs_source_dir_fs}/${test_file}"
pre_command += " && echo -e ${test_data} > ${fs_source_dir_targetfs}/${test_file}"
post_command = "rm -rf ${fs_source_dir_fs} ${fs_source_dir_targetfs}"
read_file_cmd = "cat %s/${test_file}"

share_mem = yes
vm_mem_share = yes
vm_mem_backend = memory-backend-memfd
Win10.i386:
mem = 4096
!s390, s390x:
mem_devs = mem1
backend_mem_mem1 = memory-backend-memfd
size_mem1 = ${mem}M
use_mem_mem1 = no
guest_numa_nodes = shm0
numa_memdev_shm0 = mem-mem1
numa_nodeid_shm0 = 0
Windows:
# install winfsp tool
i386, i686:
install_winfsp_path = 'C:\Program Files'
devcon_dirname = 'x86'
x86_64:
install_winfsp_path = 'C:\Program Files (x86)'
devcon_dirname = 'amd64'
install_winfsp_cmd = 'msiexec /i WIN_UTILS:\winfsp.msi /qn'
check_installed_cmd = 'dir "%s" |findstr /I winfsp'
viofs_log_file = C:\viofs_log.txt
viofs_svc_name = VirtioFsSvc
viofs_exe_path = C:\virtiofs.exe
viofs_exe_copy_cmd = xcopy %s C:\ /Y
viofs_sc_create_cmd = 'sc create ${viofs_svc_name} binpath=${viofs_exe_path} start=auto'
viofs_sc_create_cmd += ' depend="WinFsp.Launcher/VirtioFsDrv" DisplayName="Virtio FS Service"'
viofs_sc_start_cmd = 'sc start ${viofs_svc_name}'
viofs_sc_query_cmd = 'sc query ${viofs_svc_name}'
viofs_sc_delete_cmd = 'sc delete ${viofs_svc_name}'
debug_log_operation = 'enable'
viofs_debug_enable_cmd = 'reg add HKLM\Software\VirtIO-FS /v DebugFlags /d 0xFFFFFFFF /t REG_DWORD'
viofs_log_enable_cmd = 'reg add HKLM\Software\VirtIO-FS /v DebugLogFile /d ${viofs_log_file} /t REG_SZ'
viofs_debug_delete_cmd = 'reg delete HKLM\Software\VirtIO-FS /v DebugFlags /f'
viofs_log_delete_cmd = 'reg delete HKLM\Software\VirtIO-FS /v DebugLogFile /f'
viofs_reg_query_cmd = 'reg query HKLM\Software\VirtIO-FS'
virtio_win_media_type = iso
cdroms += " virtio"
read_file_cmd = "type %s\${test_file}"
variants:
- cache_mode_auto:
fs_binary_extra_options += " --writeback --cache auto"
- cache_mode_always:
fs_binary_extra_options += " --writeback --cache always"
- cache_mode_never:
fs_binary_extra_options += " --allow-direct-io --cache never"
- cache_mode_metadata:
fs_binary_extra_options += " --cache metadata"
169 changes: 169 additions & 0 deletions qemu/tests/virtio_fs_localfs_migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
import re

from virttest import error_context, utils_disk, utils_misc, utils_test

from provider import virtio_fs_utils


@error_context.context_aware
def run(test, params, env):
"""
Basic migration test with diffirent cache modes over localfs
Steps:
1. Create shared directories on the host and write files
2. Run virtiofsd daemons on the host with different cache modes
3. Boot the source guest and mount the virtiofs targets in step1
4. Create different directories on the host and write files
5. Run virtiofsd daemons to share the directories in step4
6. Boot the target guest and mount the virtiofs targets in step4
7. Do migration from the source guest to target
8. No error occurs and the file content keeps the same
:param test: QEMU test object.
:param params: Dictionary with the test parameters.
:param env: Dictionary with test environment.
"""

def create_service(session):
if os_type == "windows":
driver_name = params["driver_name"]

session = utils_test.qemu.windrv_check_running_verifier(
session, vm, test, driver_name
)
viofs_svc_name = params["viofs_svc_name"]
virtio_fs_utils.create_viofs_service(
test, params, session, service=viofs_svc_name
)
return session

def delete_service(session):
if os_type == "windows":
virtio_fs_utils.delete_viofs_serivce(test, params, session)

def start_service(session):
def start_multifs_instance(fs_tag, fs_target, fs_volume_label):
"""
Only for windows and only for multiple shared directory.
"""
error_context.context(
"MultiFS-%s: Start virtiofs instance with"
" tag %s to %s." % (fs_tag, fs_target, fs_volume_label),
test.log.info,
)
instance_start_cmd = params["instance_start_cmd"]
output = session.cmd_output(
instance_start_cmd % (fs_target, fs_target, fs_volume_label)
)
if re.search("KO.*error", output, re.I):
test.fail(
"MultiFS-%s: Start virtiofs instance failed, "
"output is %s." % (fs_tag, output)
)

for fs in params.objects("filesystems"):
fs_params = params.object_params(fs)

fs_target = fs_params["fs_target"]
fs_dest = fs_params["fs_dest"]

if os_type == "linux":
error_context.context(
"Create a destination directory %s inside guest." % fs_dest,
test.log.info,
)
utils_misc.make_dirs(fs_dest, session)
error_context.context(
"Mount virtiofs target %s to %s inside"
" guest." % (fs_target, fs_dest),
test.log.info,
)
if not utils_disk.mount(
fs_target, fs_dest, "virtiofs", session=session
):
utils_misc.safe_rmdir(fs_dest, session=session)
test.fail("Mount virtiofs target failed.")
else:
if params.get("viofs_svc_name", "VirtioFsSvc") == "VirtioFsSvc":
error_context.context(
"Start virtiofs service in guest.", test.log.info
)
debug_log_operation = params.get("debug_log_operation")
if debug_log_operation:
session = virtio_fs_utils.operate_debug_log(
test, params, session, vm, debug_log_operation
)
virtio_fs_utils.start_viofs_service(test, params, session)
else:
error_context.context(
"Start winfsp.launcher instance in guest.", test.log.info
)
fs_volume_label = fs_params["volume_label"]
start_multifs_instance(fs, fs_target, fs_volume_label)

# get fs dest for vm
virtio_fs_disk_label = fs_target
error_context.context(
"Get Volume letter of virtio fs target, the disk"
"lable is %s." % virtio_fs_disk_label,
test.log.info,
)
vol_con = "VolumeName='%s'" % virtio_fs_disk_label
volume_letter = utils_misc.wait_for(
lambda: utils_misc.get_win_disk_vol(session, condition=vol_con),
params.get_numeric("cmd_timeout", 120),
)
if volume_letter is None:
test.fail("Could not get virtio-fs mounted volume letter.")
fs_dest = "%s:" % volume_letter

guest_mnts[fs_target] = fs_dest
return session

def stop_service(session):
if os_type == "linux":
for fs_target, fs_dest in guest_mnts.items():
utils_disk.umount(fs_target, fs_dest, "virtiofs", session=session)
utils_misc.safe_rmdir(fs_dest, session=session)
else:
if params["viofs_svc_name"] == "WinFSP.Launcher":
for fs_target in guest_mnts.keys():
error_context.context(
"Unmount fs with WinFsp.Launcher.z", test.log.info
)
instance_stop_cmd = params["instance_stop_cmd"]
session.cmd(instance_stop_cmd % fs_target)
else:
if guest_mnts:
virtio_fs_utils.stop_viofs_service(test, params, session)

def test_migration(session):
# FIXME: Replace the vm's params to use a different shared virtio fs
vm.params["filesystems"] = vm.params["filesystems_migration"]
vm.migrate()
session = vm.wait_for_login()

for fs_dest in guest_mnts.values():
out = session.cmd_output(params["read_file_cmd"] % fs_dest).strip()
test.log.debug("Read file after migration: %s", out)
if out != params["test_data"]:
test.fail(f"Wrong test data found: {out}")

return session

guest_mnts = dict()
os_type = params["os_type"]

vm = env.get_vm(params.get("main_vm"))
vm.verify_alive()
session = vm.wait_for_login()

try:
session = create_service(session)
session = start_service(session)
session = test_migration(session)
finally:
try:
stop_service(session)
finally:
delete_service(session)

0 comments on commit 7eb9f47

Please sign in to comment.