systemd/test/units/testsuite-19.cleanup-slice.sh
Richard Phibel 8db998981a core: Don't GC unit if it is in cgroup_empty_queue
The gc_unit_queue is dispatched before the cgroup_empty_queue.  Because
of this, when we enter in on_cgroup_empty_event, the unit in
cgroup_empty_queue may already have been freed and we don't clean up the
corresponding cgroup. With this change, we prevent the unit from being
garbage collected if it is in the cgroup_empty_queue.
2023-05-29 13:26:15 +02:00

50 lines
1.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eux
set -o pipefail
# shellcheck source=test/units/util.sh
. "$(dirname "$0")"/util.sh
export SYSTEMD_LOG_LEVEL=debug
# Create service with KillMode=none inside a slice
cat <<EOF >/run/systemd/system/test19cleanup.service
[Unit]
Description=Test 19 cleanup Service
[Service]
Slice=test19cleanup.slice
Type=exec
ExecStart=sleep infinity
KillMode=none
EOF
cat <<EOF >/run/systemd/system/test19cleanup.slice
[Unit]
Description=Test 19 cleanup Slice
EOF
# Start service
systemctl start test19cleanup.service
assert_rc 0 systemd-cgls /test19cleanup.slice
pid=$(systemctl show --property MainPID --value test19cleanup)
ps "$pid"
# Stop slice
# The sleep process will not be killed because of KillMode=none
# Since there is still a process running under it, the /test19cleanup.slice cgroup won't be removed
systemctl stop test19cleanup.slice
ps "$pid"
# Kill sleep process manually
kill -s TERM "$pid"
while kill -0 "$pid" 2>/dev/null; do sleep 0.1; done
timeout 30 bash -c 'while systemd-cgls /test19cleanup.slice/test19cleanup.service >& /dev/null; do sleep .5; done'
assert_rc 1 systemd-cgls /test19cleanup.slice/test19cleanup.service
# Check that empty cgroup /test19cleanup.slice has been removed
timeout 30 bash -c 'while systemd-cgls /test19cleanup.slice >& /dev/null; do sleep .5; done'
assert_rc 1 systemd-cgls /test19cleanup.slice