we are getting a test failure on arm64 in ubuntu mantic with rust-loopdev 0.4.0-3[1]
864s ---- detach_a_backing_file_default stdout ----
864s thread 'detach_a_backing_file_default' panicked at 'assertion failed: `(left == right)`
864s left: `0`,
864s right: `1`: there should be no loopback devices mounted', tests/integration_test.rs:176:5
I added some print statements, ran it in an arm64 vm (which has normally 3 loop devices used already) and it looks like the loop device count is changing under our feet:
---- detach_a_backing_file_with_offset stdout ----
XXX num_devices_at_start=4
XXX list_device(None).len()=4
XXX start list_device(None): [LoopDeviceOutput { name: "/dev/loop1", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/lxd_25116.snap") }, LoopDeviceOutput { name: "/dev/loop2", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/snapd_19459.snap") }, LoopDeviceOutput { name: "/dev/loop0", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/core22_821.snap") }], len=3, var=4
XXX end list_device(None): [LoopDeviceOutput { name: "/dev/loop1", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/lxd_25116.snap") }, LoopDeviceOutput { name: "/dev/loop2", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/snapd_19459.snap") }, LoopDeviceOutput { name: "/dev/loop0", size_limit: Some(0), offset: Some(0), back_file: Some("/var/lib/snapd/snaps/core22_821.snap") }], num_devices_at_start=4
thread 'detach_a_backing_file_with_offset' panicked at 'assertion failed: `(left == right)`
left: `3`,
right: `4`: there should be no loopback devices mounted', tests/integration_test.rs:180:5
fn detach_a_backing_file(offset: u64, sizelimit: u64, file_size: i64) {
let num_devices_at_start = list_device(None).len();
println!("XXX num_devices_at_start={}",num_devices_at_start);
println!("XXX list_device(None).len()={}", list_device(None).len());
let _lock = setup();
println!("XXX start list_device(None): {:?}, len={}, var={}", list_device(None), list_device(None).len(), num_devices_at_start);
{
let file = create_backing_file(file_size);
attach_file(
"/dev/loop3",
file.to_path_buf().to_str().unwrap(),
offset,
sizelimit,
);
let ld0 = LoopDevice::open("/dev/loop3")
.expect("should be able to open the created loopback device");
ld0.detach()
.expect("should not error detaching the backing file from the loopdev");
file.close().expect("should delete the temp backing file");
};
std::thread::sleep(std::time::Duration::from_millis(500));
println!("XXX end list_device(None): {:?}, num_devices_at_start={}", list_device(None), num_devices_at_start);
assert_eq!(
list_device(None).len(),
num_devices_at_start,
"there should be no loopback devices mounted"
);
detach_all();
}
I know this is not the latest version of rust-loopdev, and I checked the git log to see if anything could be a fix for this, but my rust knowledge is close to zero.
Here is a full test run showing the failure[2].
In my test vm, I have to run the tests multiple times (but not many) until I see the failure. It doesn't matter if it has one or two cpus.