Skip to content

Commit 85204b4

Browse files
virtio_fs_rlimit_nofile: new case
1. Create a shared directory for testing on the host. 2. Touch 1024 files in the shared directory. 3. Start the virtiofsd daemon with rlimit-nofile and check. Signed-off-by: Tingting Mao <[email protected]>
1 parent 39966b3 commit 85204b4

File tree

2 files changed

+277
-0
lines changed

2 files changed

+277
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
- virtio_fs_rlimit_nofile:
2+
only Linux
3+
no RHEL.6 RHEL.7 RHEL.8.0 RHEL.8.1
4+
no Host_RHEL.m6 Host_RHEL.m7 Host_RHEL.m8.u0 Host_RHEL.m8.u1
5+
type = virtio_fs_rlimit_nofile
6+
required_virtiofsd_version = [1.13.2-1,)
7+
virtiofsd_version_cmd = rpm -q virtiofsd | cut -d- -f2
8+
Win10.i386:
9+
mem = 4096
10+
fs_source_dir = /var/tmp/virtiofs_rlimit_nofile
11+
force_create_fs_source = yes
12+
remove_fs_source = yes
13+
14+
pre_command = "cd ${fs_source_dir}"
15+
pre_command += " && for i in $(seq 1 1024); do touch file_$i.txt; done"
16+
virtiofs_socket_path = '/var/tmp/virtiofs_rlimit_nofile.sock'
17+
cmd_run_virtiofsd = '/usr/libexec/virtiofsd --socket-path ${virtiofs_socket_path} --shared-dir ${fs_source_dir}'
18+
19+
vm_mem_share = yes
20+
vm_mem_backend = memory-backend-file
21+
vm_mem_backend_path = /dev/shm
22+
share_mem = yes
23+
!s390, s390x:
24+
mem_devs = mem1
25+
backend_mem_mem1 = memory-backend-file
26+
mem-path_mem1 = /dev/shm
27+
size_mem1 = ${mem}M
28+
use_mem_mem1 = no
29+
guest_numa_nodes = shm0
30+
numa_memdev_shm0 = mem-mem1
31+
numa_nodeid_shm0 = 0
32+
Windows:
33+
# install winfsp tool
34+
i386, i686:
35+
install_winfsp_path = 'C:\Program Files'
36+
devcon_dirname = 'x86'
37+
x86_64:
38+
install_winfsp_path = 'C:\Program Files (x86)'
39+
devcon_dirname = 'amd64'
40+
install_winfsp_cmd = 'msiexec /i WIN_UTILS:\winfsp.msi /qn'
41+
check_installed_cmd = 'dir "%s" |findstr /I winfsp'
42+
viofs_log_file = C:\viofs_log.txt
43+
viofs_svc_name = VirtioFsSvc
44+
viofs_exe_path = C:\virtiofs.exe
45+
viofs_exe_copy_cmd = xcopy %s C:\ /Y
46+
viofs_sc_create_cmd = 'sc create ${viofs_svc_name} binpath=${viofs_exe_path} start=auto'
47+
viofs_sc_create_cmd += ' depend="WinFsp.Launcher/VirtioFsDrv" DisplayName="Virtio FS Service"'
48+
viofs_sc_start_cmd = 'sc start ${viofs_svc_name}'
49+
viofs_sc_query_cmd = 'sc query ${viofs_svc_name}'
50+
viofs_sc_delete_cmd = 'sc delete ${viofs_svc_name}'
51+
debug_log_operation = 'enable'
52+
viofs_debug_enable_cmd = 'reg add HKLM\Software\VirtIO-FS /v DebugFlags /d 0xFFFFFFFF /t REG_DWORD'
53+
viofs_log_enable_cmd = 'reg add HKLM\Software\VirtIO-FS /v DebugLogFile /d ${viofs_log_file} /t REG_SZ'
54+
viofs_debug_delete_cmd = 'reg delete HKLM\Software\VirtIO-FS /v DebugFlags /f'
55+
viofs_log_delete_cmd = 'reg delete HKLM\Software\VirtIO-FS /v DebugLogFile /f'
56+
viofs_reg_query_cmd = 'reg query HKLM\Software\VirtIO-FS'
57+
virtio_win_media_type = iso
58+
cdroms += " virtio"
59+
check_str = 'A device attached to the system is not functioning'
60+
list_file_cmd = "dir %s"
61+
variants:
62+
- rlimit_nofile_512:
63+
rlimit_nofile = 512
64+
cmd_run_virtiofsd += " --rlimit-nofile ${rlimit_nofile}"
65+
expected_msg = "Maximum number of file descriptors too small: Limit is 512, must be at least 610"
66+
- rlimit_nofile_610:
67+
rlimit_nofile = 610
68+
cmd_run_virtiofsd += " --rlimit-nofile ${rlimit_nofile}"
69+
expected_msg = "File descriptor count limit is very small, leaving only 0 file descriptors for the guest"
70+
- rlimit_nofile_1000:
71+
kill_vm = yes
72+
start_vm = yes
73+
filesystems = fs
74+
fs_driver = virtio-fs
75+
fs_source_type = mount
76+
fs_target = 'myfs'
77+
fs_driver_props = {"queue-size": 1024}
78+
fs_dest = '/mnt/${fs_target}'
79+
driver_name = viofs
80+
rlimit_nofile = 1000
81+
fs_binary_extra_options += " --rlimit-nofile ${rlimit_nofile}"
82+
list_file_cmd = "ls %s"
83+
ls_check_content = "Too many open files"
84+
qemu_check_content = "No more file descriptors available to the guest (0 available out of 390 initially), consider increasing the --rlimit-nofile value"
85+
- rlimit_nofile_2048:
86+
kill_vm = yes
87+
start_vm = yes
88+
filesystems = fs
89+
fs_driver = virtio-fs
90+
fs_source_type = mount
91+
fs_target = 'myfs'
92+
fs_driver_props = {"queue-size": 1024}
93+
fs_dest = '/mnt/${fs_target}'
94+
driver_name = viofs
95+
rlimit_nofile = 2048
96+
fs_binary_extra_options += " --rlimit-nofile ${rlimit_nofile}"
97+
list_file_cmd = "ls %s"

qemu/tests/virtio_fs_rlimit_nofile.py

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
import aexpect
2+
from avocado.utils import process
3+
from virttest import error_context, utils_disk, utils_misc, utils_test
4+
5+
from provider import virtio_fs_utils
6+
7+
8+
@error_context.context_aware
9+
def run(test, params, env):
10+
"""
11+
Test virtio-fs rlimit-nofile.
12+
Steps:
13+
1. Create a shared directory for testing on the host.
14+
2. Touch 1024 files in the shared directory.
15+
3. Start the virtiofsd daemon with rlimit-nofile and check.
16+
17+
:param test: QEMU test object.
18+
:param params: Dictionary with the test parameters.
19+
:param env: Dictionary with test environment.
20+
"""
21+
22+
def create_service(session):
23+
if os_type == "windows":
24+
error_context.context("Create virtiofs service in guest.", test.log.info)
25+
26+
driver_name = params["driver_name"]
27+
28+
session = utils_test.qemu.windrv_check_running_verifier(
29+
session, vm, test, driver_name
30+
)
31+
viofs_svc_name = params["viofs_svc_name"]
32+
virtio_fs_utils.create_viofs_service(
33+
test, params, session, service=viofs_svc_name
34+
)
35+
return session
36+
37+
def delete_service():
38+
if os_type == "windows":
39+
error_context.context("Delete virtiofs service in guest.", test.log.info)
40+
session = vm.wait_for_login()
41+
virtio_fs_utils.delete_viofs_serivce(test, params, session)
42+
session.close()
43+
44+
def start_service(session):
45+
fs = params["filesystems"]
46+
fs_params = params.object_params(fs)
47+
48+
fs_target = fs_params["fs_target"]
49+
fs_dest = fs_params["fs_dest"]
50+
51+
if os_type == "linux":
52+
utils_misc.make_dirs(fs_dest, session)
53+
error_context.context(
54+
"Mount virtiofs target %s to %s inside guest." % (fs_target, fs_dest),
55+
test.log.info,
56+
)
57+
if not utils_disk.mount(fs_target, fs_dest, "virtiofs", session=session):
58+
utils_misc.safe_rmdir(fs_dest, session=session)
59+
test.fail("Failed to mount virtiofs %s." % fs_target)
60+
else:
61+
error_context.context("Start virtiofs service in guest.", test.log.info)
62+
debug_log_operation = params.get("debug_log_operation")
63+
if debug_log_operation:
64+
session = virtio_fs_utils.operate_debug_log(
65+
test, params, session, vm, debug_log_operation
66+
)
67+
virtio_fs_utils.start_viofs_service(test, params, session)
68+
69+
fs_dest = "%s:" % virtio_fs_utils.get_virtiofs_driver_letter(
70+
test, fs_target, session
71+
)
72+
73+
guest_mnts[fs_target] = fs_dest
74+
return session
75+
76+
def stop_service(session):
77+
error_context.context("Stop virtiofs service in guest.", test.log.info)
78+
79+
if os_type == "linux":
80+
for fs_target, fs_dest in guest_mnts.items():
81+
utils_disk.umount(fs_target, fs_dest, "virtiofs", session=session)
82+
utils_misc.safe_rmdir(fs_dest, session=session)
83+
else:
84+
if guest_mnts:
85+
virtio_fs_utils.stop_viofs_service(test, params, session)
86+
session.close()
87+
88+
rlimit_nofile = params.get("rlimit_nofile")
89+
cmd_run_virtiofsd = params["cmd_run_virtiofsd"]
90+
guest_mnts = dict()
91+
os_type = params["os_type"]
92+
93+
if rlimit_nofile == "512":
94+
expected_msg = params["expected_msg"]
95+
error_context.context(
96+
"Starting virtiofsd with rlimit-nofile=%s" % rlimit_nofile, test.log.info
97+
)
98+
result = process.run(
99+
cmd_run_virtiofsd,
100+
shell=True,
101+
ignore_status=True,
102+
verbose=True,
103+
)
104+
# Prefer text-safe access for command output
105+
out = getattr(result, "stdout_text", None)
106+
if out is None:
107+
raw = getattr(result, "stdout", b"")
108+
out = raw.decode() if isinstance(raw, (bytes, bytearray)) else str(raw)
109+
status = result.exit_status
110+
if status == 0:
111+
test.fail(
112+
"virtiofsd unexpectedly started successfully with rlimit-nofile=512"
113+
)
114+
elif expected_msg not in out:
115+
test.fail("virtiofsd failed but without expected message. Output: %s" % out)
116+
error_context.context(
117+
"virtiofsd failed as expected with the required message present",
118+
test.log.info,
119+
)
120+
elif rlimit_nofile == "610":
121+
expected_msg = params["expected_msg"]
122+
error_context.context(
123+
"Starting virtiofsd with rlimit-nofile=%s" % rlimit_nofile, test.log.info
124+
)
125+
session = aexpect.ShellSession(
126+
cmd_run_virtiofsd,
127+
auto_close=False,
128+
output_func=utils_misc.log_line,
129+
output_params=("virtiofs_fs-virtiofs.log",),
130+
prompt=r"^\[.*\][\#\$]\s*$",
131+
)
132+
try:
133+
session.expect(expected_msg, timeout=10)
134+
test.log.info(
135+
"virtiofsd started successfully with the required message present"
136+
)
137+
except aexpect.ExpectTimeout as e:
138+
test.fail("Timeout for virtiofsd start with rlimit-nofile=610: %s" % e)
139+
finally:
140+
session.close()
141+
elif rlimit_nofile == "1000":
142+
error_context.context(
143+
"Starting virtiofsd with rlimit-nofile=%s" % rlimit_nofile, test.log.info
144+
)
145+
vm = env.get_vm(params.get("main_vm"))
146+
vm.verify_alive()
147+
session = vm.wait_for_login()
148+
try:
149+
session = create_service(session)
150+
session = start_service(session)
151+
for fs_dest in guest_mnts.values():
152+
out = session.cmd_output(params["list_file_cmd"] % fs_dest).strip()
153+
test.log.debug("The dir output in guest: %s", out)
154+
if params["ls_check_content"] not in out:
155+
test.fail("Wrong content found: %s" % out)
156+
qemu_out = vm.process.get_output()
157+
if params["qemu_check_content"] not in qemu_out:
158+
test.fail("Wrong qemu content found: %s" % qemu_out)
159+
finally:
160+
stop_service(session)
161+
delete_service()
162+
elif rlimit_nofile == "2048":
163+
error_context.context(
164+
"Starting virtiofsd with rlimit-nofile=%s" % rlimit_nofile, test.log.info
165+
)
166+
vm = env.get_vm(params.get("main_vm"))
167+
vm.verify_alive()
168+
session = vm.wait_for_login()
169+
try:
170+
session = create_service(session)
171+
session = start_service(session)
172+
for fs_dest in guest_mnts.values():
173+
cmd = params["list_file_cmd"] % fs_dest
174+
status, output = session.cmd_status_output(cmd)
175+
output = output.strip()
176+
if status != 0:
177+
test.fail("list failed: %s" % output)
178+
finally:
179+
stop_service(session)
180+
delete_service()

0 commit comments

Comments
 (0)