Skip to content

Commit ceef984

Browse files
committed
tests: clean up loopback devices properly
If an error occurs during a test which sets up loopback devices, the loopback device is not freed. Since most systems have very conservative limits on the number of loopback devices, re-running a failing test locally to debug it often ends up erroring out due to loopback device exhaustion. So let's just move the "losetup -d" to teardown, where it belongs. Signed-off-by: Aleksa Sarai <[email protected]>
1 parent e20b2c7 commit ceef984

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

tests/integration/cgroups.bats

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ load helpers
44

55
function teardown() {
66
teardown_bundle
7+
teardown_loopdevs
78
}
89

910
function setup() {
@@ -153,13 +154,11 @@ function setup() {
153154
@test "runc run (per-device io weight for bfq)" {
154155
requires root # to create a loop device
155156

156-
dd if=/dev/zero of=backing.img bs=4096 count=1
157-
dev=$(losetup --find --show backing.img) || skip "unable to create a loop device"
157+
dev="$(setup_loopdev)"
158158

159159
# See if BFQ scheduler is available.
160160
if ! { grep -qw bfq "/sys/block/${dev#/dev/}/queue/scheduler" &&
161161
echo bfq >"/sys/block/${dev#/dev/}/queue/scheduler"; }; then
162-
losetup -d "$dev"
163162
skip "BFQ scheduler not available"
164163
fi
165164

@@ -198,9 +197,6 @@ function setup() {
198197
EOF
199198
weights2=$(get_cgroup_value $file)
200199

201-
# The loop device itself is no longer needed.
202-
losetup -d "$dev"
203-
204200
# Check original values.
205201
grep '^default 333$' <<<"$weights1"
206202
grep "^$major:$minor 444$" <<<"$weights1"
@@ -213,12 +209,8 @@ EOF
213209
@test "runc run (per-device multiple iops via unified)" {
214210
requires root cgroups_v2
215211

216-
dd if=/dev/zero of=backing1.img bs=4096 count=1
217-
dev1=$(losetup --find --show backing1.img) || skip "unable to create a loop device"
218-
219-
# Second device.
220-
dd if=/dev/zero of=backing2.img bs=4096 count=1
221-
dev2=$(losetup --find --show backing2.img) || skip "unable to create a loop device"
212+
dev1="$(setup_loopdev)"
213+
dev2="$(setup_loopdev)"
222214

223215
set_cgroups_path
224216

@@ -233,10 +225,6 @@ EOF
233225
runc run -d --console-socket "$CONSOLE_SOCKET" test_dev_weight
234226
[ "$status" -eq 0 ]
235227

236-
# The loop devices are no longer needed.
237-
losetup -d "$dev1"
238-
losetup -d "$dev2"
239-
240228
weights=$(get_cgroup_value "io.max")
241229
grep "^$major1:$minor1 .* riops=333 wiops=444$" <<<"$weights"
242230
grep "^$major2:$minor2 .* riops=555 wiops=666$" <<<"$weights"

tests/integration/helpers.bash

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,29 @@ function teardown_seccompagent() {
791791
rm -f "$SECCCOMP_AGENT_SOCKET"
792792
}
793793

794+
LOOPBACK_DEVICE_LIST="$(mktemp "$BATS_TMPDIR/losetup.XXXXXX")"
795+
796+
function setup_loopdev() {
797+
local backing dev
798+
backing="$(mktemp "$BATS_RUN_TMPDIR/backing.img.XXXXXX")"
799+
truncate --size=4K "$backing"
800+
801+
dev="$(losetup --find --show "$backing")" || skip "unable to create a loop device"
802+
echo "$dev" >>"$LOOPBACK_DEVICE_LIST"
803+
804+
unlink "$backing"
805+
echo "$dev"
806+
}
807+
808+
function teardown_loopdevs() {
809+
[ -s "$LOOPBACK_DEVICE_LIST" ] || return 0
810+
while IFS= read -r dev; do
811+
echo "losetup -d '$dev'" >&2
812+
losetup -d "$dev"
813+
done <"$LOOPBACK_DEVICE_LIST"
814+
truncate --size=0 "$LOOPBACK_DEVICE_LIST"
815+
}
816+
794817
function setup_bundle() {
795818
local image="$1"
796819

0 commit comments

Comments
 (0)