diff --git a/testcases/mount/mount_stress.py b/testcases/mount/mount_stress.py new file mode 100644 index 0000000..f92a858 --- /dev/null +++ b/testcases/mount/mount_stress.py @@ -0,0 +1,57 @@ +import threading +import testhelper +import pathlib + + +def _perform_file_operations( + client_id: int, root_dir: str, num_operations: int, file_size: int +) -> None: + try: + for i in range(num_operations): + filename = f"testfile_{client_id}_{i}.txt" + file_content = testhelper.generate_random_bytes(file_size) + path = pathlib.Path(root_dir, filename) + path.write_bytes(file_content) + file_content_out = path.read_bytes() + + if file_content_out != file_content: + raise IOError("content mismatch") + + path.unlink() + except Exception as ex: + print(f"Error while stress testing with Client {client_id}: %s", ex) + raise + + +def _stress_test( + root_dir: str, num_clients: int, num_operations: int, file_size: int +) -> None: + threads = [] + + for i in range(num_clients): + thread = threading.Thread( + target=_perform_file_operations, + args=(i, root_dir, num_operations, file_size), + ) + threads.append(thread) + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + + print("Stress test complete.") + + +def check_mnt_stress(root_dir: str) -> None: + _stress_test(root_dir, num_clients=5, num_operations=20, file_size=2**22) + _stress_test( + root_dir, num_clients=10, num_operations=30, file_size=2**23 + ) + _stress_test( + root_dir, num_clients=20, num_operations=40, file_size=2**24 + ) + _stress_test( + root_dir, num_clients=15, num_operations=25, file_size=2**25 + ) diff --git a/testcases/mount/test_mount.py b/testcases/mount/test_mount.py index 75f0e11..5d95a4a 100755 --- a/testcases/mount/test_mount.py +++ b/testcases/mount/test_mount.py @@ -11,6 +11,7 @@ from .mount_io import check_io_consistency from .mount_dbm import check_dbm_consistency +from .mount_stress import check_mnt_stress test_info = os.getenv("TEST_INFO_FILE") test_info_dict = testhelper.read_yaml(test_info) @@ -29,6 +30,7 @@ def mount_check(ipaddr: str, share_name: str) -> None: os.mkdir(test_dir) check_io_consistency(test_dir) check_dbm_consistency(test_dir) + check_mnt_stress(test_dir) finally: if flag_mounted: shutil.rmtree(test_dir, ignore_errors=True)