// Test-only workload: sustained dirty writes plus a child that ignores TERM. use clap::{Parser, ValueEnum}; use std::{ fs::{self, File}, io::{Seek, SeekFrom, Write}, process::Command, }; unsafe extern "C" { fn signal(number: i32, handler: usize) -> usize; } #[derive(Parser)] #[command(about = "Write disposable DATA stress output")] struct Cli { role: Option, } #[derive(Clone, ValueEnum)] enum Role { Child, } fn main() { let cli = Cli::parse(); unsafe { signal(15, 1); } if matches!(cli.role, Some(Role::Child)) { loop { std::thread::park(); } } fs::write( "/data/process-status", fs::read("/proc/self/status").unwrap(), ) .unwrap(); let child = Command::new(std::env::current_exe().unwrap()) .arg("child") .spawn() .unwrap(); fs::write("/data/child-pid", child.id().to_string()).unwrap(); let mut file = File::create("/data/stress.bin").unwrap(); let buffer: Vec = (0..1024 * 1024).map(|i| (i % 256) as u8).collect(); let mut blocks = 0_u64; loop { if blocks % 64 == 0 { file.seek(SeekFrom::Start(0)).unwrap(); } if let Err(error) = file.write_all(&buffer) { eprintln!("write fault: {error}"); return; } blocks += 1; fs::write("/data/progress.next", blocks.to_string()).unwrap(); fs::rename("/data/progress.next", "/data/progress").unwrap(); } }