Skip to content

Commit 9e8d647

Browse files
tmt: Treat VM creation as critical section
Use a Mutex guard for VM creation as CI sometimes is failing with ``` Error: 0: Failed to create libvirt domain 1: Failed to start libvirt domain: error: Failed to start domain 'bootc-..' error: failed to create directory '/run/user/1001/libvirt/qemu/run/swtpm': File exists ``` Signed-off-by: Pragyan Poudyal <pragyanpoudyal41999@gmail.com>
1 parent cedbd85 commit 9e8d647

1 file changed

Lines changed: 17 additions & 1 deletion

File tree

crates/xtask/src/tmt.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::sync::mpsc;
1+
use std::sync::{Arc, Mutex, mpsc};
22
use std::time::Duration;
33
use std::usize;
44

@@ -380,6 +380,7 @@ fn run_plan(
380380
preserve_vm: bool,
381381
vm_cpu: String,
382382
vm_mem_mb: String,
383+
libvirt_lock: Arc<Mutex<()>>,
383384
) -> RunPlanResult {
384385
let sh = match Shell::new() {
385386
Ok(sh) => sh,
@@ -391,13 +392,24 @@ fn run_plan(
391392

392393
// Launch VM with bcvk
393394
let firmware_args_slice = firmware_args.as_slice();
395+
396+
let guard = match libvirt_lock.lock() {
397+
Ok(g) => g,
398+
Err(e) => {
399+
eprintln!("Mutex lock failed for plan {plan}: {e:#}");
400+
return RunPlanResult::new(plan, false, None, None);
401+
}
402+
};
403+
394404
let launch_result = cmd!(
395405
sh,
396406
"bcvk libvirt run --name {vm_name} --memory {vm_mem_mb} --cpus {vm_cpu} --detach {firmware_args_slice...} {COMMON_INST_ARGS...} {plan_bcvk_opts...} {image}"
397407
)
398408
.run()
399409
.context("Launching VM with bcvk");
400410

411+
drop(guard);
412+
401413
if let Err(e) = launch_result {
402414
eprintln!("Failed to launch VM for plan {}: {:#}", plan, e);
403415
return RunPlanResult::new(plan, false, None, None);
@@ -755,6 +767,8 @@ pub(crate) fn run_tmt(sh: &Shell, args: &RunTmtArgs) -> Result<()> {
755767

756768
let (tx, rx) = mpsc::channel::<RunPlanResult>();
757769

770+
let libvirt_lock = Arc::new(Mutex::new(()));
771+
758772
// Run each plan in its own VM
759773
for plan in plans {
760774
let plan_name = sanitize_plan_name(plan);
@@ -812,6 +826,7 @@ pub(crate) fn run_tmt(sh: &Shell, args: &RunTmtArgs) -> Result<()> {
812826
let image = image.to_string();
813827
let vm_mem = vm_mem.to_string();
814828
let vm_cpu = vm_cpu.to_string();
829+
let libvirt_lock = libvirt_lock.clone();
815830

816831
let tx_clone = tx.clone();
817832
std::thread::spawn(move || {
@@ -827,6 +842,7 @@ pub(crate) fn run_tmt(sh: &Shell, args: &RunTmtArgs) -> Result<()> {
827842
preserve_vm,
828843
vm_cpu,
829844
vm_mem,
845+
libvirt_lock,
830846
);
831847

832848
if let Err(e) = tx_clone.send(result) {

0 commit comments

Comments
 (0)